超大容量存儲(chǔ)器K9F2G08U0M及其在管道通徑儀中的應(yīng)用
2007-10-30
作者:張?jiān)獎(jiǎng)P,,靳世久,李一博,,牛 永
摘 要: 新型超大容量" title="超大容量">超大容量Flash存儲(chǔ)器K9F2G08U0M的基本組織結(jié)構(gòu),給出了存儲(chǔ)器與C8051F020單片機(jī)外部存儲(chǔ)器接口" title="存儲(chǔ)器接口">存儲(chǔ)器接口(EMIF)的硬件連接方式以及存儲(chǔ)器的主要操作流程和部分C語(yǔ)言代碼,。
關(guān)鍵詞: K9F2G08U0M 外部存儲(chǔ)器接口? 管道通徑儀
?
閃存(Flash Memory)是一種可以進(jìn)行電擦寫(xiě)并且掉電后信息不丟失(非易失,,Non-Volatile)的存儲(chǔ)器,具有功耗低,、擦寫(xiě)速度快等特點(diǎn),,被廣泛應(yīng)用于外部存儲(chǔ)領(lǐng)域。
管道運(yùn)輸作為當(dāng)前油氣資源的主要輸送手段,,其運(yùn)行安全性受到越來(lái)越多的重視,。由于不同的要求使得鋪設(shè)的管道直徑不盡相同,并且管道在長(zhǎng)期運(yùn)行過(guò)程中也會(huì)存在各種變形,,這對(duì)管道缺陷檢測(cè)器的運(yùn)行有相當(dāng)大的影響,,容易造成卡死等后果。通徑儀就是鑒于此研制的記錄管徑變動(dòng)情況的儀器,。一般情況下,,通徑儀連續(xù)運(yùn)行幾百公里,相應(yīng)記錄的數(shù)據(jù)將達(dá)到上百兆字節(jié),。32MB,、64MB的閃存已經(jīng)不能滿足需求,。因此選用了Samsung公司開(kāi)發(fā)的K9F2G08U0M,其單片容量高達(dá)264MB,,可滿足工程需求,。
本文將介紹該存儲(chǔ)器的主要性能及其在管道通徑儀中的應(yīng)用。
1 K9F2G08U0M存儲(chǔ)器簡(jiǎn)介
從接口角度看,,雖然K9F2G08U0M的容量和尋址范圍遠(yuǎn)遠(yuǎn)超過(guò)常見(jiàn)單片機(jī)的容量和尋址范圍,,但由于芯片上的寫(xiě)控制器能自動(dòng)控制所有編程和擦除功能,提供必要的重復(fù)脈沖,、內(nèi)部確認(rèn)和數(shù)據(jù)空間,而且只通過(guò)I/O" title="I/O">I/O接口接收單片機(jī)的命令和數(shù)據(jù)而不需要地址線,,因此實(shí)際操作起來(lái)非常方便,。另外芯片是通過(guò)“與非”單元結(jié)構(gòu)增大容量,所以沒(méi)有因此而削弱自身性能,;芯片具有獨(dú)立的1頁(yè)大小的數(shù)據(jù)存儲(chǔ)器和緩存存儲(chǔ)器,,因此可以在0.2ms內(nèi)完成2112B的頁(yè)編程操作,在2ms內(nèi)完成128KB的塊擦除操作,,同時(shí)數(shù)據(jù)區(qū)內(nèi)的數(shù)據(jù)能以30ns/B的速度讀出,。
整個(gè)存儲(chǔ)區(qū)被分為2 048個(gè)相互獨(dú)立的塊,可從邏輯上和物理上對(duì)塊的組織結(jié)構(gòu)分類,。
圖1為塊的邏輯結(jié)構(gòu),,每個(gè)塊分為64頁(yè),每頁(yè)為2 112B(2 048B+額外存儲(chǔ)區(qū)的64B),。芯片通過(guò)頁(yè)地址和頁(yè)內(nèi)字節(jié)地址訪問(wèn)每一個(gè)字節(jié),。通常頁(yè)地址稱為行地址" title="行地址">行地址,而頁(yè)內(nèi)字節(jié)地址稱為列地址,,即264MB=2048塊×64頁(yè)/塊×2112字節(jié)/頁(yè)=217行×2112列,。因此,行地址需要3個(gè)字節(jié),,列地址2個(gè)字節(jié),,輸入順序如表1所示。
?
?
從物理結(jié)構(gòu)上看,,該芯片為“與非”結(jié)構(gòu)存儲(chǔ)器,,每個(gè)塊由兩個(gè)“與非”結(jié)構(gòu)串組成,每個(gè)“與非”結(jié)構(gòu)串包含16 896個(gè)“與非”結(jié)構(gòu),,每個(gè)“與非”結(jié)構(gòu)由32個(gè)基本單元(每個(gè)基本單元為1位)組成,,這32個(gè)基本單元分別位于不同的頁(yè)內(nèi),由此得到每個(gè)塊的物理結(jié)構(gòu),,如圖2所示,。
?
2 硬件連接設(shè)計(jì)
管道通徑儀的結(jié)構(gòu)框圖如圖3所示,。管道檢測(cè)時(shí)MCU采集參數(shù)并存儲(chǔ)在Flash中,檢測(cè)完畢后通過(guò)USB接口傳輸至上位機(jī)進(jìn)行數(shù)據(jù)分析,。
?
如前所述,,對(duì)K9F2G08U0M的操作可以通過(guò)只向I/O接口發(fā)送數(shù)據(jù)(包括命令碼、行列地址碼等)來(lái)實(shí)現(xiàn),,因此最直接的方式是使用單片機(jī)的一個(gè)端口作為與芯片的數(shù)據(jù)接口,,并以單片機(jī)的GPIO引腳連接CE、ALE,、CLE以及,,編程時(shí)按照手冊(cè)中的時(shí)序圖控制這些引腳。但是由于每次操作這些引腳都需要大量的控制線電平轉(zhuǎn)換,,使程序十分繁冗,。
由于C8051F020提供了外部存儲(chǔ)器接口(EMIF),而接口時(shí)序由EMIF硬件產(chǎn)生,,使其對(duì)片外擴(kuò)展的器件操作像對(duì)內(nèi)存單元的尋址一樣簡(jiǎn)便快捷,。下面采用這種硬件連接方式,對(duì)K9F2G08U0M的主要操作進(jìn)行介紹,。電路如圖4所示,,C8051F020只畫(huà)出了EMIF接口部分,選用非復(fù)用方式,,以IO7~0作為數(shù)據(jù)線,,CE、ALE,、CLE作為地址線,。由于通徑儀中需要隨時(shí)寫(xiě)入數(shù)據(jù),因此寫(xiě)保護(hù)端接高電平,。
采用外部存儲(chǔ)器接口對(duì)器件編程時(shí),,最重要的是保證總線時(shí)序與器件時(shí)序一致。C8051F020的EMIF接口時(shí)序能夠以系統(tǒng)時(shí)鐘周期為單位編程,,因此允許連接具有不同建立時(shí)間和保持時(shí)間要求以及不同/WR,、/RD選通脈沖寬度的器件。
?
單片機(jī)EMIF在非復(fù)用方式,,一次片外XRAM 操作的最小執(zhí)行時(shí)間為5 個(gè)SysClk 周期(用于或 脈沖的1 個(gè)SysClk+4個(gè)額外SysClk),。若單片機(jī)系統(tǒng)采用20MHz晶振,一次MOVX操作的最小執(zhí)行時(shí)間為250ns,,而K9F2G08U0M交流參數(shù)中最小建立保持時(shí)間的上界為100ns,,則即使采用EMI0TC最小的時(shí)序參數(shù)也不需要在程序中額外加入延時(shí)指令。
3 軟件設(shè)計(jì)
本系統(tǒng)采用C語(yǔ)言編程,,提高了開(kāi)發(fā)速度并降低了維護(hù)難度,。下面分別介紹存儲(chǔ)器的主要操作,。
3.1 按頁(yè)讀
K9F2G08U0M中有一個(gè)2112B即1頁(yè)大小的數(shù)據(jù)寄存器,這就決定了存儲(chǔ)器的讀操作是以1頁(yè)為基本單元進(jìn)行的,。如圖5所示,,寫(xiě)入30H后,行地址所指定的頁(yè)中的數(shù)據(jù)將在25?滋s內(nèi)傳輸?shù)綌?shù)據(jù)寄存器中,,然后在脈沖的作用下,,不但可以從指定的列地址開(kāi)始連續(xù)讀到該頁(yè)末尾,也可以按照流程圖中的虛線部分輸入隨機(jī)讀指令碼,,任意讀取該頁(yè)中的內(nèi)容,,并且不受次數(shù)限制。
?
下面是按頁(yè)讀操作函數(shù)的C語(yǔ)言代碼,。
sbit RdyorBsy=P0^0,;
unsigned char xdata?* data pK9F;
void PageRead(unsigned int ColAdd,,unsigned long
RowAdd,unsigned int len)
{
unsigned int i=0,;
unsigned char ColTemp,,RowTemp;
ColTemp=(unsigned char)(ColAdd>>8),;
RowTemp=(unsigned char)(RowAdd>>16),;
ColTemp &=0x0F;
RowTemp &=0x01,;
pK9F=0x8002,;
?* pK9F=0x00;
pK9F=0x8001,;
?* pK9F=(unsigned char)(ColAdd),;
?* pK9F=ColTemp;
?* pK9F=(unsigned char)(RowAdd),;
?* pK9F=(unsigned char)(RowAdd>>8),;
?* pK9F=RowTemp;
?pK9F=0x8002,;
?* pK9F=0x30,;
while(RdyorBsy);
while(!RdyorBsy),;
pK9F=0x8000,;
for(i=0;i
}
3.2 頁(yè)編程
向器件寫(xiě)入數(shù)據(jù)時(shí)先將數(shù)據(jù)寫(xiě)入數(shù)據(jù)寄存器中,,器件寫(xiě)入操作是基于頁(yè)進(jìn)行的,同時(shí)允許在一個(gè)頁(yè)編程周期內(nèi)對(duì)一頁(yè)內(nèi)的連續(xù)部分編程,。若不進(jìn)行擦除,,則對(duì)同一頁(yè)的連續(xù)部分編程不能超過(guò)4次。
器件支持在1頁(yè)范圍內(nèi)的隨機(jī)數(shù)據(jù)輸入,,由隨機(jī)輸入命令碼85H啟動(dòng),,如圖6中虛線框內(nèi)部分所示,在1頁(yè)范圍內(nèi)可以啟動(dòng)任意多次隨機(jī)輸入操作,。數(shù)據(jù)輸入完畢后,,寫(xiě)入頁(yè)編程確認(rèn)命令10H,將數(shù)據(jù)寄存器中的內(nèi)容寫(xiě)入存儲(chǔ)區(qū),。寫(xiě)入完成后,,需要讀狀態(tài)寄存器" title="狀態(tài)寄存器">狀態(tài)寄存器(通過(guò)寫(xiě)入70H實(shí)現(xiàn))判斷操作是否成功。若未能成功寫(xiě)入,,應(yīng)將當(dāng)前塊聲明為壞塊,,并進(jìn)行塊數(shù)據(jù)替換操作,以保證整個(gè)系統(tǒng)的可靠性,。
此外應(yīng)注意,,同一塊內(nèi)頁(yè)編程時(shí)必須從地址最低的頁(yè)開(kāi)始向高地址的頁(yè)依次編程,頁(yè)地址隨機(jī)的頁(yè)編程是被禁止的,。
下面是頁(yè)編程子函數(shù)的C語(yǔ)言代碼,。
?
unsigned char PageWrite(unsigned int ColAdd,unsigned long
RowAdd)
{
unsigned int data i=0,;
unsigned char data Status=0,;
unsigned char data ColTemp,RowTemp,;
ColTemp=(unsigned char)(ColAdd>>8),;
RowTemp=(unsigned char)(RowAdd>>16);
ColTemp &=0x0F,;
RowTemp &=0x01,;
pK9F=0x8002;
?* pK9F=0x80,;
pK9F=0x8001,;
?* pK9F=(unsigned char)(ColAdd);
?* pK9F=ColTemp,;
?* pK9F=(unsigned char)(RowAdd),;
?* pK9F=(unsigned char)(RowAdd>>8);
?* pK9F=RowTemp,;
pK9F=0x8000,;
for(i=0,;i<2112;i++)
??* pK9F=InputData[i],;
pK9F=0x8002,;
? * pK9F=0x10;
while(RdyorBsy),;
while(!RdyorBsy),;
pK9F=0x8002;
?* pK9F=0x70,;
pK9F=0x8000,;
Status=* pK9F;
Status &=0x01,;
return (Status),;
}
3.3 塊擦除
擦除操作以塊為單位進(jìn)行,由于器件分為2 048塊,,因此輸入的地址碼中只有A18~A2的11位有效,,其余位將被忽略。通過(guò)輸入確認(rèn)命令碼來(lái)啟動(dòng)擦除以防止誤操作,。塊擦除流程如圖7所示,。同頁(yè)編程操作類似,擦除完畢后也應(yīng)該讀狀態(tài)寄存器并處理返回結(jié)果,。
?
3.4 頁(yè)復(fù)制
頁(yè)復(fù)制操作用來(lái)快速有效地實(shí)現(xiàn)頁(yè)間數(shù)據(jù)移動(dòng),這是由于省去了比較費(fèi)時(shí)的與片外設(shè)備之間的讀寫(xiě)操作,。這一特性的優(yōu)勢(shì)在塊替換操作用于頁(yè)間數(shù)據(jù)復(fù)制時(shí)體現(xiàn)尤為明顯,。其實(shí)該操作是按頁(yè)讀與頁(yè)編程操作的復(fù)合,頁(yè)復(fù)制讀命令35H將頁(yè)中數(shù)據(jù)移至數(shù)據(jù)寄存器中,,而頁(yè)復(fù)制寫(xiě)命令85H將數(shù)據(jù)復(fù)制到目標(biāo)頁(yè)中,。頁(yè)復(fù)制流程圖如圖8所示。
?
該操作也可以將原始頁(yè)中的數(shù)據(jù)修改后寫(xiě)入目標(biāo)頁(yè),,如流程圖8中虛線框內(nèi)部分,。
需要注意的是,頁(yè)復(fù)制操作只能在奇數(shù)頁(yè)之間或偶數(shù)頁(yè)之間進(jìn)行,,奇偶頁(yè)之間的數(shù)據(jù)移動(dòng)將被禁止,。
3.5 緩存區(qū)編程
芯片中除1頁(yè)大小的數(shù)據(jù)寄存器外,還有一個(gè)1頁(yè)大小的緩沖寄存器,。該緩沖寄存器可以在數(shù)據(jù)寄存器參與頁(yè)編程的同時(shí)接收外部數(shù)據(jù),,等待數(shù)據(jù)寄存器空閑時(shí)將數(shù)據(jù)轉(zhuǎn)移其中,然后繼續(xù)接收數(shù)據(jù),。因此,,采用緩存區(qū)編程操作在連續(xù)寫(xiě)入多頁(yè)數(shù)據(jù)時(shí)將會(huì)大大提高效率,。
緩存區(qū)編程流程如圖9所示。當(dāng)?shù)谝唤M數(shù)據(jù)寫(xiě)入緩沖寄存器時(shí),,寫(xiě)入緩存命令15H,,將數(shù)據(jù)傳遞給數(shù)據(jù)寄存器并啟動(dòng)頁(yè)編程,然后使緩沖寄存器空閑,,準(zhǔn)備接收下一組數(shù)據(jù),。在這個(gè)過(guò)程中芯片將處于忙狀態(tài),若內(nèi)部編程操作未完成,,忙狀態(tài)持續(xù)的時(shí)間將被延長(zhǎng),。
需要注意的是,該操作只能在同一塊內(nèi)進(jìn)行,,因此在多塊數(shù)據(jù)寫(xiě)入時(shí)需要注意每塊的最后一頁(yè),。若系統(tǒng)僅僅通過(guò)芯片的Ready/Busy引腳監(jiān)測(cè)編程進(jìn)度,則最后一頁(yè)的寫(xiě)入操作應(yīng)該由頁(yè)編程命令10H啟動(dòng),。另外也可以通過(guò)讀狀態(tài)寄存器中的I/O 5位來(lái)判斷,。
K9F2G08U0M是一種新型的超大容量Flash存儲(chǔ)器,以其非易失,、功耗低,、操作簡(jiǎn)單而在單片嵌入式系統(tǒng)中得到廣泛應(yīng)用。本文在管道通徑儀的開(kāi)發(fā)過(guò)程中,,根據(jù)對(duì)外部存儲(chǔ)器接口的深入理解,,將存儲(chǔ)器芯片的兩個(gè)控制線ALE和CLE用作地址線,使得對(duì)存儲(chǔ)器的操作更簡(jiǎn)捷高效,。文中的程序已經(jīng)過(guò)實(shí)際驗(yàn)證,,限于篇幅,只給出按頁(yè)讀和頁(yè)編程部分的代碼,。
參考文獻(xiàn)
[1] K9F2G08U0M數(shù)據(jù)手冊(cè).SAMSUNG Electronics CO.,,LTD,2005.
[2] 潘琢金譯.C8051F020數(shù)據(jù)手冊(cè).Silicon Laboratories,,2005.