在MMC卡上创建文件(或目录)的过程就是在文件目录表FDT中申请登记项的过程。登记项中包括文件名、文件长度和起始簇号等内容。为此定义了如下结构:
代码
typedef struct{
u8 FileName[8]; //文件名,不足8字节用空格补充
u8 ExtName[3]; //扩展名
u8 attribute; //属性,典型值:存档(0x20)、卷标(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字节,长的文件名需要用resetx,ed[]数组。文件名的首字节又表明该文件的状态,00H表示该目录项未使用,E5H表示该文件(或目录)已被删除。创建目录时,属性值设置为10H(表示子目录),文件长度为0。
3.2 文件的读写
MMC卡上文件都是以簇为单位存取的。当读取MMC卡上的文件时,首先要根据文件名查找到该文件的目录登记项。根据目录登记项中的起始簇号既可找到文件在数据区DATA中第1簇的内容,又可在FAT表中找到第2个簇号。根据第2个簇号又能找到第2簇的内容和FAT表中的第3个簇号。这样,就可以根据FAT 表中的簇号读取到全部文件数据。写文件时要保证FAT1和FAT2中内容的一致性,即对两块都要进行同样的写操作。对于FATl6,可以由下面的公式计算出数据起始逻辑扇区号:
起始逻辑扇区=隐藏扇区数+1+2*每FAT扇区数+FDT扇区数+(起始簇号-2)*每簇扇区数
从表1可知,MMC卡上隐藏的扇区数为0,每个FAT占用243个扇区,FDT固定占用32个扇区。写文件的相关代码如下(设文件长度小于512字节):
<DIV class=codeHead>代码
void file_write(DIR_tag *file_tag,char *data){
//data为指向数据的指针
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;//文件结束标志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); //写入数据
} </DIV>
3.3 文件的删除
文件的删除也是对MMC卡上文件管理的一个重要方面。删除文件时,并不涉及数据区的操作,只须在文件的目录登记项上作一个删除标记,并把文件在FAT表中所占用的簇标记为“空簇”。删除文件的代码如下:
<DIV class=codeHead> 代码</DIV>- int file_delete(DIR_tag *file_tag){
- u16 k,clust_buf,offset1,offset= file_tag.StartCluster*2; //FAT16用16位表示1个簇
- file_tag.FileName[7]=0xe5;//FDT中文件被删除标志

