文件在SD卡中的保存
我们都知道可以用SD卡保存文件。文件本身其实就是带有特定信息的数据。仅仅从文件内容上看,使用一个SD卡,我们既可以使用自己的方式,像使用Flash芯片那样,按照自己的约定,把不同的文件的内容直接作为二进制数据保存在SD卡的指定扇区中。就像字库芯片一样,不同的字体,保存在不同扇区,需要那种字体,通过地址确定。而更好的方式,就像使用硬盘那样,利用协议,将SD的存储区域华为为不同的区域,建立文件管理系统结构。这样SD卡不仅可以在单片机系统中使用,也可以在计算机中,像使用U盘那样使用SD卡。这就需要对SD卡进行格式化,利用文件系统格式,来管理SD卡的内部存储空间。
已知的文件系统有FAT12、FAT16、FAT32、exFAT、NTFS、EXT2、EXT3、EXT4等。协议不同,意味着在SD卡上的扇区的分工不同。这里用FAT32方式为例,看看SD的存储区是怎么划分的。这里使用WinHEX这个工具直接查看SD的存储内容,很方便。
在地址00000000H ~ 000001E0H的这段空间内,在右侧能看见字符的地方,我们可以找到MSDOS5.0、FAT32、BOOTMGR等字样,这段区域,是引导扇区。最前面的512个字节的说明如下:
【1】0x00~0x02:3字节,跳转指令。
【2】0x03~0x0A:8字节,文件系统标志和版本,这里为MSDOC5.0。
【3】0x0B~0x0C:2字节,每扇区字节数,512(0X02 00)。
【4】0x0D~0x0D:1字节,每簇扇区数,8(0x08)。
【5】0x0E~0x0F:2字节,保留扇区数,38(0x00 26),符合FAT1起始地址为38扇区。
【6】0x10~0x10:1字节,FAT表个数,2。
【7】0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根文件夹中文件夹的个数;
【8】0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。
【9】0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质,经常使用的 0xF0。
【10】0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数。
【11】0x18~0x19:2字节,每磁道扇区数,仅仅对于有“特殊形状”(由磁头和柱面每 切割为若干磁道)的存储介质有效,63(0x00 3F)。
【12】0x1A~0x1B:2字节,磁头数,仅仅对特殊的介质才有效,255(0x00 FF)。
【13】0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,8192(0x00 00 20 00),与MBR中地址0x1C6開始的4个字节数值相等。
【14】0x20~0x23:4字节,文件系统总扇区数,7736320(0x 00 76 0C 00),7736320 * 512 = 3960995840 ≈ 3.67GB。
【15】0x24~0x27:4字节,每一个FAT表占用扇区数,7541(0x 00 00 1D 75)。
【16】0x28~0x29:2字节,标记,此域FAT32 特有。
【17】0x2A~0x2B:2字节,FAT32版本0.0,FAT32特有。
【18】0x2C~0x2F:4字节,根文件夹所在第一个簇的簇号,2。(尽管在FAT32文件系统 下,根文件夹能够存放在数据区的不论什么位置,可是通常情况下还是起始于2号簇)
【19】0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号1,该扇区为操作 系统提供关于空簇总数及下一可用簇的信息。
【20】0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统 的6号扇区。
【21】0x34~0x3F:12字节,用于以后FAT 扩展使用。
【22】0x40~0x40:1字节,与FAT12/16 的定义同样,仅仅只是两者位于启动扇区不
同的位置而已。
【23】0x41~0x41:1字节,与FAT12/16 的定义同样,仅仅只是两者位于启动扇区不
同的位置而已 。
【24】0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义同样,仅仅只是 两者位于启动扇区不同的位置而已
【25】0x43~0x46:4字节,卷序列号。通常为一个随机值。
【26】0x47~0x51:11字节,卷标(ASCII码),假设建立文件系统的时候指定了卷 标,会保存在此。
【27】0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。
【28】0x5A~0x1FD:90~509共410字节,引导代码※。
【29】0x1FE~0x1FF:签名标志“55 AA”。
※引导代码
FAT文件系统将引导代码与文件形同数据结构融合在一起,FAT32文件系统引导扇区的512字节中,90~509字节为引导代码,而FAT12/16则是62~509字节为引导代码。同一时候,FAT32还能够利用引导扇区后的扇区空间存放附加的引导代码。一个FAT卷即使不是可引导文件文件系统,也会存在引导代码。
在这段区域,我们可以看到,存储在SD卡上的文件信息,每一个文件占用32字节的数据,里面包含了文件的名称、扩展名,以及该文件的二进制数据保存在SD卡中的位置等信息。
需要特别说明的信息:
【1】:文件或者目录存储的起始簇号,偏移地址高16位和低16位,表示这个文件存储在哪个簇的位置。
【2】:文件大小:偏移地址0x1C-0x1
【3】文件属性:偏移地址0x0B-0x0B,0x20 ,归档。
【4】子文件夹存储在数据区
【5】文件名称的第一个字节,为0xE5,表示该项已被删除。
【6】名字为0x2E(“.”),表示当前文件夹。
【7】名字为0x2E 0x2E(“. .”),表示上一级文件夹。
第一个字节为“E5”的,表示是之前存储过、后来被删除的文件。
看到这里,个人感觉,和DOS系统下的文件系统是相似的。更多的有关FAT32的规范,就不多说明了,有兴趣的可以找资料。
这里简单介绍这些内容,是为了帮助我们用单片机访问SD卡的时候,知道读出来的数据是什么作用,这样可以方便我们去读写SD卡中的文件。具体的处理,一定要根据对应的文件系统规范去解析数据,从而得到正确的结果。