NAND Flash的驅(qū)動程序設計方案
圖2 NAND Flash與S3C2410連接電路
2 Flash燒寫程序原理及結(jié)構(gòu)
基本原理:將在SDRAM中的一段存儲區(qū)域中的數(shù)據(jù)寫到NAND Flash存儲空間中。燒寫程序在縱向上分三層完成。第一層: 主燒寫函數(shù),將SDRAM中一段存儲區(qū)域的數(shù)據(jù)寫到NAND Flash存儲空間中。第二層: 該層提供對NAND Flash進行操作的頁讀、寫及塊擦除等函數(shù)。第三層:為第二層提供具體NAND Flash控制器中對特殊功能寄存器進行操作的核心函數(shù),該層也是真正將數(shù)據(jù)在SDRAM和NAND Flash之間實現(xiàn)傳送的函數(shù)。其中第二層為驅(qū)動程序的設計關鍵所在,下面對該層的讀、寫(又稱編程)、擦除功能編碼進行詳細介紹。
2.1 NAND Flash Read
功能:讀數(shù)據(jù)操作以頁為單位,讀數(shù)據(jù)時首先寫入讀數(shù)據(jù)命令00H,然后輸入要讀取頁的地址,接著從數(shù)據(jù)寄存器中讀取數(shù)據(jù),最后進行ECC校驗。
參數(shù)說明:block,塊號;page,頁號;buffer,指向?qū)⒁x取到內(nèi)存中的起始位置;返回值1,讀成功,返回值0:讀失敗。
static int NF_ReadPage(unsigned int block, unsigned int page, unsigned char *buffer){
NF_RSTECC(); /* 初始化 ECC */
NF_nFCE_L(); /* 片選NAND Flash芯片*/
NF_CMD(0x00); /* 從A區(qū)開始讀 *//* A0~A7(列地址) */
NF_ADDR(0); /* A9A16(頁地址) */
NF_ADDR(blockPage0xff); /* A17A24,(頁地址) */
NF_ADDR((blockPage>>8)0xff);/* A25, (頁地址) */
NF_ADDR((blockPage>>16)0xff);/* 等待NAND Flash處于再準備狀態(tài) */
ReadPage();/* 讀整個頁, 512字節(jié) */
ReadECC();/* 讀取ECC碼 */
ReadOOB();/* 讀取該頁的OOB塊 *//* 取消NAND Flash 選中*/
NF_nFCE_H();/* 校驗ECC碼, 并返回 */
Return (checkEcc())}
2.2 NAND Flash Program
功能:對頁進行編程命令, 用于寫操作。
命令代碼:首先寫入00h(A區(qū))/01h(B區(qū))/05h(C區(qū)), 表示寫入那個區(qū); 再寫入80h開始編程模式(寫入模式),接下來寫入地址和數(shù)據(jù); 最后寫入10h表示編程結(jié)束。圖3為程序流程圖。
圖3 寫程序流程
參數(shù)說明:block,塊號;page,頁號;buffer,指向內(nèi)存中待寫入NAND Flash中的數(shù)據(jù)起始位置;返回值0,寫錯誤,返回值1,寫成功。
static int NF_WritePage(unsigned int block, unsigned int page, unsigned char *buffer){
NF_RSTECC(); /* 初始化 ECC */
NF_nFCE_L(); /* 片選NAND Flash芯片*/
NF_CMD(0x0); /* 從A區(qū)開始寫 */
NF_CMD(0x80); /* 寫第一條命令 *//* A0~A7(列地址) */
NF_ADDR(0);/* A9A16(頁地址) */
NF_ADDR(blockPage0xff);/* A17A24(頁地址) */
NF_ADDR((blockPage>>8)0xff); /* A25(頁地址) */
NF_ADDR((blockPage>>16)0xff);/* 寫頁為512B到NAND Flash芯片 */
WRDATA(); /*OOB一共16字節(jié),每一個字節(jié)存放什么由程序員自己定義, 在Byte0 Byte2存ECC檢驗碼,Byte6 存放壞塊標志*/
WRDATA(); /* 寫該頁的OOB數(shù)據(jù)塊 */
CMD(0x10); /* 結(jié)束寫命令 */
WAITRB();/* 等待NAND Flash處于準備狀態(tài) *//* 發(fā)送讀狀態(tài)命令給NAND Flash */
CMD(0x70);
if (RDDATA()0x1) { /*如果寫有錯, 則標示為壞塊,取消NAND Flash 選中*/
MarkBadBlock(block);
return 0;
} else { /* 正常退出, 取消NAND Flash 選中*/
return 1;}
2.3 NAND Flash Erase
功能:塊擦除命令。
評論