閃存(Flash Memory)由于其具有非易失性、電可擦除性、可重復編程以及高密度、低功耗等特點,被廣泛地應用于手機、MP3、數碼相機、筆記本電腦等數據存儲設備中。NAND Flash和NOR Flash是目前市場上兩種主要的非易失閃存芯片。與NOR Flash相比,NAND Flash在容量、功耗、使用壽命等方面的優勢使其成為高數據存儲密度的理想解決方案。NOR Flash的傳輸效率很高,但寫入和擦除速度較低;而NAND Flash以容量大、寫速度快、芯片面積小、單元密度高、擦除速度快、成本低等特點,在非易失性類存儲設備中顯現出強勁的市場競爭力。
結構:NOR Flash為并行,NAND Flash為串行。
總線:NOR Flash為分離的地址線和數據線,而NANDFlash為復用的。
尺寸:典型的NAND Flash尺寸為NOR Flash尺寸的1/8。
壞塊:NAND器件中的壞塊是隨機分布的,需要對介質進行初始化掃描以發現壞塊,并將壞塊標記為不可用。
位交換:NAND Flash中發生的次數要比NOR Flash多,建議使用NAND閃存時,同時使用EDC/ECC算法。
使用方法:NOR Flash是可在芯片內執行(XIP,eXecute In Place),應用程序可以直接在FIash閃存內運行,不必再把代碼讀到系統RAM中;而NAND Flash則需I/O接口,因此使用時需要寫入驅動程序。
通過以上的分析和比較,NAND Flash更適合于大容量數據存儲的嵌入式系統。本設計選用Samsung公司生產的NAND Flash存儲器芯片K9F1208作為存儲介質,并應用在基于uPSD3234A增強型8051單片機的嵌入式系統中。
2 uPSD3234A簡介
uPSD3234A是由意法半導體公司生產的一款基于8052內核的增強型Flash單片機,其結構如圖1所示。該單片機包含1個帶8032微控制器的Flash PSD、2塊Flash存儲器、SRAM、通用I/O口可編程邏輯、管理監控功能,并可實現USB、I2C、ADC、DAC和PWM功能。其中,片內8032微控制器,帶有2個標準異步通信口、3個16位定時/計數器、1個外部中斷以及JTAG ISP接口(用于在系統編程),一般應用于手持設備、家用電器等領域中。
K9F1208是Samsung公司生產的512 Mb(64M×8位)NAND Flash存儲器。該存儲器的工作電壓為2.7~3.6 V,內部存儲結構為528字節×32頁×4 096塊,頁大小為528字節,塊大小為(16 KB+512字節);可實現程序自動擦寫、頁程序、塊擦除、智能的讀/寫和擦除操作,一次可以讀/寫或者擦除4頁或者塊的內容,內部有命令寄存器。如圖2所示,該器件按功能可以劃分為:存儲陣列、輸入/輸出緩沖、命令寄存器、地址譯碼寄存器和控制邏輯產生。其中,命令寄存器用來確定外部設備對存儲器進行操作的類型;地址譯碼寄存器用于保存被訪問的地址并產生相應的譯碼選通信號。主設備通過8位I/O端口分時復用訪問器件命令、地址和數據寄存器,完成對芯片內存儲器的訪問。
對于K9F1208的操作主要有頁讀取和頁編程操作。圖3是NAND Flash的標準頁讀取時序圖。具體的頁讀取操作如下:發命令階段,在片選信號CE有效的情況下,首先命令允許信號CLE有效,此時寫入信號WE有效,芯片準備好信號R/B置高,表示準備好;同時向I/O口發送讀操作命令(0x00或0x01),表示是讀操作。發地址階段,此時片選有效,地址允許信號ALE有效,寫入信號WE保持有效,連續發送4個地址字;K9F1208的地址寄存器接收到地址值后,R/B信號將維持“忙”一段時間,此后R/B變為準備好狀態。是數據輸出階段,每次讀有效信號置低有效時,將會輸出一組數據。如此往復直到所有數據輸出完畢。
5.1 硬件部分
uPSD3234A的數據總線DATA0~7直接連接到K9F1208的數據線上。K9F1208的讀/寫信號是直接通過uPSD3234A的讀/寫信號驅動的,K9F1208的ALE地址允許信號、CLE命令允許信號、片選使能信號分別由uPSD3234A的P43、P44、P45來控制,而K9F1208的R/B狀態輸出信號由uPSD3234A的P46來讀取。硬件連接如圖5所示。根據該硬件連接的情況,在驅動過程中,可以在uPSD3234A中定義一個無效地址,通過對該無效地址進行讀寫來控制WR和RD信號。
本設計的驅動程序包括基本的操作函數和Flash操作API函數。基本的操作函數包括輸入命令值、輸入地址值、輸入數據值、讀取數據值和讀取狀態等函數。由于K9F1208是無地址的,故先定義一個外部存儲器的空地址來對它進行空寫和空讀。定義的語句為:
xdata unsigned char rK9Fl208DATA _at_0x5000000;
根據硬件連接圖,基本API函數的程序為:
程序說明:賦予P4_5為0,使得CE信號成低電平,從而片選K9F1208有效;賦予P4_4為1,使得CLE信號成高電平,從而使K9F1208的命令允許信號有效;賦予P4_3為0,使得ALE信號成低電平,從而使K9F1208的地址允許信號無效;對rK9F1208DATA進行空寫命令字,使得WE信號成低電平,K9F1208的命令寄存器從數據總線接收到命令字,并執行相應的操作。
(2) 輸入地址值函數
(3) 輸入數據值函數
(4) 讀取數據值函數
(5) 讀取狀態函數
為了合理地操作K9F1208,還添加了不選中K9F1208的函數,以便在頁讀取和頁編程操作后,使K9F1208不工作。程序只是讓P4_5、P4_4、P4_3為低電平,從而使得K9F1208的片選信號、命令允許信號、地址允許信號無效。宏定義語句如下:
#define flash_inactive( ){P4_5=0;P4_4=0;P4_3=0;)
Flash操作API函數包括復位K9F1208、驗證K9F1208的ID號、擦除K9F1208某一扇區、湊取K9F1208某一扇區數據和寫入K9F1208某一扇區數據等函數。因為篇幅關系,只介紹頁讀取和頁編程函數。
結 語
本文介紹了Samsung公司K9F1208芯片特點,并在此基礎上設計了基于uPSD3234A的驅動設計。該方法對其他相關SoC中實現NAND Flash的控制方法設計有直接的參考意義,可廣泛應用于需要大存儲容量的低端設備中。