C8051F020對CF卡向指定扇區(qū)寫數(shù)據(jù)的命令是30H或31H,其操作亦與讀數(shù)據(jù)相似,只不過在寫入數(shù)據(jù)后要等到CF卡中數(shù)據(jù)穩(wěn)定并進入空閑狀態(tài)才能結(jié)束這一過程。
在CF卡讀寫時,分別向第2、3、4、5、6個寄存器寫入CF卡需要訪問的扇區(qū)位置,其寫入模式有2種:即CHS(Cylinder/Head/Sector)模式和LBA(Logical Block Address)模式。通過設(shè)置第6個寄存器的第6位LBA確定其模式:即如果LBA=0,則為CHS模式;如果LBA=I,則為LBA模式。
由CHS模式到LBA模式的轉(zhuǎn)換如下:
其中LBA是邏輯塊地址,Cn是柱面號,HpC是每個柱面的磁頭數(shù),Hn是磁頭數(shù),Sn是扇區(qū)號,SpH是每個磁頭(簇)的扇區(qū)數(shù)。
3 CF卡的文件存儲
FAT(File Allocation Table)文件系統(tǒng)產(chǎn)生于20世紀(jì)70年代末到80年代初,是微軟的MS-DOS操作系統(tǒng)所支持的文件系統(tǒng)。目前FAT文件系統(tǒng)有3種類型:FATl2、FATl6和FAT32。它們的不同是在磁盤上實際的FAT結(jié)構(gòu)中每個記錄(Entry)所占的位數(shù)不同。FATl2占12位(1.5字節(jié)),FATl6占16位(2字節(jié)),FAT32占32位(4字節(jié))。每一個記錄中的數(shù)據(jù)都按照低字節(jié)在前、高字節(jié)在后排列。
在CF卡格式化時,首先要了解CF卡的容量等一系列信息。通過對CF卡寫入命令ECH就可以讀出1個扇區(qū),其中包含了該CF卡的一些參數(shù)的信息,如容量、默認(rèn)的柱面數(shù)、默認(rèn)的磁頭數(shù)、每個扇區(qū)的字節(jié)數(shù)、每個磁道的扇區(qū)數(shù)和CF卡上總的扇區(qū)數(shù)等。這為格式化CF卡提供了重要的數(shù)據(jù)。
在格式化后的CF卡中,FAT文件系統(tǒng)由如下4部分組成:
0區(qū):保留區(qū)(引導(dǎo)區(qū))。
1區(qū):FAT區(qū)。
2區(qū):根目錄區(qū)(FAT32中存在的是浮動的FDT表)。
3區(qū):文件、目錄與數(shù)據(jù)區(qū)(下面簡稱數(shù)據(jù)區(qū))。
引導(dǎo)區(qū)中包含了整個FAT文件系統(tǒng)的重要信息,即BPB(BIOS Parameter Block)。下面為BPB的幾個重要數(shù)據(jù)結(jié)構(gòu):
在FAT32格式下,BPB﹒RootEntCnt為'0',因此RootDirSec總是為'0'。
如果BPB.FATSzl6不為'0',就可以根據(jù)下面公式計算數(shù)據(jù)區(qū)的第一個扇區(qū)地址。
FirstDataSec=BPB.ResvdSecCnt+(BPB.NumFATs*BPB.FATSzl6)+RootDirSec (4)
因此數(shù)據(jù)區(qū)所占用的扇區(qū)數(shù):
DataSec=BPB.TotSecl6-FirstDataSec (5)
根目錄的第一個扇區(qū)地址(在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卡有多個分區(qū),則(3)~(8)式計算出的參數(shù)只是相對當(dāng)前分區(qū)而言的,且數(shù)據(jù)區(qū)所占用的簇數(shù)為:
CntofClus=DataSec/BPB.SecPerClus (9)
在格式化CF卡時,根據(jù)CF卡容量的大小決定FAT數(shù)據(jù)結(jié)構(gòu)中的一些參數(shù),再由式(9)算出數(shù)據(jù)區(qū)總的簇數(shù),并根據(jù)總簇數(shù)的大小確定FAT形式。一般來說,如果CntofClus<4 084簇,則可以格式化成FATl2的形式;如果≥4 084簇而<65 524簇,則可以格式化成FATl6的形式;如果≥65 524簇,則格式化成FAT32的形式。
若給定一個簇的序號N(N≥2),則在數(shù)據(jù)區(qū)對應(yīng)該簇的第一個扇區(qū)序號為:
FirstSecofClus=((N-2)*BPB.SecPerClus)+FirstDataSec (10)
式(10)表示了FAT與數(shù)據(jù)區(qū)的對應(yīng)關(guān)系,如圖3所示。在FAT區(qū)每一個記錄的位置與數(shù)據(jù)區(qū)中的一簇數(shù)據(jù)相對應(yīng),同時,這個記錄又存儲著下一簇序號,從而一個件在FAT區(qū)形成一個鏈表。至于每一簇的序號在FAT中的存儲位置,可以根據(jù)格式化的形式(FATl2、FAT16、FAT32)確定。設(shè)每一記錄占i個字節(jié),則第N個記錄在N×i的位置上。





