天天看點

自己學驅動16——NAND Flash

1.NOR Flash和NAND Flash

    對于Flash存儲器件的可靠性需要考慮3點:位反轉、壞塊和可擦除次數。所有的Flash器件(包括NOR Flash和NAND Flash)都遭遇位反轉的問題:由于Flash固有的電器特性,在讀寫資料過程中,偶然會産生一位或幾位資料錯誤(這種機率很低),NAND Flash出現這種問題的幾率遠大于NOR Flash。當位反轉發生在關鍵的代碼、資料上時,有可能導緻系統崩潰。當僅僅是報告位反轉,重新讀取即可;如果确實發生了位反轉,則必須有相應的錯誤檢測/恢複措施,推薦使用EDC/ECC進行錯誤檢測/恢複。

    嵌入式Linux對NOR、NAND Flash的軟體支援都很成熟,在NOR Flash上常用jffs2檔案系統,而在NAND Flash上常用yaffs檔案系統。在更底層,有MTD驅動程式(源代碼位于linux源代碼的/drivers/mtd中)實作對它們的讀、寫和擦除操作,它也實作了EDC/ECC校驗。

2.K9F1208U0M存儲格式

    K9F1208U0M容量為528Mbit=64MB,内部分為131072行(頁)、528列;每一行(頁)大小為512位元組,外加16位元組的額外空間,這16位元組的額外空間的列位址為512~527。

    K9F1208U0M的64MB的存儲空間需要26位位址,是以以位元組為機關通路Flash時需要4個位址序列:列位址(A0~A7)、行位址的低位部分以及行位址的高位部分(A9~A25)。讀寫頁在發出指令後,需要4個位址序列,而擦除塊在發出擦除指令後僅需要3個位址序列。這是因為NAND Flash一般以512位元組為機關進行讀寫,NAND Flash的塊大小範圍為8kB~64kB,讀寫是按行(頁)進行,而擦除是以塊為機關完成的。

3.讀操作方法

    操作NAND Flash時,先傳輸指令,然後傳輸位址,最後讀/寫資料,期間要檢查Flash的狀态。

    K9F1208U0M一頁的大小為512位元組,分為兩部分:上半部、下半部。

    列位址的8bits用來在半頁(256位元組)中尋址。

    當發出讀指令00h時,表示列位址将在上半部尋址;當發出讀指令01h時,表示列位址将在下半部尋址。A8位址線将被讀指令00h設定為低電平,被01h設定為高電平。是以2440向K9F1208U0M傳輸位址過程中不會出現A8,在K9F1208U0M内部A8會根據指令自動被設定為高電平或低電平。

    K9F1208U0M一頁大小為528位元組,而列位址A0~A7可以尋址的範圍是256位元組,是以必須輔以其他手段才能完全尋址這528位元組,将一頁分為A、B、C三個區:A區為0~255位元組,B區為256~511位元組,C區為512~527位元組。通路某頁時,需要標明特定的區:指令00h選中A區、指令01h選中B區、指令50h選中C區。指令00h和50h會使得通路Flash的位址指針一直從A區或C區開始,除非發出了其他的修改位址指針的指令。而指令01h的效果隻能維持一次,目前的讀、寫、擦除、複位或者上電操作完成之後,位址指針将重新指向A區。

4.寫操作方法

    寫操作指令分為兩種:Page Program(True)和Page Program(Dummy)。Page Program(True)需要的指令組合為80h和10h;而Page Program(Dummy)需要的指令組合為80h和11h。寫不同于讀操作,寫操作不分A、B、C三個部分,因為NAND Flash的寫操作一般是以頁為機關的,但是也可以隻寫一頁中的一部分。寫操作的位址序列依然同讀一緻,A8依然是沒有的,是以寫NAND Flash一部分的位址隻能是在A0~A7尋址空間内開始。

    Page Program(True):發出指令80h後,緊接着是4個位址序列,然後向Flash發送資料(最大可以達到528位元組),然後發出10h啟動寫操作,這時Flash會自動完成寫、校驗操作。一旦發出10h後,就可以通過讀取狀态指令70h獲知目前的寫操作是否完成、是否成功。

    Page Program(Dummy):由于K9F1208U0M内部分為4個128Mbit的存儲層,每個存儲層包含1024個Block(不是頁而是塊)和528個寄存器。這使得可以同時寫多個頁或者同時擦除多個塊。K9F1208U0M的第1塊位于第1個存儲層、第2塊位于第2個存儲層、第3個塊位于第3個存儲層、第4個塊位于第4個存儲層,以此類推。這樣當用于需要連續寫1~4塊時,就能夠充分使用這4個存儲層各自的528位元組存儲器。

5.塊擦除

    K9F1208U0M塊大小為16KB,當發出60h指令後,後續需要發出3個位址(第2、3、4cycle的位址),并且A9~A13被忽略,即可完成塊擦除操作。