TQ2440 Nand Flash

    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的狀態。具體的命令字見下表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章