nand flash (k9f5608)驅動編程
1.nand flash的引腳
nand flash比較重要的幾個引腳如下
I/O引腳:對於該款flash晶片I/O引腳有8個0-7,有的晶片有16個0-15
CLE:指令傳輸使能(指令可以鎖存在nand flash的指令寄存器中)
ALE:地址傳輸使能(地址可以鎖存在nand flash的地址寄存器中)
CE:片選,低有效
2.nand flash的控制
nand
flash是通過向I/O傳輸資料進行控制的。傳輸的資料有兩種,一種是先傳輸的命令,另一種是後傳輸的地址。
3.k9f5608的地址傳輸
k9f5608是三星公司的一款32兆8位的nand
flash晶片。需要三個周期將地址通過I/O傳輸到nand
flash晶片。
首先瞭解一下儲存布局,最下面的一層是--頁,一頁由512位元組的資料區塊和16位元組的oob塊組成。其中,資料區塊用來存放資料,oob塊用來存放該flash頁的資訊。中間的一層是塊,一塊由32個頁組成。最上面的一層是裝置,一個裝置由2048個塊組成。
接下來說明它的地址傳輸,前面說過要分多個周期傳送。
首先傳送頁內的偏址:最底層的頁內偏址,一頁是512位元組,所以最大是511。
下面傳送頁地址,分3個周期傳送
第1個周期傳輸頁地址的0-7位。
第2個周期傳輸頁地址的9-16位。
第3個周期傳輸頁地址的17-24位。
這裡要說明的是,第8位是由指令決定的,不需要傳輸。具體的看下面指令的傳輸說明。
4.k9f5608的指令傳輸
k9f5608的指令集有12條指令,具體可以看晶片說明。這裡只是總的說一下。
指令分1個周期和2個周期指令兩種。1個周期的只需要傳送一次,2個周期的要傳送2次。
比如:page
program指令,是2個周期的,要實現這個指令的功能,首先傳送80h,再傳送10h,由於I/O是8位的,正好。
再比如:reset指令,是1個周期的,只需要傳輸FFh即可。
這裡重點說的一下的是read1和read2指令。read1是1周期指令,但是有兩個指令00h和01和。對於頁大小是512位元組的k9f5608來說,8位的定址空間是256,所以用00h來定址前256位元組空間,01h來定址後256位元組。這樣就對應了前面的頁地址傳輸的第8位,如果是前256位元組空間,就自動置0,如果是後256位元組空間就自動置1,所以,頁地址的第8位由指令決定,不需要傳輸。read2是1周期指令,是用來讀oob的。其他的指令都比較簡單,對應著手冊看就行了。
5.驅動編程思路
基於以上的分析,驅動編程分如下幾個要點:
(1)read和write函數的實現要記得先傳輸指令再傳輸地址,將buf中的資料寫入flash或者將flash中的資料讀入buf即可。這裡如果定義了ecc就要用到read2來讀oob,oob中記載著ecc的資訊,具體看手冊。
(2)由於有的nand
flash晶片頁大小是256,有的是512所以命令運行前要進行判斷。
(3)read1和read2的作用不止是讀取資料而已,在讀完後它將指標指到地區的第一個位元組,所以在進行page
program等命令的時候先要運行read命令,讓指標指到該地區的第一個位元組。
暫時就這麼多,多了看得別人也煩。:)