嵌入式Linux裸機開發(十一)――Nandflash
一、Nand Flash簡介
NandFlash是Flash的一種,具有容量較大,改寫速度快等優點,適用於大量數據的存儲。NandFlash沒有專門的地址線,發送指令、地址和數據都通過8/16位寬的總線(I/O接口)到內部的寄存器。
NandFlash分為SLC和MLC兩類。SLC全稱為Single-Level Cell,單層單元閃存,MLC全稱為Multi-Level Cell,多層單元閃存。SLC每一個單元儲存一位數據,而MLC通過使用大量的電壓等級,每一個單元儲存兩位數據,數據密度比較大。SLC晶片生產成本較高,在效能上大幅勝於MLC。SLC晶片可重復寫入次數約10萬次,而MLC晶片的寫入次數至少要達到1萬次才算標准。MLC缺點有:讀寫速度較慢、MLC能耗比SLC高、MLC理論寫入次數上限相對較少、MLC的價格比SLC低。
二、NandFlash存儲器結構
1、NandFlash存儲器結構
NAND Flash存儲器由block (塊) 構成, block的基本單元是page (頁)。每一個block由16, 32或64個page組成。大多數的NAND Flash器件每一個page (頁)內包含512個字節的Data area(數據存儲區域)和擴展的16字節的 Spare area(備用區域)。每一個page的大小為512+16=528字節,稱為small page。
大容量的(1Gbig或更多)的NAND Flash,page的容量較大, 每page內Data area(數據存儲區域)的大小為2048字節, Spare area(備用區域)大小為64字節。


NAND Flash的讀取和燒錄以頁為基礎, 而NORFlash以字節或字為基礎。 NAND Flash的擦除操作是基於block (塊)的。在NAND Flash上有三種基本的操作:讀取一個頁, 燒錄一個頁和擦除一個塊。
在一個頁的讀取操作中, 該頁內528字節的數據首先被傳輸到數據寄存器中, 然後再輸出。在一個頁的燒錄中, 該頁內528字節的數據首先被寫進數據寄存器, 然後再存儲到存儲陣列中。在一個塊的擦除操作中, 一組連續的頁在單獨操作下被擦除。
2、備用單元結構
NAND Flash廠商在生產制程中使用Spare area(備用區域)來標識bad block, Spare area(備用區域)內所有的字節都可以像Data area(數據存儲區域)內的字節一樣被用戶用來存儲數據。


3、Bad block (Invalid block)管理
自從NAND結構被設計用來作為低成本的多媒體存儲器, 標准規范中是允許存在bad block的。只要bad block的容量小於總容量的2% 那就是允許的。一個block中如果有壞的存儲區域, 那它就會被標識成bad block 。 bad block 列表可以存儲在一個芯片中的一個好的block上, 也可以存儲在同一系統的另外一顆芯片上。bad block列表是被要求的, 由於NAND Flash只能執行有限的讀和擦除次數。由於所有的Flash存儲器最終都會被磨損而且不能再使用, bad block列表需要被用來跟蹤記錄那些在使用中發現的bad block 。允許bad block 的存在有利於提高芯片的產量,同時也降低了成本。每個block是獨立的, 而且是被bit lines隔離的, bad block 的存在並不會影響那些其他block的正常工作。 Bad block 的一般分為兩種: 生產過程中產生的; 使用過程中產生的。當block被發現是bad block , 一般是在該塊的前兩個page (頁)的第517字節處用非FF來標識。使用過程中產生的bad block 是沒有被工廠標識的。
A、Skip Block method(跳過壞塊方式)
先讀取存儲器內的所有備用區域。那些被標識成bad block的地址都被收集起來。接下來, 數據被連續的寫入目標FLASH器件。當目標地址與先前收集的bad block 地址一致時, 跳過壞塊, 數據被寫到下一個好的塊中。然後繼續保留bad block 中備用區域的標識信息。所以在程序導入執行之前, 使用者的系統通過讀取Spare area(備用區域)的信息能建立一個bad block 的地址列表。

B、Reserved Block Area method(保留塊區域方式) bad block 在使用者的系統中能夠被好block (塊)所替代。

C、Error Checking and Correction(錯誤檢測和糾正)
使用ECC糾錯機制是為了讓存儲的數據完整無誤
三、NandFlash接口
NandFlash芯片內部有存儲顆粒和內部管理接口電路,外部SoC根據NandFlash接口時序訪問NandFlash芯片。S5PV210內部集成了NandFlash控制器。

NandFlash引腳功能如下:

NandFlash命令碼:

NandFlash芯片內部接口電路可以接收外部SoC發送的命令,與SoC交互。外部SoC對NandFlash芯片的操作都必須按照NandFlash規定的時序進行。
三、NandFlash常見操作
1、壞塊檢查
NandFlash使用前需要統一擦除(按塊擦除),擦除後填充1。擦除塊,將塊中的每個字節與0xFF比較,如果不是0xFF,是壞塊。
2、頁燒錄(頁寫操作)
頁燒錄前需要擦除,如果頁燒錄之前沒有擦除,燒錄的數據將是錯誤的。燒時,SoC通過命令線、IO線依次發送燒錄命令、燒錄地址、燒錄數據等進入NandFlash。NandFlash芯片接口電路接收頁數據到緩沖區,再集中燒錄到NandFlash的存儲顆粒。燒錄過程需要一定時間,SoC的NandFlash控制器需要等待NandFlash燒錄完,等待過程中SoC的NandFlash控制器將會不斷讀取頁燒錄狀態。SoC的NandFlash控制器收到正確的狀態響應時,確認頁燒錄已經成功,如果一直未收到正確的狀態,則認為燒錄頁所在的塊是壞塊。

頁燒錄編程流程如下:A、發出片選信號B、發送頁燒錄命令第一個周期命令0x80C、隨機寫頁內某個地址的值 D、發送頁寫命令0x85E、寫入頁內偏移地址F、寫入數據G、發送頁燒錄命令第二個周期命令0x10H、等待狀態I、讀取狀態,頁燒錄成功取消片選信號,失敗取消片選信號
3、塊擦除

擦除操作必須指定塊對齊的地址。塊擦除編程流程如下:A、獲取擦除塊的地址(塊對齊)B、發出片選信號C、發送擦除命令,第一個周期發命令0x60,第二個周期發塊地址,第三個周期發命令0xd0 。D、清除狀態,等待狀態。E、讀取狀態,擦除成功則取消片選,擦除失敗取消片選。
4、頁讀取
頁讀取編程流程:

A、發出片選信號
B、發送頁讀取命令,第一個周期發命令0x00,第二個周期發送頁地址,第三個周期發送命令0x30
C、等待狀態
D、發送頁讀取第一個周期命令0x05
E、寫入頁內偏移地址
F、發送頁讀取第二個周期命令0xE0
G、讀取數據
H、檢查狀態,如果讀取成功,取消片選信號,讀取失敗取消片選信號。
五、S5PV210 NandFlash控制器
NandFlash控制器的主要特性: 支持512B,2KB,4KB,8KB頁的NandFlash 軟件模式:能直接訪問NandFlash芯片,支持讀/燒錄/擦除NandFlash芯片 支持8bit的NandFlash芯片接口總線 產生、檢測、指示硬件ECC 支持SLC/MLC類型NandFlash芯片 支持1/4/8/12/16位的ECC SFR接口:支持字節、半字、字訪問數據和ECC數據寄存器,字訪問其他寄存器。 SoC通過控制SFR(NandFlash控制器)

NFCONF:NandFlash配置寄存器
NFCONT:NandFlash控制寄存器
NFCMMD:NandFlash命令寄存器
NFADDR:NandFlash地址寄存器
NFDATA:NandFlash數據寄存器
NFSBLK:燒錄塊起始地址
NFEBLK:燒錄塊結束地址
NFSTAT:狀態寄存器
六、NandFlash編程實踐
Smart210的NandFlash為512MB的SLC類型。
電路原理圖查閱 查閱核心板電路原理圖有關NandFlash部分,

NandFlash片選信號引腳為Xm0CSn2,在核心板電路原理圖搜Xm0CSn2可知,NandFlash接在Memory Port0,對應GPIO為MP01-MP03

GPIO配置如下:
MP0_1CON = 0x22333322;
MP0_2CON = 0x00002222;
MP0_3CON = 0x22222222;
工程源代碼見附件,編譯後在Smart210燒錄可以正常運行,可以正常的對NnandFlash進行擦除、燒錄、讀取等測試操作。
參考博文:
NandFlash簡介 (CSDN 喝醉的毛毛蟲)
本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1787752