裸機系列 nandflash

2021-05-26 04:56:16 字數 3206 閱讀 6904

看了好久的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控制器中的暫存器。暫存器 值的意義在手冊後面有說明。

nand flash裸機程式

開發板 mini2440 nand flash k9f2g08u0b2,56m arm處理器裸機開發實戰 機制而非策略 知識點梳理 頁的絕對位址與相對位址 在nand.c中有乙個函式void rdnf2sdram 它的功能是將nand flah的內容複製到sdram,如下 nand flash的頁讀...

Nand Flash 裸機程式

硬體平台 jz2440 實現功能 初始化 nand flash 和 sdram,並將 從 nand flash 拷貝到 sdram。start.s 上電初始化 nand 與sdram nand.c nand flash 初始化函式 sdram.c sdram 初始化函式 leds.c led 閃爍 ...

裸機系列 IIS放音

裸機程式設計的iis程式,趙老師已經寫的很是明白了,他的部落格位址 所以這裡我自己也不寫關於iis的一些原理了,我想自己總結一下自己編寫iis程式中間的心得和問題。首先對於iis程式設計,要明白三個重點 1.iis匯流排,對於iis匯流排2440來說有五根線,分別是iissclk iislrclk ...