物聯網:關於Nand flash讀寫範圍的問題

物聯網:Nand flash讀寫範圍的問題

很多時候對nand的操作都是通過主控的nand控制器直接完成,或者更多時候是通過MTD標準操作接口完成讀寫擦的過程,然而有些細節問題有必要在這裡討論一下,我分為以下幾點進行說明:

物聯網:關於Nand flash讀寫範圍的問題

物聯網:關於Nand flash讀寫範圍的問題

1、擦除過程:擦除過程是將0變成1的過程,即充電的過程(比如SLC中,當低於某個電壓值表示0,高於這個電壓值則表示1;而對於MLC來說可以有多個閾值,所以可以保存更多bit)。擦除過程是按塊進行的,但啟始地址是頁地址,不過擦除過程在內部是有邊界對齊的,也就是說當擦除啟始地址不是塊對齊時,只能擦除本塊,而不能垮越到第二個塊繼續擦除,也就是無論我們給的地址是否頁對齊,本塊都將擦除,不會有任何保留。

需要注意的是:塊擦除時每一頁的oob區也同時被擦除掉了,所以一般擦除前先讀取塊的第一頁的兩個字節看是否為0xff(512Byte頁大小nand的壞塊信息放在第6個字節中,ECC佔用0、1、2、3、6、7字節;2k頁大小的nand有24位ECC放在oob區的40-63字節處),不是的話就不要擦除,0xff表示正常,其它值表示錯誤,否則將會擦掉所有壞塊信息,尤其是出廠時寫入的。

2、寫入過程:寫入過程就是將1變成0的過程,即,放電降壓的過程,理論上在寫之前一定要先擦除,但實際上只要之前的值為1,不用擦也可以寫入(舉個例子,比如某一存儲單元存放的值為7,那麼可以寫入比7小的值,比如6,然而反過來則不行,即,未擦之前是不能將6改寫成7的)。寫入過程可以是任意地址,如果不滿一頁(開頭、中間、結尾都可以任意寫入),剩下沒有寫入的存儲單元不會因為未寫而變成1,而是保持之前的狀態不變(因為只有擦除才會變成1)。寫入過程在內部也是有邊界對齊的,也就是說寫入起始地址不是頁對齊時,只能從當前字節寫到本頁結尾,而不能垮越到第二個頁繼續寫,即使寫入長度夠長,也不能一次寫入垮越兩頁。

3、讀取過程:讀取過程只是通過解碼電路將存儲陣列中的電壓信號變換成數字信號,並輸出到nand的頁緩衝器中,然後依次按一個或多個字節順序讀出的過程。讀取過程在nand內部也是有邊界對齊的,也就是讀取起始地址不是頁對齊時,只能從當前字節開始讀到本頁結尾,而不能垮越到第二頁繼續讀取,即使讀取長度夠長,也不能一次垮越兩頁讀取。

4、讀寫過程:前面的讀寫過程中的頁大小問題,假如:page=2048Byte,oob=64Byte,那麼,理論上要讀寫oob時,需要給出大於2048的列地址,但實際上在讀取前面的2048字節數據區時,如果在不重新下達命令並給出列地址的情況下而繼續向後讀寫數據,是可以直接讀寫oob區的,除非是要單獨對oob區進行操作。其實對於oob區來說,nand並沒有做過多特殊處理,就是多出來的數據區而已,只是大家約定在這裡可以存放一些校驗和壞塊信息等,如果不存放這些信息,那麼oob就是普通數據區。

5、操作地址:對一個1GByte的nand,可以用30位二進制來表示地址,即A0-A29,當我們希望讀取某一個地址中的數據時,那麼應該怎樣給出這個地址呢,比如我要訪問0x9000000這個地址開始的數據,那麼這個地址又是否包含oob區域呢(實際上並不包含)。

首先對於nand操作本身來說就沒有比頁更小的單位(但是可以按字節讀寫),所以我們給出的地址其實是要進行地址分解的,分解為行地址(頁偏移)和列地址(頁內偏移),比如K9K8G08U0B(page=2048Byte)就從A11開始分,A0-A10為列址,A11-A29為行地址,那麼oob怎麼訪問呢,

舉個例子:

假如我們要訪問的地址是2050,那麼現在開始分解,首先將2050右移11位,即除以2048進行頁對齊處理,其實就是將A0-A10作為列址,A11-A29作為行地址,分別放到兩個變量中結果就是row=1,col=2,那麼最後讀寫的數據到底是什麼呢(如果包含oob區域,那讀寫的數據肯定是oob區的數據),實際上就是跳過第一頁(跳過包括oob區域)到第二頁中讀寫2這個地址的數據。

到這裡我們應該清楚了,不管用戶給出什麼樣的地址,這個地址偏移都是針對數據區域而不會包含oob區的,如果非要讀取oob區,那麼在分解地址的時候,可以將列地址加上2047(col=col+2047),否則讀寫的就只是數據區(如果讀完數據區繼續向後讀寫的話也可以讀寫到oob區,因為系統會自動累加列地址)。

以上信息只是在s5pv210作為主控,操作K9K8G08U0B得出的結論,不同主控和nand型號可能會略有不同。


分享到:


相關文章: