隨著計算機應用技術的飛速發展,移動存儲設備得到了廣泛的應用。其中CF(Compact Flash)卡誕生于1994年,是最早推出的閃存卡,在眾多產品中其普及率也最高。由于CF卡具有價格低廉、體積小、存儲容量大、高速等特點,因此被廣泛地應用于數碼相機、PDA和筆記本電腦等當前十分熱門的消費類電子產品中。CF卡在其他領域中也得到了廣泛的應用。如本文所述內容就是將CF卡應用于動態腦電圖系統中存儲腦電信號。
由于CF卡中存儲的腦電圖信號要能夠從PC機上讀取出來,所以必須把腦電圖信號以相應的文件格式存儲。下面將介紹采用C8051F020微控制器控制CF卡的文件存儲,并詳細地介紹其軟、硬件的設計。
1 C8051F020與CF卡的接口電路
C8051F020是完全集成的混合信號系統級MCU芯片,使用了Cygnal專利的高速、流水線結構以及與MCS-51指令集完全兼容的CIP-51微處理器內核,具有64條數字I/O引腳,片內有64KB可在系統編程的Flash存儲器,有4 352B的片內RAM,片內有看門狗定時器、VDD監視器和溫度傳感器等;片內的JTAG調試電路允許使用安裝在最終應用系統上的產品MCU進行非侵入式、全速、在系統調試;其MCU都可在工業溫度范圍(-45℃-+85℃)內用2.7“3.6V的電壓工作;端口I/O、RST和JTAG引腳都兼容5V的輸入信號電壓。
CF卡有3種工作模式可供選擇:I/O模式、存儲器模式和IDE模式。CF卡的默認模式是存儲器模式,使用也最為普遍。如果使用存儲器模式則不需要配置任何寄存器。每一種模式的電路連接各不相同。在I/O模式和存儲器模式下,可以采用8位的訪問方式,也可以采用16位的訪問方式。本文所采用的是8位的存儲器模式,其接口電路如圖1所示。
C8051F020的外部數據存儲器接口(EMIF)可用于訪問片外存儲器和存儲器映射的I/O器件。若設置EMIF的配置寄存器EMIOCF的PRTSEL位為‘1’,可使EMIF位于端口7、6、5、4;設置EMD2位為‘1’,可使EMIF工作于非復用方式;設置EMDl~0為‘01’,可使EMIF工作于不帶塊選擇的分片方式。這樣P7口就為數據線D0”D7,P6口為A0“A7,P5口為A8”A15,P4.6、P4.7分別為讀(RD)、寫(WE)線。
由于C8051F020是8位的單片機,所以對CF卡的訪問采用8位的方式較為方便。通過把-CE2設為‘1’即可通過訪問CF卡的D0“D7來存取數據。而-CEl可以作為CF卡的片選信號,通過設-CEl為‘0’來選通CF卡,即-CEl接C8051F020的高位地址P5.7來線選CF卡。當CF卡插入其插座時,CDl和CD2都連接到地(CND);C8051F020的P1.1、P1.2分別連到CDl和CD2,并可以通過檢測P1.1和P1.2來判斷CF卡是否插入CF卡插座。CF卡工作于存儲器模式下,-OE和-WE分別接C8051F020的讀(P1.6)、寫(P1.7)線。當REG為‘0’時,訪問CF卡的屬性寄存器;REG為‘1’時,CF卡在存儲器模式下對數據進行讀寫操作。
2 C8051F020對CF卡的數據讀寫
圖1所示電路的CF卡在存儲器模式下有關數據讀寫的一些寄存器地址如表1所示。
CF卡1個扇區為512B,這些數據都是從表1中的第0個寄存器中讀出,而且每次讀寫數據最小為1個扇區,但也可以設置從第2個寄存器中讀出,1次讀寫幾個扇區。
C8051F020對CF卡讀扇區數據的過程是:首先讀取第7個寄存器的狀態字,如果為50H表示沒有錯誤,并且CF卡已經準備好;然后再分別向第2、3、4、5、6個寄存器寫入相應的數據指定需要讀寫的扇區;最后向第7個寄存器寫20H或21H,讀取狀態字為58H后讀取數據,其流程如圖2所示。
C8051F020對CF卡向指定扇區寫數據的命令是30H或31H,其操作亦與讀數據相似,只不過在寫入數據后要等到CF卡中數據穩定并進入空閑狀態才能結束這一過程。
在CF卡讀寫時,分別向第2、3、4、5、6個寄存器寫入CF卡需要訪問的扇區位置,其寫入模式有2種:即CHS(Cylinder/Head/Sector)模式和LBA(Logical Block Address)模式。通過設置第6個寄存器的第6位LBA確定其模式:即如果LBA=0,則為CHS模式;如果LBA=I,則為LBA模式。
由CHS模式到LBA模式的轉換如下:
其中LBA是邏輯塊地址,Cn是柱面號,HpC是每個柱面的磁頭數,Hn是磁頭數,Sn是扇區號,SpH是每個磁頭(簇)的扇區數。
3 CF卡的文件存儲
FAT(File Allocation Table)文件系統產生于20世紀70年代末到80年代初,是微軟的MS-DOS操作系統所支持的文件系統。目前FAT文件系統有3種類型:FATl2、FATl6和FAT32。它們的不同是在磁盤上實際的FAT結構中每個記錄(Entry)所占的位數不同。FATl2占12位(1.5字節),FATl6占16位(2字節),FAT32占32位(4字節)。每一個記錄中的數據都按照低字節在前、高字節在后排列。
在CF卡格式化時,首先要了解CF卡的容量等一系列信息。通過對CF卡寫入命令ECH就可以讀出1個扇區,其中包含了該CF卡的一些參數的信息,如容量、默認的柱面數、默認的磁頭數、每個扇區的字節數、每個磁道的扇區數和CF卡上總的扇區數等。這為格式化CF卡提供了重要的數據。
在格式化后的CF卡中,FAT文件系統由如下4部分組成:
0區:保留區(引導區)。
1區:FAT區。
2區:根目錄區(FAT32中存在的是浮動的FDT表)。
3區:文件、目錄與數據區(下面簡稱數據區)。
引導區中包含了整個FAT文件系統的重要信息,即BPB(BIOS Parameter Block)。下面為BPB的幾個重要數據結構:
在FAT32格式下,BPB﹒RootEntCnt為‘0’,因此RootDirSec總是為‘0’。
如果BPB.FATSzl6不為‘0’,就可以根據下面公式計算數據區的第一個扇區地址。
FirstDataSec=”BPB“.ResvdSecCnt+(BPB.NumFATs*BPB.FATSzl6)+RootDirSec (4)
因此數據區所占用的扇區數:
DataSec=”BPB“.TotSecl6-FirstDataSec (5)
根目錄的第一個扇區地址(在FATl2、FATl6下):
FirstRootDirSec=”BPB“.ResvdSecCnt+(BPB.NumFATs*BPB.FATSzl6)
如果BPB.FATSzl6為‘0’,則BPB.FATSz32一定不為‘0’,則有:
FirstDataSec=”BPB“.ResvdSecCnt+fBPB.NumFATs*BPB.FATSz32)+RootDirSec (6)
DataSec=”BPB“.TotSec32-FirstDataSec (7)
FirstRootDirSec=”BPB“.ResvdSecCnt+(BPB.NumFATs*BPB.FATSz32) (8)
如果CF卡有多個分區,則(3)~(8)式計算出的參數只是相對當前分區而言的,且數據區所占用的簇數為:
CntofClus=”DataSec“/BPB.SecPerClus (9)
在格式化CF卡時,根據CF卡容量的大小決定FAT數據結構中的一些參數,再由式(9)算出數據區總的簇數,并根據總簇數的大小確定FAT形式。一般來說,如果CntofClus<4 084簇,則可以格式化成FATl2的形式;如果≥4 084簇而<65 524簇,則可以格式化成FATl6的形式;如果≥65 524簇,則格式化成FAT32的形式。
若給定一個簇的序號N(N≥2),則在數據區對應該簇的第一個扇區序號為:
FirstSecofClus=((N-2)*BPB.SecPerClus)+FirstDataSec (10)
式(10)表示了FAT與數據區的對應關系,如圖3所示。在FAT區每一個記錄的位置與數據區中的一簇數據相對應,同時,這個記錄又存儲著下一簇序號,從而一個件在FAT區形成一個鏈表。至于每一簇的序號在FAT中的存儲位置,可以根據格式化的形式(FATl2、FAT16、FAT32)確定。設每一記錄占i個字節,則第N個記錄在N×i的位置上。
文件的結束符在FATl2下為0xFFF,在FATl6下為0xFFFF,在FAT32下為0x0FFFFFFF。如果在寫入時遇到損壞的簇,則在對應位置寫損壞的標志(FATl2下為0xFF5FATl6下為0xFFF7,FAT32下為0x0FFFFFF7),并且在{表中跳過這一損壞的簇。在刪除一個文件時,要把該文{在FAT區的鏈表全部寫‘0’,釋放空間。這樣,該鏈表中所對應的數據區又可以被新的文件分配。 一個FAT的目錄項或文件項通常占用32字節,并存儲該目錄或文件的相關信息。其數據結構如下:
這個數據結構中12字節的名字是目錄名還是文件名,由成員Attr決定。如果是目錄Attr可設為10H;如果j文件,Attr可設為20H,也可以是幾個屬性的組合;如果為長文件名,Attr可設為OFH。有關詳細的長文件名可參見文獻。
成員FstClusHI和FstClusL0記錄了文件第一簇數據對應FAT中的記錄序號,即圖3中第一簇的序號,從而可以根據鏈表查找下一簇數據。在FATl2和FATl6下,成員FstClusHI總為‘0’。
4 討論
本文只介紹了動態腦電圖系統的有關文件存儲的部分,C8051F020的功能并沒有得到充分利用。實際上C8051F020還要完成系統的其他很多功能。用戶可以根據自己系統的實際需要選擇合適的單片機。本系統在設計時著重考慮系統的功耗、體積、速度等方面的因素,所以C8051F020采用非復用的方式,以求節省1片鎖存器對低位地址的鎖存。
CF卡在寫入文件時,由于要記錄24小時的腦電圖信號。為了防止異常發生使文件寫入失敗,可以定時地更新FAT區該文件的記錄鏈表和所存放文件數據結構的根目錄區或數據區中該文件的大小。只有保存了這些信息,所寫入的數據才能正常地讀取。 此外,在寫入文件時,如果遇到一個扇區寫入失敗,則整個簇都不能用。為此:(1)必須查找下一個未占用的簇,再把這一簇中已經正確寫入的扇區中的數據復制到下一簇中。這樣緩沖區中只要保存一個扇區的腦電信號就可以。(2)先對這一簇進行檢測,確定沒有錯誤后再向該簇寫人數據。這種方法雖然比較簡單,但占用系統的時間比較多,且在檢測到沒有錯誤后也不能完全保證下一次寫入時不發生錯誤。所以第一種方法的可靠性要高。
實驗證明,SanDisk和EagleTec等公司的不同容量的CF卡用于本系統中都能夠正確地對采集到的腦電圖信號進行存取。
-
微控制器
+關注
關注
48文章
7560瀏覽量
151496 -
計算機
+關注
關注
19文章
7504瀏覽量
88056 -
定時器
+關注
關注
23文章
3250瀏覽量
114897
發布評論請先 登錄
相關推薦
評論