本章目標:
1) 了解NAND Flash芯片的接口
2) 掌握通過(guò)NAND Flash控制器訪(fǎng)問(wèn)NAND Flash的方法
u Flash介紹
常用的Flahs類(lèi)型有NOR Flash和NAND Flash兩種。NOR Flash由Intel公司在1988年發(fā)明,以替代當時(shí)在市場(chǎng)上占據主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年發(fā)明的。
NOR Flash支持XIP,即代碼可以直接在NOR Flash上執行,無(wú)需復制到內存中。這是由于NOR Flash的接口與RAM完全相同,可以隨機訪(fǎng)問(wèn)任意地址的數據。在NOR Flash上進(jìn)行讀操作的效率非常高,但是擦除和寫(xiě)操作的效率非常低。另外,NOR Flash的容量一般比較小,NAND Flash進(jìn)行擦除和寫(xiě)操作的效率更高,并且容量更大。一般頁(yè)言,NOR Flash用于存儲程序,NAND Flash用于存儲數據?;?/span>NAND Flash的設備通常也要搭配NOR Flash以存儲程序。
Flash存儲器件由擦除單元(也稱(chēng)為塊)組成,當要寫(xiě)某個(gè)塊時(shí),需要確保這個(gè)塊已經(jīng)被擦除。NOR Flash的塊大小范圍為64KB - 128KB;NAND Flash的塊大小范圍為8KB - 64KB,擦/寫(xiě)一個(gè)NOR Flash塊需要4s,而擦/寫(xiě)一個(gè)NAND Flash塊僅需要2ms,NOR Flash的塊太大,不僅增加了擦寫(xiě)時(shí)間,對于給定的寫(xiě)操作,NOR Flash也需要更多的擦除操作——特別是小文件,比如一個(gè)文件只有1KB,但是為了保存它卻需要擦除大小為64KB-128KB的NOR Flash塊。
NOR Flash的接口與RAM完全相同,可以隨意訪(fǎng)問(wèn)任意地址的數據。而NAND Flash的接口僅僅包含幾個(gè)I/O引腳,需要串行地訪(fǎng)問(wèn)。NAND Flash一般以512字節為單位進(jìn)行讀寫(xiě)。這使得NOR Flash適合于運行程序,而NAND Flash更適合存儲數據。
容量相同的情況下,NAND Flash的體積更小,對于空間有嚴格要求的系統,NAND Flash可以節省更多的空間。
對于Flash存儲器件的可靠性需要考慮3點(diǎn):位反轉、壞塊和可擦除次數。所有Flash器件都遭遇位反轉的問(wèn)題:由于Flash固有的電器特性,在讀寫(xiě)數據過(guò)程中,偶然會(huì )產(chǎn)生一位或幾位的數據錯誤(這種概率很低),而NAND Flash出現的概率遠大于NOR Flash。當位反轉發(fā)生在關(guān)鍵代碼或數據上時(shí),有可能導致系統崩潰。當僅僅是報告位反轉,重新讀取即可;如果確實(shí)發(fā)生了位反轉,則必須有相應的錯誤檢測和恢復措施。在NAND Flash上發(fā)生位反轉的概率更高,推薦使用EDC/ECC進(jìn)行錯誤檢測和恢復。NAND Flash上會(huì )有壞塊隨機分布,在使用前需要將壞塊掃描出來(lái),確保不再使用它們,否則會(huì )使產(chǎn)品含有嚴重的故障。NAND Flash每塊的可擦除次數通常在100000次左右,是NOR Flash的10倍。另外,因為NAND Flashr的塊大小通常是NOR Flash的1/8,所以NAND Flash的壽命遠遠超過(guò)NOR Flash。
嵌入式Linux對NOR、NAND Flash的軟件支持都很成熟。在NOR Flash上常用jffs2文件系統,而在NAND Flash上常用yaffs文件系統。在更底層,有MTD驅動(dòng)程序實(shí)現對它們的讀、寫(xiě)、擦除操作,它也實(shí)現了EDC/ECC校驗。
u NAND Flash訪(fǎng)問(wèn)方法
K
命令、地址、數據都是通過(guò)8個(gè)I/O口輸入/輸出,這種形式減少了芯片的引腳個(gè)數,并使得系統很容易升級到更大的容量。寫(xiě)入命令、地址和數據時(shí),都需要將WE#、CE#信號同時(shí)拉低。數據在WE#信號的上升沿被NAND Flash鎖存:命令鎖存信號CLE、地址鎖存信號ALE用來(lái)分辨、鎖存命令或地址。K
NAND Flash與S
操作NAND Flash時(shí),先傳輸命令,然后傳輸地址,最后讀/寫(xiě)數據,期間要檢查Flash的狀態(tài)。對于K
K
u 下面講解表8.2的命令字
(1)Read 1:命令字為00h或01h
發(fā)出命令00h或01h后,就選定了讀操作是從A區還是B區開(kāi)始。從表8.3可知,列地址A0 - A7可以尋址的范圍是256字節,命令00h和01h使得可以在512字節大小的頁(yè)內任意尋址——這相當于A8被命令00h設為0,而被命令01h設定為1。
發(fā)出命令字后,依據表8.3發(fā)出4個(gè)地址序列,然后就可以檢測R/nB引腳以確定Flash是否準備好。如果準備好,就可以發(fā)起讀操作依次讀入數據。
(2)Read 2:命令字為50h
與Read 1命令字類(lèi)似,不過(guò)讀取的是C區數據,操作序列為:發(fā)出命令字50h、發(fā)出4個(gè)地址序列、等待R/nB引腳為高,最后讀取數據。不同的是,地址序列中A0 - A3用于設定C區(大小為16字節)要讀取的起始地址,A4 - A7被忽略。
(3)Read ID:命令字為90h
發(fā)出命令字90h,發(fā)出4個(gè)地址序列(都設定為0),然后就可以連續讀入5個(gè)數據,分別表示廠(chǎng)商代碼(對一SAMSUNG公司為Ech)、設備代碼(對于K
(4)Reset:命令字為FFh
發(fā)出命令字FFh即可以復位NAND Flash芯片。如果芯片正處于讀、寫(xiě)、擦除狀態(tài),復位命令會(huì )終止這些命令。
(5)Page Program(True):命令字分兩個(gè)階段,80h和10h
NAND Flash的寫(xiě)操作一般是以頁(yè)為單位的,但是可以只寫(xiě)一頁(yè)中的一部分。發(fā)出命令字80h后,緊接著(zhù)是4個(gè)地址序列,然后向Flash發(fā)送數據(最大可以達到528字節),然后就可以通過(guò)讀狀態(tài)命令70h獲知當前寫(xiě)操作是否完成、是否成功。
(6)Page Program(Dummy):命令字分兩階段,80h和11h
NAND Flash K
命令Page Program(Dummy)正是在這種結構下對命令Page Program(True)的擴展,后者僅能對一頁(yè)進(jìn)行寫(xiě)操作,前者可以同時(shí)寫(xiě)4頁(yè)。
發(fā)出命令字80h、4個(gè)地址序列及最多528字節的數據之后,發(fā)出命令字11h(11h稱(chēng)為“Dummy Page Program command”,相對地,10h被稱(chēng)為“True Page Program Command”);接著(zhù)對相鄰層(plane)上的頁(yè)進(jìn)行同樣的操作;僅在第4頁(yè)的最后使用10h替代11h,這樣即可啟動(dòng)Flash內部的寫(xiě)操作。此時(shí)可以通過(guò)命令71h獲知這些寫(xiě)操作是否完成、是否成功。
(7)Copy-Back Program(True):命令字分為3個(gè)階段,00h、8Ah、10h。
此命令用于將一頁(yè)復制到同一層(plane)內的另一頁(yè),它省略了讀出數據源,新數據重新載入Flash,這使得效率大為提高。此命令有兩個(gè)限制:源頁(yè)、目的頁(yè)必須在同一個(gè)層(plane)中,并且源地址、目的地址的A14和A15必須相同。
首先發(fā)出命令Read 1(00h)、4個(gè)源地址序列,此時(shí)源頁(yè)的528字節數據很快就被讀入內部寄存器中;接著(zhù)發(fā)出命令字8Ah(Page-Copy Data-input command),隨之發(fā)出4個(gè)目的地址序列;最后發(fā)出命令字10h啟動(dòng)對目的頁(yè)的寫(xiě)操作。此后可以使用命令70h來(lái)查看此操作是否完成,是否成功。
(8)Copy-Back Program(Dummy):命令字分3個(gè)階段,03h、8Ah、11h。
與命令Page Program(Dummy)類(lèi)似,Copy-Back Program(Dummy)可以同時(shí)啟動(dòng)對多達4個(gè)連續plane內的Copy-Back Program操作。
首先發(fā)出命令字00h、源頁(yè)地址,這使得源頁(yè)的528字節數據被讀入所在plane的寄存器;對于隨后的其它plane的源頁(yè),發(fā)出命令字03h的相應的源頁(yè)地址將數據讀入該plane的寄存器;按照前面說(shuō)明讀出最多4個(gè)頁(yè)的數據到寄存器后,發(fā)出命令字8Ah、目的地址、命令字11h,在發(fā)出最后一頁(yè)的地址后,用10h代替11h以啟動(dòng)寫(xiě)操作。
(9)Block Erase:命令字分3個(gè)階段,60h、D0h。
此命令用于擦除NAND Flash塊(block,大小為16KB)。發(fā)出命令字60h之后,發(fā)出block地址——僅需要3個(gè)地址序列,并且A9 - A13被忽略。
(10)Multi-Plane Block Erase:60h ------60h D0h
此命令用于同時(shí)擦除不同plane中的塊。發(fā)出命令字60h之后,緊接著(zhù)發(fā)出block地址序列,如此最多可以發(fā)出4個(gè)block地址,最后發(fā)出命令字D0h啟動(dòng)擦除操作。
(11)讀狀態(tài)命令有以下兩種:
1、Read Status:命令字為70h
2、Read Multi-P;ane Status:命令字為71h
Flash中有狀態(tài)寄存器,發(fā)出命令字70h或者71h之后,啟動(dòng)讀操作即可讀入此寄存器。
u S
NAND Flash控制器提供幾個(gè)寄存器來(lái)簡(jiǎn)化對NAND Flash的操作,比如要發(fā)出讀命令時(shí),只需要往NFCMD寄存器中寫(xiě)入0即可,NAND Flash控制器會(huì )自動(dòng)發(fā)出各種控制信號。
1、操作方法概述
訪(fǎng)問(wèn)NAND Flash時(shí)需要先發(fā)出命令,然后發(fā)出地址序列,最后讀/寫(xiě)數據;需要使用各種使能信號來(lái)分辨是命令、地址還是數據。S
NAND Flash的讀寫(xiě)操作次序如下:
(1)設置NFCONF(對于S
(2)向NFCMD寄存器寫(xiě)入命令,這些命令可以參考表8.2。
(3)向NFADDR寄存器寫(xiě)入地址。
(4)讀/寫(xiě)數據:通過(guò)寄存器NFSTAT檢測NAND Flash的狀態(tài),在啟動(dòng)某個(gè)操作后,應該檢測R/nB信號以確定該操作是否完成、是否成功。
下面講解這些寄存器的功能和用法:
(1)NFCONF:NAND Flash配置寄存器
這個(gè)寄存器在S
S
(2)NFCONT:NAND Flash控制寄存器,S
被用來(lái)使能/禁止NAND Flash控制寄存器,使能/禁止控制引腳信號nFCE、初始化ECC。它還有其它功能,在一般的應用中用不到,比如鎖定NAND Flash。
(3)NFCMD:NAND Flash命令寄存器
對于不同型號的Flash,操作命令一般不一樣。對于本板使用的K
(4)NFADDR:NAND Flash地址寄存器。
當寫(xiě)這個(gè)寄存器時(shí),它將對Flash發(fā)出地址信號。
(5)NFDATA:NAND Flash數據寄存器。
只用到低8位,讀、寫(xiě)此寄存器將啟動(dòng)對NAND Flash的讀數據、寫(xiě)數據操作。
(6)NFSTAT:NAND Flash狀態(tài)寄存器
只用到位0,0:busy,1:ready
u NAND Flash控制器操作實(shí)例,讀Flash
本實(shí)例講述如何讀取NAND Flash,擦除、寫(xiě)Flash的操作與讀Flash類(lèi)似,讀者可以自行編寫(xiě)程序。
讀NAND Flash的步驟,假設讀地址為addr
(1)設置NFCONF(對于S
本章實(shí)例中設為0x9830——使能NAND Flash控制器、初始化ECC、NAND Flash片選信號nFCE=1(inactive,真正使用時(shí)再讓它等于0),設置TACLS = 0,TWRPH0 = 3,TWRPH1 = 0。這些時(shí)序參數的含義為:TSCLS=1個(gè)HCLK時(shí)鐘,TWRPH0 = 4個(gè)HCLK時(shí)鐘,TWRPH1=1個(gè)HCLK時(shí)鐘。
聯(lián)系客服