看了好久的nandflash手冊以及其他方面的一些資料,因為英語不好,所以手冊看的有點暈,幸好網路資源的豐富。總結一下我所理解的nandflash操作,基於一些其他的原因,暫時不繼續進行裸機程式設計,只是把所有的理解詳細的寫下來。
1. 首先對於nandflash程式設計有三個方面
1. nandflash
儲存器,當然這是重點,因為對於nandflash程式設計就是對nandflash進行讀寫擦除等操作。
2. nandflash
控制器,這裡s3c2440已經整合了,對我們可見的就是一堆的暫存器。對於2440程式設計很多時候是設定一堆的暫存器再加上對裝置的時序操作。
3. nandflash
的引腳配置,因為2440的io一般為多功能復用io口。
2. 然後第二個方面是nandflash的結構和操作
1.對應一款具體的nandflash晶元手冊上會給出晶元的結構,nandflash分為倆部分一是main erea 和spare erea。main區儲存資料,spare區儲存附加資訊,壞塊ecc校驗等等。nand flash 的結構為一片nand flash 為乙個裝置(device) ,1 (device) = ***x (blocks) ,1 (block) = ***x (pages) ,1(page) =528 (bytes) = 資料塊大小(512bytes) + oob 塊大小(16bytes ,資料塊為main區,oob為spare區,除oob 第六位元組外,通常至少把oob 的前3 個位元組存放nand flash 硬體ecc 碼) 。關於
oob區,是每個
page
都有的。
page
大小是
512位元組的
nand
每頁分配
16位元組的
oob;如果
nand
物理上是
2k的
page
,則每個
page
分配 64
位元組的
oob。具體分配詳見資料手冊。
2. 壞塊,對於
nandflash
要是沒有壞塊那就比較完美了但是
nandflash
的工藝決定了
nand
的壞塊不可避免(具體是什麼原因應該和他的儲存方式有
關),正是由於壞塊的存在所以使得使用
nand
儲存變得複雜。首先對於壞塊的定義,是指一塊中存在一位或者多位不確定的狀態。
3.壞塊的分類,壞塊分為倆種,一是出廠是就已經存在的壞塊,固有壞塊。對於固有壞塊,晶元廠已經將壞塊標記,對於不同的晶元標記的地方不同,以
sangsun
公司為例,
小的就是1page 512byte ,壞塊檢查spare data 的第六個位元組。
大的就是1page 2048byte ,壞塊檢查spare data 的第1 個位元組。一般標記在每乙個塊的第一頁和第二頁的第六個位元組或第乙個位元組為非0xff一般寫為0。二是使用中出現的壞塊,這一部分的壞塊需要自己建立壞塊表進行標記管理。
4. 壞塊的管理,首先對於壞塊的管理注意,
nandflash
是對頁進行讀寫,對塊進行擦除,擦除有可能把壞塊標記擦除,所以操作前先要判斷是否為壞塊。對於
壞塊的管理網上有乙個有個很好的想法,我覺得很好,對於整個
nandflash
進行分三個區域,
第乙個區使用資訊(包括壞塊表,使用block 數目等,預留10 個block ),第二個區為資料記錄區,第三個區為壞塊對映區(專用於替換壞塊,為保留區,不能直接往裡面寫資料,為128 個block )。
從 前10個block中選擇乙個好的block來記錄整個nand的壞塊資訊和其他資訊,然後第二個區為真正的資料記錄區,最後第三個區為壞塊的替換區域。 開始前執行乙個壞塊掃瞄程式來建立整個壞塊表,以後再產生的壞塊同樣記錄在壞塊表中。再寫資料時先查詢壞塊表是否為壞塊,如果是壞塊,則就資料寫入到替換區域的塊中。
5. ecc
以三星公司的
k9f2g08u0a
nandflash
為例講我的理解,首先對於ecc是一種錯誤檢測和糾正的校驗方法,原理比較複雜,三星公司有文件說明,可以用軟體和硬體實 現,s3c2440硬體產生ecc,簡化了程式設計。ecc分為倆部分一是對於主資料main區的ecc,二是對spare區的ecc。對於ecc校驗的過程 如下,首先讀寫一頁資料後,硬體自動生成ecc資料到
nfmeccd0/1
(main
區資料ecc
),讀寫
spare
區後自動生成
ecc到
nfseccd0/1
(spare
區資料ecc
)。然後我們需要把這倆個
ecc資料儲存到
nand
的spare
區,對於
k9f2g08u0a
spare
區有64byte,不要使用第1、2byte,因為出廠時的壞塊標記儲存在每個block的第一二頁的第一二個位元組,為了統一,以後自己遇到壞塊時也統一 使用一二個位元組標記壞塊。使用其他的位元組,(自己選擇)來儲存main區的ecc和spare區的ecc。當讀出main區的資料時,同樣硬體自動生成ecc到
nfmeccd0/1
暫存器,再把上次儲存的
ecc資料出來倆次進行比較相同則沒有錯誤,而我們只需要將取出的
ecc資料放入暫存器
nfmeccd
中,硬體自動進行比較,我只有讀
ecc狀態暫存器
nfestat0/1
就可以得到結果。同樣對
spare
進行檢驗,同時對錯誤進行處理。
補充:昨天寫的博文,今天又看了一些書,補充一下。
首先我的晶元是sangsun公司的 k9f2g08u0b 恩,晶元的大小是256m 8位io 手冊上沒有明確寫整個晶元分為多少個plane 但我看了一下後面的一下描述我認為整個晶元分為2個plane。
另外還有乙個比較重要的是,改正一下,nandflash的儲存區包括倆部分,mian區和spare區,另外nandflash還有暫存器--狀態暫存器。在完成讀寫操作後,通過 讀狀態暫存器命令 這個操作讀出nandflash中的狀態判斷讀寫操作是否成功。注意這個暫存器在nandflash中,不是nandflash控制器中的暫存器。暫存器值的意義在手冊後面有說明。
求教 s3c2440問題
趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...
s3c2440系統時鐘
1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...
s3c2440儲存控制
nandflash和norflash都是flash的一種,都是散存,都是磁碟儲存介子,但是nandflash一般比較大,而norflash都比較小,並且norflash比較貴,並且norflash寫的速度比較慢,但讀的速度比較快 而nandflash讀的速度比較慢,寫的速度比較快。nor flash...