Nandflash K9F1208U0B学习
注:
Row也就是page
1.?????? 引腳描述
I/O0 ~ I/O7-----data inputs/outputs
通過這8個I/O引腳,可以輸入命令,地址和數據,也可以在讀操作時輸出數據。
?
CLE-----command latch enable
CLE輸入控制了發送到命令寄存器的命令。CLE為高電平時激活,在nWE的上升沿,命令通過I/O端口被鎖存到命令寄存器中,結合datasheet的相關時序圖來理解更為深刻。
?
ALE-----address latch enable
ALE輸入控制了地址發送到內部地址寄存器中,在nWE的上升沿和ALE為高電平時,地址被鎖存到地址寄存器中。
?
nCE-----chip enable
nCE是設備選擇控制引腳。
?
nWE-----write enable
寫使能,在nWE的上升沿,命令,地址和數據被鎖存。
?
nWP -----write protect
寫保護,當此引腳為低電平激活,也即內部高壓發生器復位。
?
R/B-----ready/busy output
就緒/忙輸出引腳,通過這個引腳可以知道設備操作的狀態。低電平時,表示編程或擦除或隨機讀操作在進行,并且根據完成情況來返回高狀態。
2.?????? K9F1208U0B的存儲結構和存儲特點
2.1? K9F1208U0B的存儲結構
?
?
?
一片K9F1208U0B總共有4096blocks,每個block包含32pages,每個page包含528bytes,關系如下:
1 device = 4096 blocks
1 block = 32 pages
1 page = 512 Bytes data field + 16 bytes spare field
所以一片K9F1208U0B的容量為4096*32*528=66MB,但是事實上每個page上的最后16bytes是用于存儲校驗碼用的,并不能存放實際的數據,所以實際上我們可以操作的芯片容量為4096*32*512=64MB
?
由上圖可知,1個page總共由528 bytes組成,這528 bytes安順序由上到下以列為單位進行排列(1列代表一個byte,第0行為第0 byte,第1行為第1 byte)。這528 bytes按功能分為兩大部分,分別是data field和spare field,其中spre field占528 bytes里的16 bytes,這16 bytes是用于在讀寫操作的時候存放校驗碼用的,一般不用做普通數據的存儲區,除去16 bytes,剩下的512 bytes便是我們用于存放數據用的data field,所以一個page上雖然有528 bytes,但我們只按512 bytes進行容量的計算。
?
Data field安裝位置有分為兩部分,分別成為1st half和2nd half,每個half各占256 bytes,至于為什么要把data field分為兩部分,后面將做進一步分析。
?
2.2?? K9F1208U0B存儲操作特點
⑴K9F1208U0B是以頁為單位進行讀寫,以block為單位進行擦除。
⑵K9F1208U0B芯片每一位只能從1變為0,而不能從0變為1,所以在對其進行寫操作之前一定要將相應塊擦除(擦除即是將相應塊的位全部變為1)
⑶最后16 bytes(OOB),OOB的第六個字節(即第517個byte)標志是否是壞塊,如果不是壞塊該值為FF,否則為壞塊!
⑷除OOB第六字節外,通常至少把OOB的前3個字節存放nandflash硬件ECC碼。
2.3?? ?
3.?????? K9F1208U0B的地址空間
?
?
64M byte物理空間需要26位地址,所以需要4個周期來發送地址,見上圖
?
Column address
列地址,columm address其實就是指定page上的某個byte,指定這個byte,其實也就是指定此頁的讀寫起始地址。512byte需要8bit來表示,對于528byte系列的NANDFLASH,這512byte被分成1st half和2nd half,各自的訪問由不同的命令(00h/01h)來選擇
?
因為我們的地址,命令和數據都只能通過I/O0~I/O7這8個引腳發送到nandflash,對應于A0~A7,這也就是為什么A8不出現在我們傳遞的地址位中,也就是說我們能夠指定的column address范圍為0~255,但是,1個page的datafield是有512個byte組成的,假設現在我要指定讀命令從第256個byte處開始開始讀取此頁,那么將會發生什么情景呢?我必須把column address設置為256,但column address最大只能是255,這就造成數據溢出,正是這個原因才把data field分成2個半區。當腰讀取的其實地址(column address)在0~255內時我們用00h命令,當讀取的其實地址是256~511時,則使用01h命令
?
Page address
頁地址,由于頁地址總是以512byte對齊的,所以它的低9位總是0,確定讀寫操作時在flash上的哪個頁進行的。一個block有32個page,所以需要5bit來表示,即A9~A13,即該頁在blcok內的相對地址
?
Block address
一個K9F1208U0B flash有4096個block,所以需要12bit來表示,及A14~A25。
?
地址傳送順序是column address,page address,block address,但由于地址只能在I/O[7:0]上傳送,因此,必須采用移位的方式進行,下面以NandAddr為例
⑴第一步是傳遞column address,就是NandAddr[7:0],不需要移位即可傳遞到I/O[7:0]上,而halfpage pointer即bit8是有操作指令(00h/01h)決定的,即指令決定是在哪個halfpage上進行讀寫,而真正的bit8的值是don’t care的。
?
⑵第2步就是將NandAddr右移9bit,將NandAddr[16:9]傳到I/O[7:0]上。
⑶第3步就將NandAddr[24:17]放到I/O[7:0]上。
⑷第4步需要將NandAddr[25]放到I/O[0]上,因此,整個地址傳遞過程需要4步才能完成,即4-step addressing。
?
4.?????? K9F1208U0B的操作命令集
?
⑴ Read 1
命令是00h/01h,這兩個命令用于讀取datafield的數據,其中00h表示將要讀取K9F1208U0B存儲空間中一個頁的前半部分,并且將內置指針定位到前半部分的第一個字節;01h表示將要讀取K9F1208U0B存儲空間中一個頁的后半部分,并且將內置指針定位到后半部分的第一個字節。
⑵ Read 2
命令是50h,用于讀取sparefield的數據。
?
⑶ Read ID
命令是90h,讀取nandflash芯片的ID號
?
⑷ Reset
命令是FFh,重啟nandflash芯片。
?
⑸ Page Program
對頁進行編程命令,由于寫操作,首先寫入00h(A區)/01h(B區)/50h,表示寫入那個區;再寫入80h開始編程模式(寫入模式),接下來寫入地址和數據,最后寫入10h表示編程結束。
?
⑹ Block Erase
塊擦除命令,首先寫入60h進入擦寫模式,然后輸入塊地址;接下來寫入D0h,表示擦寫結束。
?
⑺ Read Status
讀取內部狀態寄存器值命令,命令式70h。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Nandflash K9F1208U0B学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于S3C2440A+SDRAM(K4M
- 下一篇: WINCE6.0+S3C2443的RTC