nandflash在對大容量的數據存儲中發揮着重要的作用。相對於norflash,它具有一些優勢,但它的一個劣勢是很容易產生壞塊,因此在使用nandflash時,往往要利用校驗算法發現壞塊並標註出來,以便以後不再使用該壞塊。
nandflash沒有地址或數據總線,如果是8位nandflash,那麼它只有8個IO口,這8個IO口用於傳輸命令、地址和數據。
nandflash主要以page(頁)爲單位進行讀寫,以block(塊)爲單位進行擦除。
每一頁中又分爲main區和spare區,main區用於正常數據的存儲(main就是每頁的2048字節),spare區(spare就是每頁的後64字節)用於存儲一些附加信息,如塊好壞的標記、塊的邏輯地址、頁內數據的ECC校驗和等。
s3c2440內部集成有內部sram(steppingstone),當選擇從nandflash啓動的時候,nandflash的前4k代碼將會自動copy到內部sram中後運行。
Nand FlashECC:
S3C2440在讀/寫操作時,自動生成2048字節的奇偶校驗碼。
nand flash的頁爲2048B。在讀寫的時候每頁會產生28bit的ECC校驗碼。
28bit ECC校驗碼 = 22bit 線校驗碼 + 6bit列校驗碼
ECC產生模塊執行以下步驟:
1:當MCU寫數據到NAND時,ECC產生模塊生成ECC碼。
2:當MCU從NAND讀數據時,ECC產生模塊生成ECC碼同時用戶程序將它與先前寫入時產生的ECC碼作比較。在自動引導模式下,不進行ECC檢測。因此,NANDFLASH的前4KB應確保不能有位錯誤(一般NANDFLASH廠家都確保)。
ECC 硬件校驗指導:
1.在讀或寫數據前,復位ECC寄存器(往initECC[NFCONT[4]]寫'1')並且清MainECCLock(NFCONT[5]爲'0')(注:MainECCLock(NFCONT[5])和SpareECCLock(NFCONT[6])控制ECC校驗碼的生成)
2.你在讀或寫數據的同時,ECC模塊會自動生成校驗碼放到NFMECC0/1寄存器。
3.在你讀或寫數據完成後,設置MainECCLock位爲1,這樣你就可以檢查ECC狀態寄存器了,
並且可以獲得ECC校驗碼。
4.最後你就可以把校驗碼寫入spare空間(寫Nand)或者檢查錯誤位(讀Nand)了。
壞塊管理
由於NAND Flash的工藝不能保證NAND的Memory Array在其生命週期中保持性能的可靠,因此,在NAND的生產中及使用過程中會產生壞塊。壞塊的特性是:當編程/擦除這個塊時,不能將某些位拉高,這會造成PageProgram和BlockErase操作時的錯誤,相應地反映到StatusRegister的相應位。
(1) 固有壞塊,這是生產過程中產生的壞塊,一般芯片原廠都會在出廠時都會將壞塊第一個page的spare area的第6個Byte標記爲不等於0xff的值。
(2) 使用壞塊,這是在NANDFlash使用過程中,如果BlockErase或者PageProgram錯誤,就可以簡單地將這個塊作爲壞塊來處理,這個時候需要把壞塊標記起來。爲了和固有壞塊信息保持一致,將新發現的壞塊的第一個page的 spare area的第6個Byte標記爲非0xff的值。
(3) 壞塊管理
根據上面的這些敘述,可以瞭解NANDFlash出廠時在sparearea中已經反映出了壞塊信息,因此,如果在擦除一個塊之前,一定要先check一下spare area的第6個Byte是否是0xff,如果是就證明這是一個好塊,可以擦除;如果是非0xff,那麼就不能擦除。
(4)需要對前面由於PageProgram錯誤發現的壞塊進行一下特別說明。如果在對一個塊的某個page進行編程的時候發生了錯誤就要把這個塊標記爲壞塊,首先就要把其他好的page裏面的內容備份到另外一個空的好塊裏面,然後,把這個塊標記爲壞塊。
當然,這可能會犯"錯殺"之誤,一個補救的辦法,就是在進行完頁備份之後,再將這個塊擦除一遍,如果BlockErase發生錯誤,那就證明這個塊是個真正的壞塊,那就毫不猶豫地將它打個"戳"吧!
(5)可能有人會問,爲什麼要使用sparearea的第六個Byte作爲壞塊標記。這是NANDFlash生產商的默認約定。
Nand Flash寄存器說明:
NFCONF0x4E000000 Nand flash配置寄存器
TACLS [13:12] 表示CLE/ALE命令地址鎖定信號建立後到nWE信號建立時間(setuptime)。
TWRPH0 [10:8] 表示nWE的持續時間。
TWRPH1 [6:4] 表示nWE鎖存結束後CLE/ALE維持時間(hold time)。
TQ2440配有K9F2G08U0A-P 256M Nand Flash
因爲HCLK爲100MHZ,所以一個clock爲10ns
TACLS = tCLS- tWP = 12ns - 12ns = 0ns = 0/HCLK
TWRPH0 = tWP = 12ns = 2/HCLK
TWRPH1 = max(tCLH, tALH) = max(5ns, 5ns) = 5ns =1/HCLK
NFCONT0x4E000004 Nand flash控制寄存器
Lock-tight [13] 0:Disable 1:Enable
此位一旦設置爲1,不能清除,唯有在復位和喚醒時能夠使此位無效(軟件不能清除)當設置爲1時,範圍爲NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被鎖定,在這範圍之外,寫和擦除命令是無效,只有讀命令是允許的。當你試圖寫或擦除鎖定區域,違規存取將發生,NFSTAT[3]被設置NFSBLK和NFEBLK相同,全部區域將被鎖定
Soft-lock [12] 0: Disable 1: Enable
軟件鎖定能在任何時間被軟件修改,當設置爲1時,範圍爲NFSBLK(0X4E000038)到NFEBLK(0X4E00003C)-1不被鎖定,在這範圍之外,寫和擦除命令是無效,只有讀命令是允許的。當你試圖寫或擦除鎖定區域,違規存取將發生,NFSTAT[3]被設置,NFSBLK和NFEBLK相同,全部區域將被鎖定
EnblllegalAccINT [10] 0: Disable 1: Enable
訪問鎖定的區域時是否觸發中斷。
EnbRnBINT [9] 0: Disable 1: Enable
Nand Flash ready or Busy是否通過中斷方式通知
RnB_TransMode [8] RnB轉換檢測信號設置
0:上升沿 1:下降沿
SpareECCLock [6] ECC硬件校驗,校驗OOB區
MainECCLock [5] 檢驗data區
InitECC [4] 初始化ECC (只寫寄存器)
Reg_nCE [1] 控制發出片選信號
0: 選中芯片 1: 取消選中
MODE [0] Nand flash 控制器開關
0: 關閉 1: 打開
NFCMMD0x4E000008 Nand Flash 命令寄存器
想向Nand Flash發命令,只要把命令寫到這個寄存器裏面就行了。
NFADDR0x4E00000C Nand Flash 地址寄存器
NFDATA0x4E000010 Nand Flash 數據寄存器
NFSTAT0x4E000020 Nand Flash 狀態寄存器
IllegalAccess [3] 當softlock或tightlock,非法操作後這一位被置'1'
RnB_TransDetect [2] 當RnB由低向高電平轉變是,該位被設置併發出中斷,如果中斷允許,要清除該位向該位寫'1'
RnB [0] 只讀 0: busy 1:ready
K9F2G08容量爲256MB,分爲131072行(頁),2112 x 8列。每頁大小爲2048字節,另外有64字節的額外空間,這64字節的空間的列地址爲2048—2111。命令、地址、數據都通過8個I/O口輸入/輸出,這種形式減少了芯片的引腳個數,並使得系統很容易升級到更大的容量,寫入命令、地址或數據時,都需要將WE#、CE#信號同時拉低。數據在WE#信號的上升沿被鎖存,其中CLE爲命令鎖存信號、ALE爲地址鎖存信號。整個芯片爲(256+8)MB,因此,需要29根地址線來尋址,這樣,如果我們以字節爲單位發出尋址信號,總共需要5個週期,其中2週期列地址信號,3週期的行地址信號。
地址疑惑:
我們知道,K9F2G08容量爲256M,故其需要28位地址進行尋址,每一頁容量爲2K,需11位地址,共有131072行,需要地址17位,頁和行地址相加爲28位正好尋址256M,,而上表中用的地址爲29位,再看看頁地址[A0~A11]12位,可尋址空間爲4K,行地址[A12~A28]17位,可尋址空間爲131072行,顯然頁地址多出一位,其尋址空間擴大了一倍。當我們考慮地址[0x800=2048=2^11]尋址時,由於一頁大小爲2048,其地址範圍爲[0~2047],0x800應爲第一頁第一個字節。其列地址爲0,行地址爲1(A11爲行地址第一個位)。但當我們按上表分析該地址時,其列地址爲0x800(2048)行地址爲0,那麼該地址讀取的數據爲第0頁第2048個字節(即SPACE區域的第一個字節),顯然問題的關鍵在A11上,也就是說當A11爲1時,我們尋
址空間爲頁2048~2111(共64字節)。通過實際檢驗,可以斷定,我們地址addr[11]應爲行地址第一位,讀取Main頁地址(0~2047)範圍內時,A11必須置0,訪問space區域時,A11必須置1,由我們根據需要決定,不從地址中取值,故行地址應從a[11]位開始。
操作命令字介紹
操作NAND FLASH時,先傳輸命令,接着輸出地址,最後讀/寫數據,期間還要檢查FLASH的狀態。具體的命令字見下表。