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