- typedef struct{
- u8 FileName[8]; //文件名,不足8字節(jié)用空格補(bǔ)充
- 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; //起始簇號(hào)
- u32 FileLength; //文件長度
- }DIR_tag;
文件名一般占用8字節(jié),長的文件名需要用resetx,ed[]數(shù)組。文件名的首字節(jié)又表明該文件的狀態(tài),00H表示該目錄項(xiàng)未使用,E5H表示該文件(或目錄)已被刪除。創(chuàng)建目錄時(shí),屬性值設(shè)置為10H(表示子目錄),文件長度為0。
3.2 文件的讀寫
MMC卡上文件都是以簇為單位存取的。當(dāng)讀取MMC卡上的文件時(shí),首先要根據(jù)文件名查找到該文件的目錄登記項(xiàng)。根據(jù)目錄登記項(xiàng)中的起始簇號(hào)既可找到文件在數(shù)據(jù)區(qū)DATA中第1簇的內(nèi)容,又可在FAT表中找到第2個(gè)簇號(hào)。根據(jù)第2個(gè)簇號(hào)又能找到第2簇的內(nèi)容和FAT表中的第3個(gè)簇號(hào)。這樣,就可以根據(jù)FAT表中的簇號(hào)讀取到全部文件數(shù)據(jù)。寫文件時(shí)要保證FAT1和FAT2中內(nèi)容的一致性,即對(duì)兩塊都要進(jìn)行同樣的寫操作。對(duì)于FATl6,可以由下面的公式計(jì)算出數(shù)據(jù)起始邏輯扇區(qū)號(hào):
起始邏輯扇區(qū)=隱藏扇區(qū)數(shù)+1+2*每FAT扇區(qū)數(shù)+FDT扇區(qū)數(shù)+(起始簇號(hào)-2)*每簇扇區(qū)數(shù)
從表1可知,MMC卡上隱藏的扇區(qū)數(shù)為0,每個(gè)FAT占用243個(gè)扇區(qū),F(xiàn)DT固定占用32個(gè)扇區(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個(gè)簇
- mmc_read block(&sdc,fat1_addr+offset/512,mmc_buffer); //讀取起始簇號(hào)所在的塊
- 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 文件的刪除
文件的刪除也是對(duì)MMC卡上文件管理的一個(gè)重要方面。刪除文件時(shí),并不涉及數(shù)據(jù)區(qū)的操作,只須在文件的目錄登記項(xiàng)上作一個(gè)刪除標(biāo)記,并把文件在FAT表中所占用的簇標(biāo)記為“空簇”。刪除文件的代碼如下:





