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