張東磊
【摘要】在公司現(xiàn)有硬件平臺(tái)基礎(chǔ)上,開發(fā)設(shè)計(jì)測(cè)試程序?qū)ORFLASH存儲(chǔ)芯片進(jìn)行測(cè)試。實(shí)驗(yàn)結(jié)果表明,該測(cè)試程序的設(shè)計(jì)能避免由于無(wú)測(cè)試工具而無(wú)法測(cè)試到的儲(chǔ)存區(qū)塊損壞造成的設(shè)備運(yùn)行異常,并實(shí)現(xiàn)測(cè)試自動(dòng)化。
【關(guān)鍵詞】NORFLASH;存儲(chǔ)芯片;測(cè)試程序
NOR FLASH技術(shù)是Intel于1988年開發(fā)的,其特點(diǎn)是芯片內(nèi)執(zhí)行,即應(yīng)用程序可以直接在FLASH閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中,是現(xiàn)在市場(chǎng)上主要的非易失閃存技術(shù)之一。其傳輸效率高,在1~4MB的小容量時(shí)具有很高的成本效益[1]?;谄涮攸c(diǎn)NOR FLASH存儲(chǔ)芯片市場(chǎng)應(yīng)用率高,而目前沒(méi)有專門對(duì)NOR FLASH存儲(chǔ)芯片進(jìn)行測(cè)試的工裝和工具。本文就筆者開發(fā)的NOR FLASH存儲(chǔ)芯片測(cè)試程序予以詳細(xì)分析。
圖1 NORFLASH硬件原理圖
圖2 NORFLASH命令定義
1.NOR FLASH存儲(chǔ)芯片
NOR FLASH是INTEL在1988年推出的一款商業(yè)性閃存芯片,它能夠提供完整的尋址與數(shù)據(jù)總線,并允許隨機(jī)存取存儲(chǔ)器上的任何區(qū)域,而且它可以忍受一萬(wàn)次到一百萬(wàn)次抹寫循環(huán),是早期的可移除式閃存儲(chǔ)媒體的基礎(chǔ)。NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片內(nèi)執(zhí)行(這意味著存儲(chǔ)在NOR FLASH上的程序不需要復(fù)制到RAM就可以直接運(yùn)行)。因此,在嵌入式系統(tǒng)中,NOR FLASH很適合作為啟動(dòng)程序的存儲(chǔ)介質(zhì)。NOR FLASH的讀取和RAM類似,只要能夠提供數(shù)據(jù)的地址,數(shù)據(jù)總線就能夠正確的給出數(shù)據(jù)。而對(duì)NOR FLASH的寫操作需要遵循特定的命令序列,最終由芯片內(nèi)部的控制單元完成寫操作。
為了便于訪問(wèn),從支持的最小訪問(wèn)單元來(lái)看,NOR FLASH一般分為8位的和16位的(也有很多NOR FLASH芯片同時(shí)支持8位模式和16位模式)具體的工作模式通過(guò)特定的管腳進(jìn)行選擇。FLASH一般都分為很多個(gè)SECTOR,每個(gè)SECTOR包括一定數(shù)量的存儲(chǔ)單元。對(duì)有些大容量的FLASH,還分為不同的BANK,每個(gè)BANK包括一定數(shù)目的SECTOR。FLASH的擦除操作一般都是以SECTOR,BANK或是整片F(xiàn)LASH為單位的。
圖3 測(cè)試程序主流程圖
2.設(shè)計(jì)測(cè)試程序
在編寫測(cè)試程序時(shí),設(shè)計(jì)三種測(cè)試方案:
方案1:
在安裝J-link驅(qū)動(dòng)程序時(shí),本身自帶一個(gè)工具J-FLASH ARM.exe,可以對(duì)NOR FLASH進(jìn)行單次的讀、寫、擦除操作,并且可以測(cè)試讀、寫、擦除的速度。由于本工具不是開源的,不能夠增加和修改功能,基于單次操作的局限性,放棄方案1。但是在編寫測(cè)試程序時(shí),可以參考本工具的功能設(shè)計(jì)。
方案2:
通過(guò)對(duì)嵌入式系統(tǒng)移植的研究,發(fā)現(xiàn)可以通過(guò)移植U-boot對(duì)存儲(chǔ)設(shè)備進(jìn)行操作,而且u-boot對(duì)于存儲(chǔ)設(shè)備的操作驅(qū)動(dòng)是經(jīng)過(guò)IT精英共同驗(yàn)證過(guò)的。但考慮到剛開始接觸系統(tǒng)移植,在短時(shí)間內(nèi)無(wú)法完成測(cè)試程序的編寫,所以放棄方案2。
方案3:
在公司現(xiàn)有的監(jiān)控平臺(tái)上,增加對(duì)存儲(chǔ)設(shè)備的讀、寫、擦除操作。本方案不需要重新設(shè)計(jì)硬件平臺(tái),大大節(jié)省了設(shè)計(jì)的時(shí)間。本測(cè)試程序可以對(duì)NORFLASH存儲(chǔ)芯片進(jìn)行讀寫測(cè)試和壽命測(cè)試。在測(cè)試過(guò)程中,如果發(fā)現(xiàn)芯片讀寫錯(cuò)誤,本程序可以通過(guò)串口將錯(cuò)誤信息打印到調(diào)試工具供用戶查看。測(cè)試過(guò)程中不需要用戶參與,實(shí)現(xiàn)測(cè)試自動(dòng)化。
本次測(cè)試是編寫存儲(chǔ)設(shè)備的測(cè)試程序,可以長(zhǎng)時(shí)間對(duì)存儲(chǔ)設(shè)備進(jìn)行讀、寫、擦除操作,從而可以驗(yàn)證存儲(chǔ)設(shè)備的特性:在高溫條件下,對(duì)存儲(chǔ)設(shè)備進(jìn)行讀、寫、擦除操作中正確無(wú)誤;存儲(chǔ)設(shè)備的讀、寫、擦除操作有一定的次數(shù)限制。
圖4 讀寫操作
3.測(cè)試NOR FLASH存儲(chǔ)芯片
在對(duì)FLASH進(jìn)行寫操作的時(shí)候,每個(gè)BIT可以通過(guò)編程由1變?yōu)?,但不可以有0修改為1。為了保證寫操作的正確性,在執(zhí)行寫操作前,都要執(zhí)行擦除操作。擦除操作會(huì)把FLASH的一個(gè)SECTOR,一個(gè)BANK或是整片F(xiàn)LASH的值全修改為0xFF。這樣,寫操作就可以正確完成了。
由于NOR FLASH沒(méi)有本地壞區(qū)管理,所以一旦存儲(chǔ)區(qū)塊發(fā)生毀損,軟件或驅(qū)動(dòng)程序必須接手這個(gè)問(wèn)題,否則可能會(huì)導(dǎo)致設(shè)備發(fā)生異常。在解鎖、抹除或?qū)懭隢OR FLASH區(qū)塊時(shí),特殊的指令會(huì)先寫入已繪測(cè)的記憶區(qū)的第一頁(yè)(Page)。接著快閃記憶芯片會(huì)提供可用的指令清單給實(shí)體驅(qū)動(dòng)程序,而這些指令是由一般性閃存接口(CommON FLASH memory Interface,CFI)所界定的。與用于隨機(jī)存取的ROM不同,NOR FLASH也可以用在存儲(chǔ)設(shè)備上。
在NOR FLASH的讀取數(shù)據(jù)的方式來(lái)看,它與RAM的方式是相近的,只要能夠提供數(shù)據(jù)的地址,數(shù)據(jù)總線就能夠正確的揮出數(shù)據(jù)??紤]到以上的種種原因,多數(shù)微處理器將NOR FLASH當(dāng)做原地運(yùn)行(Execute in place,XIP)存儲(chǔ)器使用,這其實(shí)意味著存儲(chǔ)在NOR FLASH上的程序不需要復(fù)制到RAM就可以直接運(yùn)行。
本測(cè)試中硬件平臺(tái)使用的ARM芯片是S3C 2410,該芯片具備外接NORFLASH的引腳,下面是S3C2410和NORFLASH的接線圖如圖1所示。
本平臺(tái)使用的ARM芯片型號(hào)為S3C2410,NORFLASH型號(hào)為AM29LV160DB,下文將用ARM代替S3C2410,NORFLASH代替AM29LV160DB。
NORFLASH有2種讀寫模式:8位模式和16位模式。對(duì)8位的NOR FLASH芯片,或是工作在8-BIT模式的芯片來(lái)說(shuō),一個(gè)地址對(duì)應(yīng)一個(gè)BYTE(8-BIT)的數(shù)據(jù)。例如一塊8-BIT的NOR FLASH,假設(shè)容量為4個(gè)BYTE。那芯片應(yīng)該有8個(gè)數(shù)據(jù)信號(hào)D7-D0和2個(gè)地址信號(hào),A1-A0。地址0x0對(duì)應(yīng)第0個(gè)BYTE,地址0x1對(duì)應(yīng)于第1BYTE,地址0x2對(duì)應(yīng)于第2個(gè)BYTE,而地址0x3則對(duì)應(yīng)于第3個(gè)BYTE對(duì)16位的NOR FLASH芯片,或是工作在16-BIT模式的芯片來(lái)說(shuō),一個(gè)地址對(duì)應(yīng)于一個(gè)HALF-WORD(16-BIT)的數(shù)據(jù)。例如,一塊16-BIT的NOR FLASH,假設(shè)其容量為4個(gè)BYTE。那芯片應(yīng)該有16個(gè)數(shù)據(jù)信號(hào)線D15-D0和1個(gè)地址信號(hào)A0。地址0x0對(duì)應(yīng)于芯片內(nèi)部的第0個(gè)HALF-WORD,地址0x1對(duì)應(yīng)于芯片內(nèi)部的第1個(gè)HALF-WORD。通過(guò)上圖地址線的連接方式可知,NORFLASH使用的字模式。上圖中,LADDR1連接A0為字模式,LADDR0連接A0為字節(jié)模式。
基于芯片的測(cè)試需求,測(cè)試程序主要有2個(gè)功能:第1個(gè)允許用戶可以設(shè)置擦寫次數(shù),以便用戶進(jìn)行芯片壽命的測(cè)試。第2個(gè)根據(jù)用戶設(shè)置擦寫次數(shù),向芯片的35個(gè)扇區(qū)寫0,然后檢測(cè)扇區(qū)的數(shù)據(jù)是否為0。
NORFLASH數(shù)據(jù)手冊(cè)中對(duì)芯片的操作有專有的命令,如圖2所示。
芯片ID檢測(cè)功能:
如圖2中Manufacturer ID命令定義,通過(guò)下面的命令可以得到芯片的Manufacturer ID:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x9090);
manId=_RD(0);
如圖2中Device ID命令定義,通過(guò)下面的命令可以得到芯片的Device ID:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x9090);
devId=_RD(0x1);
從圖2中可以得到manId為0X01,devId為0X2249。
基于扇區(qū)的擦除功能
如圖2中Sector Erase命令定義,通過(guò)下面的命令可以擦除芯片對(duì)應(yīng)的扇區(qū):
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0x8080);
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(BADDR2WADDR(targetAddr),0x3030);
數(shù)據(jù)寫入NorFlash功能
如圖2中program命令定義,通過(guò)下面的命令將對(duì)應(yīng)數(shù)據(jù)寫到NorFlash中:
_WR(0x555,0xaaaa);
_WR(0x2aa,0x5555);
_WR(0x555,0xa0a0);
*tempPt=data;
將NORFLASH數(shù)據(jù)讀到SDRAM功能
NORFLASH的讀取操作,不需要特殊的命令,它的操作和SDRAM的操作一樣。
基于以上介紹的驅(qū)動(dòng)函數(shù)的功能,我們可以靈活的使用它們編寫自己的應(yīng)用程序,我們本次實(shí)驗(yàn)的目的是設(shè)計(jì)NORFLASH芯片的測(cè)試程序,函數(shù)流程圖如圖3所示。
測(cè)試程序開始之前,需要設(shè)置NOR FLASH的讀寫次數(shù),這個(gè)讀寫次數(shù)可以進(jìn)行作為芯片壽命測(cè)試的參考。設(shè)置完成以后,選擇“對(duì)整個(gè)NOR FLASH寫0”命令,然后測(cè)試程序按照?qǐng)D3的流程進(jìn)行。
在程序進(jìn)行讀寫操作過(guò)程中,測(cè)試程序會(huì)順序?qū)?5個(gè)扇區(qū)進(jìn)行讀寫操作,并將操作結(jié)果通過(guò)串口打印出來(lái)。讀寫操作流程圖如圖4所示。
4.結(jié)束語(yǔ)
基于公司現(xiàn)有硬件平臺(tái)設(shè)計(jì)的NOR FLASH存儲(chǔ)芯片程序,可以幫助我們進(jìn)行NOR FLASH芯片的自動(dòng)化測(cè)試,有效防止了由于NOR FLASH沒(méi)有本地壞區(qū)管理,一旦存儲(chǔ)區(qū)塊發(fā)生毀損,可能會(huì)出現(xiàn)導(dǎo)致設(shè)備發(fā)生異常,并且實(shí)現(xiàn)測(cè)試自動(dòng)化,節(jié)省了測(cè)試時(shí)間,也保證了測(cè)試的精度,確保了NOR FLASH存儲(chǔ)芯片的穩(wěn)定可靠性。
參考文獻(xiàn)
[1]李亞峰,歐文盛.ARM嵌入式Linux系統(tǒng)開發(fā)從入門到精通[M].北京:清華大學(xué)出版社,2007.