📄 nand.c
字号:
#include "stdio.h"
#include "ccblkfn.h"
#include "sysreg.h"
#include "bf5xx.h"
#include "CPLD.h"
unsigned char Test_Data_Table[];
void Init_TEST_DATA_BUFFER(void)
{
int i;
for(i = 0;i<512;i++)
{
Test_Data_Table[i] = i;
}
}
/****************************************************************************
* 名称 : Wait_NAND_RADY
* 功能 : 判断NANDFLASH 忙状态
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
bool Wait_NAND_RADY(void)
{
while(!(*pFIO2_FLAG_D & NAND_RDY));
}
/****************************************************************************
* 名称 : Write_NAND_FLASH
* 功能 : 将数据送入NANDFLASH
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Write_NAND_FLASH(unsigned char Write_Data)
{
*pNAND_BaseaAddr = Write_Data;
udelay(10);
}
/****************************************************************************
* 名称 : NAND_Finish
* 功能 : 关闭控制线
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void NAND_Finish(void)
{
Set_CE(1);
Set_CLE(0);
Set_ALE(0);
}
/****************************************************************************
* 名称 : Write_Command
* 功能 : NANDFLASH写命令
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Write_Command(unsigned char command)
{
Set_CE(0);
Set_CLE(1);
if(command == 0x10)
{
Write_NAND_FLASH(command);
}
else
{
Write_NAND_FLASH(command);
Set_CLE(0);
}
}
/****************************************************************************
* 名称 : Reset_NAND
* 功能 : 复位NANDFLASH
* 入口参数 :无
* 出口参数 :无
****************************************************************************/
void Reset_NAND(void)
{
Write_Command(0xff);
Wait_NAND_RADY();
NAND_Finish();
}
/****************************************************************************
* 名称 : Read_Chip_ID
* 功能 : 读取芯片ID
* 入口参数 :无
* 出口参数 :正确返回true,错误返回false
****************************************************************************/
bool Read_Chip_ID(void)
{
unsigned char Chip_ID0 ;
unsigned char Chip_ID1 ;
Write_Command(0x90);
Set_ALE(1);
Write_NAND_FLASH(0x00);
Set_ALE(0);
udelay(10);
Chip_ID0 = *pNAND_BaseaAddr;
udelay(10);
Chip_ID1 = *pNAND_BaseaAddr;
udelay(10);
NAND_Finish();
printf("ID is %x%x\n\r",Chip_ID0,Chip_ID1);
if(Chip_ID0 != 0xec) //Maker code
{
return false;
}
else if(Chip_ID1 != 0x76) //Device code
{
return false;
}
else
{
printf("Read ID Test is OK!\n\r");
return true;
}
}
/****************************************************************************
* 名称 : write_page
* 功能 : 将Buffer中的数据写入地址Page_Address
* 入口参数 :Page_Address,Buffer
* 出口参数 :完成返回true,失败返回false
****************************************************************************/
bool write_page(unsigned int Page_Address,unsigned char *Buffer)
{
int i;
unsigned char NAND_Data;
Write_Command(0x80);
Set_ALE(1);
Write_NAND_FLASH(0x00);
Write_NAND_FLASH(Page_Address);
Write_NAND_FLASH((Page_Address>>8)&0xff);
Write_NAND_FLASH((Page_Address>>16)&0xff);
Set_ALE(0);
Wait_NAND_RADY();
for(i = 0;i<512;i++)
{
*pNAND_BaseaAddr = Buffer[i];
udelay(10);
}
Write_Command(0x10);
Wait_NAND_RADY();
Write_Command(0x70);
NAND_Data = *pNAND_BaseaAddr;
NAND_Finish();
if(NAND_Data != 0xc0)
{
return false;
}
else
{
return true;
}
}
/****************************************************************************
* 名称 : read_page
* 功能 : 读取页地址Page_Address的数据512字节,存入Buffer
* 入口参数 :Page_Address,Buffer
* 出口参数 :无
****************************************************************************/
bool read_page(unsigned int Page_Address,unsigned char *Buffer)
{
int i;
Write_Command(0x00);
Set_ALE(1);
Write_NAND_FLASH(0x00);
Write_NAND_FLASH(Page_Address);
Write_NAND_FLASH((Page_Address>>8)&0xff);
Write_NAND_FLASH((Page_Address>>16)&0xff);
Set_ALE(0);
Wait_NAND_RADY();
for(i = 0;i<512;i++)
{
Buffer[i] = *pNAND_BaseaAddr;
udelay(10);
}
NAND_Finish();
}
/****************************************************************************
* 名称 : Block_Erase
* 功能 : 将块地址Block_Address的块数据擦除。可通过页地址除以32得到块地址
* 入口参数 :Block_Address
* 出口参数 :无
****************************************************************************/
bool Block_Erase(unsigned int Block_Address)
{
unsigned char NAND_Data = 0;
Set_CE(0);
Write_Command(0x60);
Set_ALE(1);
Write_NAND_FLASH((Block_Address<<5)&0xff);
Write_NAND_FLASH((Block_Address>>3)&0xff);
Write_NAND_FLASH((Block_Address>>11)&0xff);
Set_ALE(0);
Write_Command(0xd0);
Wait_NAND_RADY();
Write_Command(0x70);
NAND_Data = *pNAND_BaseaAddr;
NAND_Finish();
if(NAND_Data&0x1 != 0)
{
return false;
}
else
{
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -