- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于MCF51QE128的SD卡文件系统设计
FATl6初始化子程序中调用了底层SD卡读数据块函数SD_ReadBlock。其函数声明为byte SD_ReadBlock(dword sector,byte*buffer),用于读入地址为sector扇区中的数据,暂存入buffer中。预编译函数from_BE_32和from_BE_16分别实现由高位向低位读取4字节和2字节数据。
FATl6初始化子程序声明为byte Init_FAT(FArl6_t*FAT,byte*buffer),部分代码如下:
2.3 打开和创建文件
打开和创建文件采用一个函数来实现。首先根据读入的文件名查找根目录,若有匹配项则打开文件,否则创建一个新文件。流程如图6所示。
打开和创建文件子程序声明为byte Open_File(FILE_t*FILE,FATl6_t*FAT,byte*buffer,byte*name)。部分代码如下:
在根目录中查找是否有文件项匹配,从根目录的第1个扇区开始读扇区。
根据文件起始簇号和根目录的记录项号,计算文件FAT表、根目录和数据区的相关信息。对于根目录和数据区的信息,已有文件和新文件的计算一致。如果是新文件,还需修改FAT表和根目录记录项。
2.4 多扇区数据读写
多扇区数据的读写是在打开文件的基础上,以扇区为单位读写文件,可连续读写多个扇区数据,同时写入文件的属性、日期和时间。写数据的流程如图7所示,读数据与之类似。多扇区数据的写子程序声明为byte Write_File(FILE_t*FILE,FATl6_t*FAT, byte attribute,word time,word date,dWOEd size_s,byte*buffer),根据写入扇区数size_s,设置文件的写入位置。首先将写入扇区数与文件剩余扇区数进行比较,若写入扇区数小于等于剩余扇区数,则新写入扇区数、簇数均为0,文件结束簇、写簇号不变,不需要修改FAT表,仅修改根目录中的文件长度。否则,需要计算新写入扇区数和簇数。若有增加簇,则需修改FAT表,包括FATl和FAT2、根目录的文件记,录项。最后,将数据写入文件数据区。
结语
本文基于FREESCALE公司MCF51QEl28微控制器,深入探讨了SD卡上FATl6文件系统的存储原则,给出了实现方案。软件算法上,对单扇区数据读写进行改进,实现了连续多个扇区数据的读写,大大提高了文件的读写效率,特别适用于数据量较大的视频、音频数据采集系统的文件存储。随着SD卡的快速流行,在此类存储设备中引入文件系统将得到更加广泛的应用。