1 引 言 隨著嵌人式系統在數碼相機、數字攝像機、移動電話、mp3音樂播放器等移動設備中越來越廣泛的應用,FLASH存儲器已經逐步取代其他半導體存儲元件,成為嵌入式系統中主要數據和程序載體。FLASH存儲器又稱閃存,是一種可在線多次擦除的非易失性存儲器,即掉電后數據不會丟失。FLASH存儲器還具有體積小、功耗低、抗振性強等優點,是嵌入式系統的首選存儲設備。 NAND和NOR FLASH是現在市場上兩種主要的非易失閃存芯片,這兩種類型的FLASH區別在于: NOR類型FLASH可以按照字節訪問,所以存放在FLASH里的程序可以直接執行,而NAND類型FLASH是串行訪問的,需要先把程序讀取到內存然后再從內存中運行。與NOR型相比,NAND型閃存的優點是容量大,但是NAND型的速度比較慢,因為他的I/O 端口只有8(或16)個,要完成地址和數據的傳輸就必需讓這些信號輪流傳送。NAND型FLASH具有極高的單元密度,容量可以比較大,價格相對便宜。本文采用Samsung公司的NAND型FLASH存儲設備K9F2808U0C。 2 系統硬件結構及接口電路 2.1 ARM芯片介紹 ARM公司自1990年正式成立以來,在32位RISC(Reduced Instruction Set Computer)CPU開發領域不斷取得突破,目前已經占有75%以上的32位RISC嵌入式產品市場。在低功耗、低成本的嵌人式應用領域確立了市場領導地位。 PHILIPS公司的LPC2210是基于一個支持實時仿真和跟蹤的32位ARM7TDMI-STMCPU的微控制器,片內128位寬度的存儲器接口和獨特的加速結構使32位代碼能夠在最大時鐘頻率下運行。LPC2210極低的功耗、多個32位定時器、8路10位ADC以及9個外部中斷使其特別適用于工業控制、醫療系統、訪問控制和POS機。由于內置了寬范圍的串行通信接口,他們也非常適合于通信網關、協議轉換器、嵌入式軟MODEM以及其他各種類型的應用。 2.2 K9F2808U0C芯片的結構和特點 K9F2808U0C是Samsung公司生產的NAND型FLASH存儲器,其功能框圖如圖1所示。 K9F2808U0C存儲容量為132 Mb,其中主數據區為128 Mb,輔助數據區為4 Mb,工作電壓為2.7~3.6 V,I/O端口寬度為8 b。片內寫控制自動實現編程和擦除所有功能,包括內部校驗、脈沖的周期和數據冗余。 芯片的存儲空間是按照塊和頁的概念來組織的,一個芯片分為1 024個塊,每個塊有32頁,每一頁有528 B。528 B中分為512 B的數據區和16個字節的空閑區,空閑區用于存放ECC代碼、壞塊信息和文件系統相關代碼。一個528 B的數據寄存器作為數據緩沖單元,用來實現I/0緩沖和存儲器之間的數據傳輸。芯片的存儲陣列組織如圖2所示。 使用NAND型FLASH的關鍵技術之一是存儲空間的管理。Samsung公司的NAND FLASH存儲器有一些初始無效塊(包含一個或多個壞位的存儲塊),制造商不保證這些塊的可靠性。NAND FLASH容許成品中有壞塊存在,這是采用NAND技術所特有的現象。壞塊的存在并不影響有效塊的性能。但是,系統級的設計必須能夠用地址映射把這些壞塊屏蔽掉。芯片在出廠時,除保存壞塊信息的區域外,其他部分一律被擦除(值為0xFF),對壞塊的讀操作是允許的,但不推薦進行寫和擦除操作,以免由于結構方面的原因使鄰近的塊也失效。系統設計時必須根據初始的壞塊信息識別出壞塊,并建立壞塊列表。進行寫或擦除操作時將欲操作塊的地址與壞塊地址表的地址相比較,若是壞塊則應跳過。為了提高存儲空間的效率,單個位數據錯誤引起的讀寫失敗都可以用ECC(校錯和糾錯)方法處理。 芯片在使用過程中,可能有新壞塊的產生,為了系統的可靠性,必須對此情況加以考慮。在數據寫入或塊擦除操作后,如果讀狀態寄存器出現錯誤,則表示塊內有壞頁存在,也即表明此塊已壞,因為塊內壞頁的存在并不影響其他頁的讀寫,這時可采用塊替換操作來把頁內有用數據轉移到其他空閑塊內,并把壞塊信息存入壞塊表中。 2.3 K9F2808U0C與LPC2210的連接 K9F2808U0C與LPC2210的連接如圖3所示,使用8位數據總線D0~D7與K9F2808U0C的I/O0~I/O7引腳相連,使用數據總線來發送地址、數據和命令。K9F2808U0C的片選信號由CS3控制,即使用LPC2210的外部存儲器接口的Bank3地址空間,而CLE,ALE信號分別由A0,A1控制,所以K9F2808U0C的操作地址如下: 3 讀寫操作流程 K9F2808U0C的頁編程操作流程圖如圖4所示。 首先向I/O寫人編程指令80H,然后使用3個時鐘周期寫入目的地址(A0~A23),接著向I/O寫入數據。數據發送完成后,寫入指令10H啟動頁編程,此時芯片內部的邏輯電路將進行頁擦除和數據編程操作。微控制器可以讀狀態指令70H來讀取狀態寄存器的值,若D6位為1,則表明寫操作完成。 寫操作完成后,通過讀取狀態寄存器的D0位判斷編程是否成功,若D0位為0,則表示編程成功;否則表示編程失敗。 K9F2808U0C的塊擦除和讀數據操作如圖5所示:對于K9F2808U0C的擦除是以塊為單位,擦除時首先寫入塊擦除命令60H,然后輸入要擦除塊的地址,再寫入指令DoH啟動塊擦除。微控制器可以讀取狀態指令70H來讀取狀態寄存器的值,若D6位為1,則表明擦除完成。寫操作完成后,通過讀取狀態寄存器的D0位來判斷擦除是否成功。 對于K9F2808U0C的讀數據操作是以頁為單位,讀數據時首先寫入讀數據命令00H,然后輸入要讀取頁的地址,接著從數據寄存器中讀取數據,最后進行ECC校驗。 4 在μC/OS實時操作系統下的實現和性能驗證 μC/OS是一個多任務的實時操作系統,專為嵌入式應用而設計,可用于各類8位、16位和32位單片機或DSP,已有10余年應用史,其安全性和實時性得到了廣泛的認同,在嵌入式領域發揮著重要作用。該操作系統公開了他的實時性內核源碼,同時提供了較多的應用接口函數。通過在其實時內核的基礎上做少量的修改,便可將對NAND FLASH的操作移植到μC/OS中,利用OSTa-skCreateExt()函數創建任務并檢查堆?臻g,利用PC-ElapsedInit()初始化時間測量功能。共建立5個任務,分別為空閑任務、統計任務、頁編程任務、塊擦除任務和讀數據任務,程序代碼示意如下: 5 結 語 以Samsung NAND FLASH器件K9F2808U0C為例,通過PHILIPS LPC2210實現對存儲器的器件操作,以μC/OS實時操作系統為平臺完成測試實驗,將得到的實驗結果與Satnsung公司的K9F2808UOC FLASH Memory手冊進行對比,表明該設計滿足設計要求,達到預期目標。 |