- typedef struct{
- u8 FileName[8]; //文件名,不足8字節(jié)用空格補充
- u8 ExtName[3]; //擴(kuò)展名
- u8 attribute; //屬性,典型值:存檔(0x20)、卷標(biāo)(0x08)
- u8 reserved[10]; //保留
- u16 time; //time=Hr*2048+Min*32+Sec+2
- u16 date; //date=(Yr-1980)*512+Mon*32+Day
- u16 StartCluster; //起始簇號
- u32 FileLength; //文件長度
- }DIR_tag;
文件名一般占用8字節(jié),長的文件名需要用resetx,ed[]數(shù)組。文件名的首字節(jié)又表明該文件的狀態(tài),00H表示該目錄項未使用,E5H表示該文件(或目錄)已被刪除。創(chuàng)建目錄時,屬性值設(shè)置為10H(表示子目錄),文件長度為0。
3.2 文件的讀寫
MMC卡上文件都是以簇為單位存取的。當(dāng)讀取MMC卡上的文件時,首先要根據(jù)文件名查找到該文件的目錄登記項。根據(jù)目錄登記項中的起始簇號既可找到文件在數(shù)據(jù)區(qū)DATA中第1簇的內(nèi)容,又可在FAT表中找到第2個簇號。根據(jù)第2個簇號又能找到第2簇的內(nèi)容和FAT表中的第3個簇號。這樣,就可以根據(jù)FAT表中的簇號讀取到全部文件數(shù)據(jù)。寫文件時要保證FAT1和FAT2中內(nèi)容的一致性,即對兩塊都要進(jìn)行同樣的寫操作。對于FATl6,可以由下面的公式計算出數(shù)據(jù)起始邏輯扇區(qū)號:
起始邏輯扇區(qū)=隱藏扇區(qū)數(shù)+1+2*每FAT扇區(qū)數(shù)+FDT扇區(qū)數(shù)+(起始簇號-2)*每簇扇區(qū)數(shù)
從表1可知,MMC卡上隱藏的扇區(qū)數(shù)為0,每個FAT占用243個扇區(qū),F(xiàn)DT固定占用32個扇區(qū)。寫文件的相關(guān)代碼如下(設(shè)文件長度小于512字節(jié)):
- void file_write(DIR_tag *file_tag,char *data){
- //data為指向數(shù)據(jù)的指針
- u16 j,offset=file_tag.StartCluster*2;
- //FAT16用16位表示1個簇
- mmc_read block(&sdc,fat1_addr+offset/512,mmc_buffer); //讀取起始簇號所在的塊
- mmc_buffer[offset%512]=0xff;//文件結(jié)束標(biāo)志ff ff
- mme_buffer[offset%512+1]=0xff;
- mmc_write_block(&sdc,fat1_addr+offset/512,mmc_buffer); //寫FAT1
- mmc_write_block(&sdc,fat2_addr+offset/512,mmc_buffer); //寫FAT2,與FAT1同
- for(j=0,j<file_tag.FileLength;j++) mmc_buffer[i]=data[j];
- mmc_write_block(&sdc,519+(file_tag.StartCluster-2),mmc_buffer); //寫入數(shù)據(jù)
- }
3.3 文件的刪除
文件的刪除也是對MMC卡上文件管理的一個重要方面。刪除文件時,并不涉及數(shù)據(jù)區(qū)的操作,只須在文件的目錄登記項上作一個刪除標(biāo)記,并把文件在FAT表中所占用的簇標(biāo)記為“空簇”。刪除文件的代碼如下:





