韓金利
(山西機電職業(yè)技術學院 數(shù)控工程系,山西 長治 046000)
隨著嵌入式系統(tǒng)的發(fā)展,Nor Flash和Nand Flash已經(jīng)成為當今市場上兩種重要的非易失閃存技術。由于Nor Flash的成本較高,容量較小,因此Nor Flash比較適合于存儲少量的代碼。而Nand Flash的單元尺寸幾乎是Nor Flash器件的一半,相對于并口Nor Flash而言,引腳數(shù)目大大減少,芯片接口簡單,使得芯片相關的外圍電路更簡化,避免了繁瑣的硬件連線[1],而且價格便宜,特別適合存儲大量數(shù)據(jù),具有很強的實用性。
本文采用三星公司的32位RISC微處理器S3C2440作為控制器核心。S3C2440是高性能嵌入式微處理器,主頻可達400 MHz,具有外圍接口豐富、體積小、功耗低等特點;CPU電壓分為2組,核心電壓為1.2 V,I/O引腳電壓為3.3 V[2]。S3C2440要完成對Nand Flash的讀寫操作必須具備兩個條件:①對S3C2440 CPU上的Nand Flash控制器進行合理配置;②外圍必須有與之相配套的Nand Flash存儲芯片。要讀取Nand Flash存儲器中的數(shù)據(jù),必須通過Nand Flash控制器發(fā)送命令給存儲器,所以,Nand Flash僅僅相當于S3C2440的外部設備,并不位于S3C2440本身的內(nèi)存地址區(qū)[3]。
本電路選用的Nand Flash為三星公司的K9F2G08 U0B芯片,它是一個256 MB的內(nèi)存,每頁的大小為2 112 B(2 048 B+64 B備用),每個塊的大小132 k B為(128 k B+4 k B備用)。K9F2G08 U0B的8個I/O引腳為數(shù)據(jù)/地址復用引腳。Nand Flash K9F2G08 U0B與S3C2440的接口控制電路如圖1所示。
Nand Flash中8個I/O引腳為數(shù)據(jù)/地址/命令復用引腳。Nand Flash控制器設計命令鎖存使能(Co mmand Latch Enable,CLE)或者地址鎖存使能(Address Latch Enable,ALE),一開始先發(fā)出 CLE(或ALE)命令,這樣Nand Flash內(nèi)部才能根據(jù)傳入的內(nèi)容做出相應的動作。
在K9F2 G08 U0B與S3C2440芯片間進行數(shù)據(jù)交換時,S3C2440必須對相關引腳進行配置,需要配置的引 腳 有 NCON、OM0、OM1、GPG13、GPG14 和GPG15。其中,OM0、OM1決定S3C2440采用何種啟動方式(Nand Flash或者 Nor Flash),這里兩個引腳都接為低電平,S3C2440設置為Nand Flash啟動方式,NCON與GPG13、GPG14相配合設置,確定存儲器的頁容量和地址周期。GPG15確定存儲器的總線寬度,這里設置為0,表示寬度為8位。
由于S3C2440芯片中集成了Nand Flash芯片控制器,因此對Nand Flash芯片進行讀寫操作,只與S3C2440中的4個寄存器有關,這4個寄存器為NFCONT、NFCMMD、NFADDR和NFDATA。
本設計中S3C2440采用Nand Flash啟動方式,上電后,CPU首先將Nand Flash中前4 k B的數(shù)據(jù)自動加載到SRA M中來運行,即ARM在Nand Flash啟動模式下啟動時,系統(tǒng)會將Nand Flash中前4 k B代碼拷貝到SRA M(也就是Steppingstone中);然后Nand Flash中的全部程序代碼拷貝到SDRA M中,最后由SRA M跳轉(zhuǎn)到SDRA M,程序正常執(zhí)行。其啟動加載過程如圖2所示。
本文中的部分功能用C語言實現(xiàn),故在程序開頭設置堆棧,再對SDRA M初始化,對Nand Flash控制器進行配置,并使用匯編語言中的R0、R1、R2寄存器傳入?yún)?shù),然后啟動讀Nand Flash操作函數(shù),將Nand Flash數(shù)據(jù)讀入SDRA M中,最后調(diào)用閃燈程序。啟動流程如圖3所示。
圖1 Nand Flash K9F2G08 U0B與S3C2440的接口控制電路
圖2 啟動加載過程
圖3 啟動流程
Nand Flash芯片控制主要分兩個部分:①nand_init()中的初始化函數(shù),如nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_deselect_chip();②nand_read()中的讀寫函數(shù),如nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_deselect_chip()、nandflash_write_addr()、nandflash_read_data()。這兩部分讀寫函數(shù)相互配合著完成對Nand Flash芯片的讀操作。首先,程序需要讀寫Nand Flash芯片時,會調(diào)用nand_init(void)中的函數(shù),使能 Nand Flash控制器,初始化ECC,禁止片選,設置時序,初始化Nand Flash;接著,nand_read()中的讀寫函數(shù)就會調(diào)用nandflash_select_chip()、nandflash_write_c md()、nandflash_wait_idle()、nandflash_write_addr()、nandflash_read_data()、nandflash_deselect_chip(),最終達到將閃燈函數(shù)寫入SDRA M中。相關函數(shù)調(diào)用路線圖如圖4所示。
圖4 函數(shù)調(diào)用路線圖
Nand Flash中4 k B以后的數(shù)據(jù)被拷貝到片外內(nèi)存中使用,所以在程序設計時必須對Nand Flash進行讀操作。讀操作流程如圖5所示[4]。
Nand Flash讀數(shù)據(jù)函數(shù)關鍵代碼如下:
圖5 Nand Flash讀操作流程
根據(jù)Nand Flash啟動方法,在Linux環(huán)境中,編寫一個閃燈測試程序,并將閃燈函數(shù)運行地址在鏈接文件(*.ld)中定位于0x30000000地址,當程序開始執(zhí)行后,初始化程序?qū)? k B以后的數(shù)據(jù)全部拷貝到SDRA M中,開始地址為0x30000000,在初始化程序完成以后,CPU會自動去執(zhí)行30000000地址中的數(shù)據(jù),如果電路板閃燈,則說明Nand Flash中的程序被讀到SDRA M中,表示實驗成功,反之讀取不成功。
以下為鏈接文件中的主要代碼:
調(diào)用Nand Flash前必須為數(shù)據(jù)讀取函數(shù)傳送3個參數(shù):讀取數(shù)據(jù)存放在SDRA M的目的地址、所要讀取數(shù)據(jù)的源地址、所要讀取數(shù)據(jù)的長度。
以下為3個參數(shù)傳遞的關鍵代碼:
該實驗證明,Nand Flash的啟動過程是硬件首先將Nand Flash中前4 k B的內(nèi)容自動加載到片內(nèi)SRA M中,而且這4 k B程序同時也具備將Nand Flash中剩余數(shù)據(jù)拷貝到SDRA M中的功能。
詳細分析了Nand Flash控制器中相關寄存器的配置過程及其啟動原理,并給出了一種讀取Nand Flash中數(shù)據(jù)的方法,文中關鍵代碼段已經(jīng)得到實驗驗證,在相關程序的設計中具有一定的參考價值。
[1]葉林俊.Nand Flash內(nèi)存設備的讀寫控制設計[J].單片機與嵌入式系統(tǒng)應用,2012(12):16-19.
[2]葉林俊.S3C2440 A嵌入式手持終端電源管理系統(tǒng)設計[J].單片機與嵌入式系統(tǒng)應用,2009(9):28-31.
[3]謝韋華,譚永東,徐偉華.Nand Flash的驅(qū)動程序設計[J].單片機與嵌入式系統(tǒng)應用,2009(9):35-38.
[4]韋東山.嵌入式Linux應用完全開發(fā)手冊[M].北京:人民郵電出版社,2008.