- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
基于MCF51QE128的SD卡文件系统设计
数据区主要存放文件数据,为了有效利用存储空间,一般以簇为单位,簇的大小通常是2的,n次幂个扇区。FAT格式化后,簇的大小就确定下来了,可通过读取分区引导记录获得。例如,读取图3中Ox000000E9扇区,由偏移量OxOD处1字节数据0x10=16可知,SD卡的1个簇占16个扇区。
如果将SD卡的存储空间想象成一本书,那么要阅读一篇文章,首先应该打开目录找到文章的页码,然后根据页码翻到文章所在的地方。类比到FATl6文件系统,FAT表和根目录就像书的目录,簇号类似于书的页码,而数据区存放的就是文章的具体内容。
以打开文件为例,文件的存储原则可以这样描述:首先在根目录中查找文件名,如有匹配,就找到了文件的开始簇号,好比知道了文章的页码。但文件的存储和书不同,书的内容一般是连续的,而文件在存储后是可以随意修改的(例如添加或删除),因而在存储空间上可能不连续,这样就无法仅通过开始簇号找到整个文件。那么怎样才能完整找到这些不连续的数据呢?答案就是FAT表。FAT表以"0xF8FF FFFF"作为开始标志,以2字节为单位存放文件簇号。FAT表实质是一个二维链表,如图4所示。
FAT表上面的数字是这2个字节在表中的位置序号,同时也代表文件的簇号,与数据区的簇号对应,类似目录的页码。通常SD卡上第一个文件的开始簇号为2。若文件长度小于1簇,则其开始簇号所对应的2字节值为FFFF。若文件长度大于1簇,则其开始簇号所对应2字节中存放的是文件所在的下一个簇号,由所得簇号再查找其对应的2字节,可找到文件接下来的簇号。依此类推,直到最后所得簇号对应的2字节值为FFFF,即为文件的结束簇号。根据上述原则,由FAT表和根目录就可以确定文件在数据区的存储簇号,从而实现文件数据的管理。
2 FATl6文件系统设计
文件系统的基本功能包括:文件的创建、打开和读写。这里假定已经实现了MCF51QEl28微控制器和SD卡的硬件接口和底层通信,具体细节参考文献。
2.1 数据结构
为了便于对主引导记录、分区引导记录、FAT表、根目录和数据区中的相关信息进行记录和处理,定义了FATl6_t和FILE_t两个结构体类型。数据类型byte、word和dword分别对应于8位、16位和32位数据。
FATl6_t结构体类型用于记录主引导记录和第1分区引导扇区信息,部分定义如下:
FILE_t结构体类型用于记录每个文件项信息,部分定义如下:
2.2 FATl6初始化
FATl6的初始化主要是读取主引导记录和第1分区引导扇区信息,并保存到FATl6_t类型变量中。初始化流程如图5所示。
来源:维库开发网