1. 程式人生 > >自己學驅動16——NAND Flash

自己學驅動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被忽略,即可完成塊擦除操作。