nandflash介紹和2440的nandflash控制器
1、Nand的型號與命名
以K9F2G08來示例分析一下:K9F表示是三星公司的NandFlash系列。2G表示Nand的大小是2Gbit(256MB)。08表示Nand是8位的(8位就是資料線有8根)
2.Nand的頁、塊、器件
Nand中可以被單次訪問的最小單元(就是說對Nand進行一次讀寫至少要讀寫這麼多,或者是這麼多的整數倍)叫做Page(頁),在K9F2G08晶片中,Page的大小是2KB+64B。也就是說我們要讀寫K9F2G08,每次至少要讀寫2KB或者n*2KB,即使我們只是想要其中的一個位元組。這就是我們說的典型的塊裝置(現在有些塊裝置為了方便,提供了一種random read模式,可以只讀取1個位元組)。
頁往上還有個Block(塊)的概念,1個塊等於若干個頁(譬如在K9F2G08中1個塊等於64頁)。
頁往上就是整個Nand晶片了,叫做Device。一個Device是若干個Block,譬如K9F2F08一個Device有2028個block。所以整個Device大小為:2048×64×2K = 256MB
Page是讀寫Nand的最小單位;Block是擦除Nand的最小單位。
定址的最小單位是位元組,但是讀寫的最小單位是頁。
3、帶內資料和帶外資料(ECC與壞塊標記)
(1)Nand的每個頁由2部分組成,這2部分各自都有一定的儲存空間。譬如K9F2G08中為2K+64位元組。其中的2K位元組屬於帶內資料,是我們真正的儲存空間,將來儲存在Nand中的有效資料就是存在這2K範圍內的(我們平時計算nand的容量時也是隻考慮這2KB);64位元組的帶外資料不能用來儲存有效資料,是作為別的附加用途的(譬如用來儲存ECC資料、用來儲存壞塊標誌等····)
(2)什麼是ECC:(error correction code,錯誤校驗碼)。因為nand儲存本身出錯(位反轉)概率高(Nand較Nor最大的缺點就是穩定性),所以當我們將有效資訊儲存到Nand中時都會同時按照一定演算法計算一個ECC資訊(譬如CRC16等校驗演算法),將ECC資訊同時儲存到Nand這個頁的帶外資料區。然後等將來讀取資料時,對資料用同樣的演算法再計算一次ECC,並且和從帶外資料區讀出的ECC進行校驗。如果校驗通過則證明Nand的有效資料可信,如果校驗不通過則證明這個資料已經被損壞(只能丟棄或者嘗試修復)。
(3)壞塊標誌:Nand晶片用一段時間後,可能某些塊會壞掉(這些塊無法擦除了,或者無法讀寫了),nand的壞塊非常類似於硬碟的壞道。壞塊是不可避免的,而且隨著Nand的使用壞塊會越來越多。當壞塊還不算太多時這個Nand都是可以用的,除非壞塊太多了不划算使用了才會換新的。所以我們為了管理Nand發明了一種壞塊標誌機制。Nand的每個頁的64位元組的帶外資料中,我們(一般是檔案系統)定義一個固定位置(譬如定位第24位元組)來標記這個塊是好的還是壞的。檔案系統在發現這個塊已經壞了沒法用了時會將這個塊標記為壞塊,以後訪問nand時直接跳過這個塊即可。
4.
(1)作為一個儲存器件,肯定需要讀寫等操作,也就需要發出讀命令、發出要讀寫的地址、接收讀回來的資料,那麼只有8個IO如何做到傳輸命令、地址、資料的呢?
在DATA0~DATA7上既傳輸資料,又傳輸地址,也傳輸命令:
1. 當ALE為高電平時傳輸的是地址。
2. 當CLE為高電平時傳輸的是命令。
3. 當ALE和CLE都為低電平時傳輸的是資料。
(2) 假設燒寫NAND FLASH,把命令、地址、資料發給它之後,NAND FLASH肯定不可能瞬間完成燒寫的,怎麼判斷燒寫完成?
通過狀態引腳RnB來判斷:它為高電平表示就緒,它為低電平表示正忙
(3) 怎麼操作NAND FLASH呢?
發出命令、發出地址、發出資料/讀資料,每個操作都有固定的時序,我們可以自己用IO口模擬時序,也可以藉助2440內部的nandflash控制器來操作flash,這樣的話就只需要操作內部的暫存器就可以操作flash了。
具體的操作細節見以下部落格:
http://wiki.100ask.org/%E7%AC%AC016%E8%AF%BE_Nand_Flash
參考:朱友鵬課件,韋東山課件