一、結(jié)構(gòu)分析 S3C2410處理器集成了8位NandFlash控制器。目前市場(chǎng)上常見(jiàn)的8位NandFlash有三星公司的k9f1208、k9f1g08、k9f2g08等。k9f1208、k9f1g08、k9f2g08的數(shù)據(jù)頁(yè)大小分別為512Byte、2kByte、2kByte。它們?cè)趯ぶ贩绞缴嫌幸欢ú町悾猿绦虼a并不通用。本文以S3C2410處理器和k9f1208系統(tǒng)為例,講述NandFlash的讀寫(xiě)方法。 NandFlash的數(shù)據(jù)是以bit 的方式保存在memory cell里的,一般來(lái)說(shuō),一個(gè)cell 中只能存儲(chǔ)一個(gè)bit,這些cell 以8 個(gè)或者16 個(gè)為單位,連成bit line,形成所謂的byte(x8)/word(x16),這就是NAND Device 的位寬。這些Line 組成Page, page 再組織形成一個(gè)Block。k9f1208的相關(guān)數(shù)據(jù)如下: 1block=32page;1page=528byte=512byte(Main Area)+16byte(Spare Area)。 總?cè)萘繛?4096(block數(shù)量)*32(page/block)*512(byte/page)=64Mbyte NandFlash以頁(yè)為單位讀寫(xiě)數(shù)據(jù),而以塊為單位擦除數(shù)據(jù)。按照k9f1208的組織方式可以分四類地址: Column Address、halfpage pointer、Page Address 、Block Address。A[0:25]表示數(shù)據(jù)在64M空間中的地址。 Column Address表示數(shù)據(jù)在半頁(yè)中的地址,大小范圍0"255,用A[0:7]表示; halfpage pointer表示半頁(yè)在整頁(yè)中的位置,即在0"255空間還是在256"511空間,用A[8]表示; Page Address表示頁(yè)在塊中的地址,大小范圍0"31,用A[13:9]表示; Block Address表示塊在flash中的位置,大小范圍0"4095,A[25:14] 表示; 二、讀操作過(guò)程 K9f1208的尋址分為4個(gè)cycle。分別是:A[0:7]、A[9:16]、A[17:24]、A[25]。 讀操作的過(guò)程為: 1、發(fā)送讀取指令;2、發(fā)送第1個(gè)cycle地址;3、發(fā)送第2個(gè)cycle地址;4、發(fā)送第3個(gè)cycle地址;5、發(fā)送第4個(gè)cycle地址;6、讀取數(shù)據(jù)至頁(yè)末。 K9f1208提供了兩個(gè)讀指令,‘0x00’、‘0x01’。這兩個(gè)指令區(qū)別在于‘0x00’可以將A[8]置為0,選中上半頁(yè);而‘0x01’可以將A[8]置為1,選中下半頁(yè)。 雖然讀寫(xiě)過(guò)程可以不從頁(yè)邊界開(kāi)始,但在正式場(chǎng)合下還是建議從頁(yè)邊界開(kāi)始讀寫(xiě)至頁(yè)結(jié)束。下面通過(guò)分析讀取頁(yè)的代碼,闡述讀過(guò)程。 static void ReadPage(U32 addr, U8 *buf) //addr表示flash中的第幾頁(yè),即‘flash地址>>9’ { U16 i; NFChipEn(); //使能NandFlash WrNFCmd(READCMD0); //發(fā)送讀指令‘0x00’,由于是整頁(yè)讀取,所以選用指令‘0x00’ WrNFAddr(0); //寫(xiě)地址的第1個(gè)cycle,即Column Address,由于是整頁(yè)讀取所以取0 WrNFAddr(addr); //寫(xiě)地址的第2個(gè)cycle,即A[9:16] WrNFAddr(addr>>8); //寫(xiě)地址的第3個(gè)cycle,即A[17:24] WrNFAddr(addr>>16); //寫(xiě)地址的第4個(gè)cycle,即A[25]。 WaitNFBusy(); //等待系統(tǒng)不忙 for(i=0; i<512; i++) buf[ i] = RdNFDat(); //循環(huán)讀出1頁(yè)數(shù)據(jù) NFChipDs(); //釋放NandFlash } 三、寫(xiě)操作過(guò)程 寫(xiě)操作的過(guò)程為: 1、發(fā)送寫(xiě)開(kāi)始指令;2、發(fā)送第1個(gè)cycle地址;3、發(fā)送第2個(gè)cycle地址;4、發(fā)送第3個(gè)cycle地址;5、發(fā)送第4個(gè)cycle地址;6、寫(xiě)入數(shù)據(jù)至頁(yè)末;7、發(fā)送寫(xiě)結(jié)束指令 下面通過(guò)分析寫(xiě)入頁(yè)的代碼,闡述讀寫(xiě)過(guò)程。 static void WritePage(U32 addr, U8 *buf) //addr表示flash中的第幾頁(yè),即‘flash地址>>9’ { U32 i; NFChipEn(); //使能NandFlash WrNFCmd(PROGCMD0); //發(fā)送寫(xiě)開(kāi)始指令’0x80’ WrNFAddr(0); //寫(xiě)地址的第1個(gè)cycle WrNFAddr(addr); //寫(xiě)地址的第2個(gè)cycle WrNFAddr(addr>>8); //寫(xiě)地址的第3個(gè)cycle WrNFAddr(addr>>16); 寫(xiě)地址的第4個(gè)cycle WaitNFBusy(); //等待系統(tǒng)不忙 for(i=0; i<512; i++) WrNFDat(buf[ i]); //循環(huán)寫(xiě)入1頁(yè)數(shù)據(jù) WrNFCmd(PROGCMD1); //發(fā)送寫(xiě)結(jié)束指令’0x10’ NFChipDs(); //釋放NandFlash } 四、總結(jié) 本文以S3C2410處理器和k9f1208系統(tǒng)為例講述了nand flash的讀寫(xiě)過(guò)程。在讀寫(xiě)過(guò)程中沒(méi)有考慮到壞塊問(wèn)題,有關(guān)ecc及壞塊處理問(wèn)題將在下個(gè)專題中講述。 |