Nand Flash型號 : K9F2G08U0A
## 1、以頁方式讀取Nand Flash中的數據
①選中Nand Flash芯片;
②清除RnB;
③發送命令0x00;
④發送列地址(列地址兩個周期,行地址三個周期);
⑤發送行地址(頁號);
⑥發送命令0x30;
⑦等待RnB;
⑧讀取RnB;
⑨取消選中Nand Flash芯片;

## 2、以頁方式向Nand Flash中寫入數據
①選中Nand Flash芯片;
②清除RnB;
③發送命令0x80;
④發送列地址;發送行地址;
⑤向Nand Flash寫入數據;
⑥發送命令0x10;
⑦等待RnB;
⑧發送命令0x70;
⑨讀取寫入狀態;
⑩取消選中Nand Flash;

## 3、塊擦除操作
①選中Nand Flash芯片;
②清除RnB;
③發送命令0x60;
④發送行地址;
⑤發送命令0xD0;
⑥等待RnB;
⑦讀取擦除狀態;
⑧取消選中Nand Flash;

## 4、K9F2G08U0A的陣列組織(即內部組成結構)

## 5、在srart.S中,需要調用Nand_Init函數對Nand Flash進行初始化,然后調用Nand_To_Ram函數將Nand Flash中的數據復制到SDRAM中。
~~~
/*******************************************************************
*版權所有(C)2015,ZJU
*
*文件名稱:nand.c
*內容摘要:關于NAND flash的配置
*其它說明:NAND flash型號: K9F2G08U0B
* 開發板型號: TX2440
*當前版本:V1.0
*作 者:Frank
*完成日期:2015.12.12
*
*******************************************************************/
#define NFCONF (*(volatile unsigned long *)0x4E000000) //NAND flash configuration register
#define NFCONT (*(volatile unsigned long *)0x4E000004) //NAND flash control register
#define NFCMMD (*(volatile unsigned char *)0x4E000008) //NAND flash command set register
#define NFADDR (*(volatile unsigned char *)0x4E00000C) //NAND flash address register
#define NFDATA (*(volatile unsigned char *)0x4E000010) //NAND flash data register
#define NFSTAT (*(volatile unsigned char *)0x4E000020) //NAND flash operation status register
#define TACLS 1
#define TWRPH0 2
#define TWRPH1 1
/*******************************************************************
*函數名稱:Select_Chip()
*功能描述:NAND flash使能函數
*其他說明:選中NAND flash(片選使能)
*創建日期:2015.12.12
*******************************************************************/
void Select_Chip(void)
{
NFCONT &= ~(1 << 1);
}
/*******************************************************************
*函數名稱:Deselect_Chip()
*功能描述:NAND flash禁止函數
*其他說明:取消選中NAND flash(片選禁止)
*創建日期:2015.12.12
*******************************************************************/
void Deselect_Chip(void)
{
NFCONT |= (1 << 1);
}
/*******************************************************************
*函數名稱:Wait_RnB()
*功能描述:等待RnB
*其他說明:RnB為1時表示響應了
*創建日期:2015.12.12
*******************************************************************/
void Wait_RnB(void)
{
while (!(NFSTAT & (1 << 2)));
}
/*******************************************************************
*函數名稱:Clear_RnB()
*功能描述:清除RnB
*其他說明:
*創建日期:2015.12.12
*******************************************************************/
void Clear_RnB(void)
{
NFSTAT |= (1 << 2);
}
/*******************************************************************
*函數名稱:Send_Cmd(unsigned char cmd)
*功能描述:NAND flash命令發送
*輸入參數:cmd
*返 回 值:無
*其他說明:cmd為向NAND flash發送的命令字符
*創建日期:2015.12.12
*******************************************************************/
void Send_Cmd(unsigned char cmd)
{
NFCMMD = cmd;
}
/*******************************************************************
*函數名稱:Send_Addr(unsigned char addr)
*功能描述:NAND flash地址發送函數
*輸入參數:addr
*返 回 值:無
*其他說明:addr為8位地址
*創建日期:2015.12.12
*******************************************************************/
void Send_Addr(unsigned char addr)
{
NFADDR = addr;
}
/*******************************************************************
*函數名稱:NF_PageRead(unsigned long addr, unsigned char * buff)
*功能描述:讀取NAND flash中整頁的內容
*輸入參數:addr, *buff
*返 回 值:無
*其他說明:addr為所讀取頁的行地址,buff寄存器存儲讀取的NF中的內容
*創建日期:2015.12.12
*******************************************************************/
void NF_PageRead(unsigned long addr, unsigned char * buff)
{
int i = 0;
Select_Chip(); //選中NAND flash芯片
Clear_RnB(); //清除RnB
Send_Cmd(0x00); //發送命令0x00
Send_Addr(0x00); //發送列地址(列地址兩個周期,行地址三個周期)
Send_Addr(0x00);
Send_Addr(addr & 0xff); //發送行地址(頁號)
Send_Addr((addr >> 8) & 0xff);
Send_Addr((addr >> 16) & 0xff);
Send_Cmd(0x30); //發送命令0x30
Wait_RnB(); //等待RnB
for (i=0; i<2048; ++i) //讀取數據
{
buff[i] = NFDATA;
}
Deselect_Chip(); //取消選中NAND flash芯片
}
/*******************************************************************
*函數名稱:NF_PageWrite(unsigned long addr, unsigned char * buff)
*功能描述:以頁的方式向NAND flash中寫入數據
*輸入參數:addr, *buff
*返 回 值:ret
*其他說明:addr為所寫頁的行地址,buff寄存器為向NF中寫入的內容
*創建日期:2015.12.13
*******************************************************************/
int NF_PageWrite(unsigned long addr, unsigned char * buff)
{
int ret ;
int i = 0;
Select_Chip(); //選中NAND flash芯片
Clear_RnB(); //清除RnB
Send_Cmd(0x80); //發送命令0x80
Send_Addr(0x00); //發送列地址
Send_Addr(0x00);
Send_Addr(addr & 0xff); //發送行地址
Send_Addr((addr >> 8) & 0xff);
Send_Addr((addr >> 16) & 0xff);
for (i=0; i<2048; ++i) //向NAND flash寫入數據
{
NFDATA = buff[i];
}
Send_Cmd(0x10); //發送命令0x10
Wait_RnB(); //等待RnB
Send_Cmd(0x70); //發送命令0x70
ret = NFDATA; //讀取寫入狀態
Deselect_Chip(); //取消選中NAND flash
return ret;
}
/*******************************************************************
*函數名稱:NF_Erase(unsigned long addr)
*功能描述:整塊擦除NAND flash
*輸入參數:addr
*返 回 值:ret
*其他說明:addr為所擦除頁的行地址,ret為擦除狀態返回值
*創建日期:2015.12.13
*******************************************************************/
int NF_Erase(unsigned long addr)
{
int ret;
Select_Chip(); //選中NAND flash芯片
Clear_RnB(); //清除RnB
Send_Cmd(0x60); //發送命令0x60
Send_Addr(addr & 0xff); //發送行地址
Send_Addr((addr >> 8) & 0xff);
Send_Addr((addr >> 16) & 0xff);
Send_Cmd(0xD0); //發送命令0xD0
Wait_RnB(); //等待RnB
Send_Cmd(0x70); //發送命令0x70
ret = NFDATA; //讀取擦除狀態
Deselect_Chip(); //取消選中NAND flash芯片
return ret;
}
/*******************************************************************
*函數名稱:Nand_Reset()
*功能描述:復位NAND flash
*其他說明:
*創建日期:2015.12.12
*******************************************************************/
void Nand_Reset(void)
{
Select_Chip(); //選中NAND flash
Clear_RnB(); //清除RnB
Send_Cmd(0xff); //發送0xff命令
Wait_RnB(); //等待RnB
Deselect_Chip(); //取消選中NAND flash
}
/*******************************************************************
*函數名稱:Nand_Init()
*功能描述:初始化NAND flash
*其他說明:
*創建日期:2015.12.12
*******************************************************************/
void Nand_Init(void)
{
NFCONF = ((TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4)); //初始化NFCONF
NFCONT = ((1 << 0) | (1 << 1)); //初始化NFCONT
Nand_Reset(); //復位
}
/*******************************************************************
*函數名稱:Nand_To_Ram(unsigned long , unsigned char * , int)
*功能描述:讀取NAND flash中整頁的內容
*輸入參數:start_addr, * sdram_addr, size
*返 回 值:無
*其他說明:addr為所讀取頁的行地址,buff寄存器存儲讀取的NF中的內容
*創建日期:2015.12.12
*******************************************************************/
void Nand_To_Ram(unsigned long start_addr, unsigned char * sdram_addr, int size)
{
int i = 0;
for (i=(start_addr>>11); size>0; ) //采用的是按頁拷貝的方式,不需要列地址,只保留行地址
{
NF_PageRead(i, sdram_addr);
size -= 2048;
sdram_addr += 2048;
i++;
}
}
~~~