Nand Flash裸機驅動程序的設計
每種類型的存儲設備都有其缺點,NAND Flash的缺點為壞塊較多,并且難以修復,由于數(shù)據(jù),命令,地址,數(shù)據(jù)都用同一批I/O口傳輸,以致驅動程序較為復雜。本文根據(jù)NAND Flash的原理來介紹NAN
每種類型的存儲設備都有其缺點,NAND Flash的缺點為壞塊較多,并且難以修復,由于數(shù)據(jù),命令,地址,數(shù)據(jù)都用同一批I/O口傳輸,以致驅動程序較為復雜。本文根據(jù)NAND Flash的原理來介紹NAND Flash裸機驅動程序的設計。
硬件特性
Flash全名叫做flash memory,屬于非易失性存儲設備,與此相對應的是易失型設備(就是平常我們電腦用的內存SDRAM,斷電后數(shù)據(jù)就沒有了)。數(shù)據(jù)在FLASH內存單元當中是以電荷形式存儲的。存儲電荷的多少,取決于圖中外部門(extern gate)所施加的電壓,其控制了是向存儲單元中沖入電荷還是使其釋放電荷。
NAND Flash的尋址方式
區(qū)別于SDRAM與NOR Flash等存儲設備,SDRAM與NOR Flash可以直接通過CPU地址引腳直接訪問對應的數(shù)據(jù),而NAND Flash通過IO口經(jīng)過復雜的編程來實現(xiàn)尋址。
編程相關
- 從DATASHEET里面,看出,配置NFCONF時需要設置一個叫做MLCFLASH的參數(shù),這個參數(shù)的作用是選擇閃存類型的。
- SLC:單個存儲單元,只存儲一個數(shù)據(jù)。
- MLC:單個存儲單元可以存儲多個位。
- 比如我們要訪問其中的第7000個塊中的第25頁中的1208字節(jié)處的地址,計算出具體地址為:物理地址塊大小*塊號 頁大小*頁號 頁內地址 7000*128k 64*2k 1208 0x36B204b8,再看看具體傳遞地址的流程。
如何識別SLC還是MLC:NAND Flash設計中,有個命令叫做ReadID,讀取ID,意思是讀取芯片ID,還有比如NAND Flash內部是多少個片(chip)組成的,每個chip包含了幾個片(plane),每一片中的頁大小,塊大小,等等。
可以算出:
- 1st周期,A7~A0:1011 1000 0xB8
- 2nd周期,A11~A8:0000 0100 0x04(這里的高四位的0不是原數(shù)據(jù)中的,而是硬件要求的)
- 3rd周期,A19~A12:0010 0000 0x20
- 4th周期,A27~A20:0110 1011 0x6B
- 5th周期,A30~A28:0000 0011 0x03
算出地址以后,接下來就針對讀操作進行細說:
- (1)操作準備階段:此處是讀(Read)操作,所以,先發(fā)一個圖5中讀命令的第一個階段的0x00,表示,讓硬件先準備一下,接下來的操作是讀。
- (2)發(fā)送兩個周期的列地址。也就是頁內地址,表示,我要從一個頁的什么位置開始讀取數(shù)據(jù)。
- (3)接下來再傳入三個行地址。對應的也就是頁號。
- (4)然后再發(fā)一個讀操作的第二個周期的命令0x30。接下來,就是硬件內部自己的事情了。
- (5)Nand Flash內部硬件邏輯,負責去按照你的要求,根據(jù)傳入的地址,找到哪個塊中的哪個頁,然后把整個這一頁的數(shù)據(jù),都一點點搬運到頁緩存中去。而在此期間,你所能做的事,也就只需要去讀取狀態(tài)寄存器,看看對應的位的值,也就是R/B那一位,是1還是0,0的話,就表示,系統(tǒng)是busy,仍在”忙“(著讀取數(shù)據(jù)),如果是1,就說系統(tǒng)活干完了,忙清了,已經(jīng)把整個頁的數(shù)據(jù)都搬運到頁緩存里去了,你可以接下來讀取你要的數(shù)據(jù)了。
- 對于這里。估計有人會問了,這一個頁一共2048 64字節(jié),如果我傳入的頁內地址,就像上面給的1208一類的值,只是想讀取1028到2011這部分數(shù)據(jù),而不是頁開始的0地址整個頁的數(shù)據(jù),那么內部硬件卻讀取整個頁的數(shù)據(jù)出來,豈不是很浪費嗎?答案是,的確很浪費,效率看起來不高,但是實際就是這么做的,而且本身讀取整個頁的數(shù)據(jù),相對時間并不長,而且讀出來之后,內部數(shù)據(jù)指針會定位到你剛才所制定的1208的那個位置。
- (6)接下來,就是你“竊取“系統(tǒng)忙了半天之后的勞動成果的時候了,呵呵。通過先去Nand Flash的控制器中的數(shù)據(jù)寄存器中寫入你要讀取多少個字節(jié)(byte)/字(word),然后就可以去Nand Flash的控制器的FIFO中,一點點讀取你要的數(shù)據(jù)了。
至此,整個Nand Flash的讀操作就完成了。對于其他例如寫操作,可以參照DATA SHEET編寫。