基于单片机的SD卡FAT文件系统读写设计
3.4读写单块数据
SD卡单块数据的读取是先通过单片机发送CMDl7(CMD_READ_SINGLE_BLOCK)命令,以SD卡指定数据块起始位地址作为参数,如果读取成功SD卡会返回1个R1命令作为响应。然后发送1个起始数据命令,接着发送单块字节数量的数据并接收SPI数据寄存器SPIDR中的数据,最后是2字节CRC校验。
SD卡单块数据的写入与读取相似,通过单片机发送CMD24(CMD_WRITE_SINGLE_BLOCK)命令,以SD卡指定数据块起始位地址作为参数,如果读取成功SD卡会返回1个R1命令作为响应。然后发送1个起始数据命令,接着发送单块字节数量的需写入数据,最后是2字节CRC校验。
3.5 FAT文件系统信息读取
为了SD卡文件数据管理方便并且与PC机之间兼容得更好,同时考虑到SD卡自身容量的限制,选择FATl6文件系统对SD卡信息进行管理。
为了方便管理和扩展性开发,对SD卡进行了分区。模拟硬盘模式创建出了MBR区(主引导扇区)与DBR区(操作系统引导记录区),在向下兼容的同时实现了对分区过的SD卡FAT文件系统的读写。
SD卡数据可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。MBR区是主引导区,位于整个SD卡的第1单块上。在总共512字节的主引导扇区中,MBR只占用了其中的446个字节,另外的64个字节是DPT(Disk Partition Table,分区表),最后2个字节“55 AA”是分区的结束标志。这整体构成了SD卡的主引导扇区。DBR是操作系统引导记录区,是操作系统可以直接访问的第1个扇区,它包括1个引导程序和1个被称为BPB(Bios Parameter Block)的本分区参数记录表。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT、个数,分配单元的大小等重要参数。
FAT文件系统的分区有如下几个部分:保留区,存放FAT文件系统的重要参数和引导程序;FAT表,记录簇使用情况;根目录区,记录根目录信息。
本文中单片机对FAT系统的读写利用的是MBR区上的DPT分区表信息,用于找到FAT分区。然后通过FAT分区的DBR区上的BPB分区参数记录表信息找到根目录,读取根目录信息并通过FAT表中的文件簇信息实现文件的管理。
研究中为方便代码的移植和优化,在FAT初始化的时候将读写扇区函数指针指向Micro SD卡的读写函数,并使用了2个结构体来存储SD卡的MBR与DBR信息。但鉴于单片机自身的内存容量,又建立了1个SimpleFat.c程序文件,只存储程序所需的几个地址常量:StartMbrAddress(MBR起始地址)、StartDbrAddress(DBR起始地址)、StartFatlAddress(FATl表起始地址)以及SeePerClu(簇扇区数量),大大减小了单片机内存的开销。
3.6 应用层函数接口
FAT文件系统向应用层设计了如下几个初级程序接口:Get Filelnfo(UINT8*F Info,FileInfo*TempFilelnfo)(获取文件信息),OutPut _RootFileinfo(void)(输出根目录文件信息),DirOr(UINT8 FileAttrib)(判断目录),Get Next Cluster(UINTl6 TempCluster)(获取下一文件簇信息),OutPutFileCluster(UINTl6 TempStart Cluster)(输出文件簇地址),OutPutFile(UINTl6 Temp StartCluster)(输出文件内容),ShowClusterContent(UINTl6 TempCluster)(输出簇内容)。通过这些初级程序接口实现了OpenDir(UINTl6 TempStartCluster)(目录打开),FileDelete(文件删除),FileDataRead(文件数据读取),FileCreate(UINTl6 TempStartCluster,UINT32TempFileLength)(文件创建)等功能。
3.6.1 目录读取及文件信息获取
FAT文件系统的具体文件和目录项都是通过读取ROOT目录来进行查找的,所以FAT的文件排布是以树形的结构排布。对于FAT来说,目录项与文件项在同一目录中是同样占32个字节的属性项。研究中使用了1个数据结构Filelnfo来存储文件信息,并通过if(Temp_F_Info[0x0b]0x l0)来分辨文件与目录。
在FAT文件系统中,文件是以簇的形式保存在SD卡中的,簇的排布是不连续的,1个文件如果大于1个簇的话,则要通过FAT表来查找该文件所有簇所在的位置,从而找到整个文件。目录一般只占有1个簇的大小,在FAT表中等同于小于1个簇的小文件,值显示为FF。
目录是以文件的形式存储在父目录中的,目录中的文件信息记录了该文件的起始簇以及文件的大小,知道了文件的起始簇,通过FAT表中的信息可以很方便地找到文件的下一个簇的位置,并由文件的大小判断出文件的结束位置。
3.6.2 文件的读写
在FAT文件系统中,读取文件只需要知道该文件的起始簇以及大小便可以很方便地得到整个文件的信息。读取步骤是:获取根目录信息,通过根目录信息找到下一层目录所在簇位置,通过下一层目录信息递归找到文件所在目录,读取文件信息属性,得到文件的起始簇位置和文件大小,通过FAT表递归查找到文件的全部簇地址,最终以FF结尾;根据文件大小判断文件的结束位置,最后输出整个文件。
文件的创建和写入则是通过FAT表查找未被使用的空簇(值为00),写满1簇之后再查找下一未被使用的空簇,并同时更新FAT1表和FAT2表。然后在文件所被创建的目录信息中添加文件信息,最终实现文件的创建。
3.6.3 文件的删除
在FAT文件系统中,对文件的删除不需要把整个文件信息全部清除,只需要清除FAT表中的文件簇信息以及目录中的文件信息,避免了对SD卡的频繁读写,同时也节省了时间。
HCSl2X单片机 SPI模块 SD卡 Micro FAT文件系统 相关文章:
- 单片机用Mssp_spi模块三点通信(12-03)
- 单片机SPI模块+74LS164驱动数码管(12-03)
- 基于AD7862和dsPIC30F的数据采集系统(08-25)
- 基于MSP430和SD卡的FAT16文件系统的设计(06-01)
- 一种嵌入式系统升级的设计和实现(06-15)
- 基于STM32 DIO接口驱动SD卡的设计(上)(03-06)