2024年5月10日发(作者:)

SD卡FAT32文件结构(1)

FAT32文件层,这个文件层体系不是十分的复杂。但为了寻找一个根目录的文件,得几经周折,所写的程

序也非常的庞大。

首先,我们为了知道我们的SD卡的基本信息,这些信息一般被存储在BPB表中,而BPB表位于DB

R中,也就是逻辑扇区0号。但逻辑0扇区并不在0号扇区之中,使用WinHex,看0扇区,结果如下所

示。

0x0190之前的区域全是0,省略掉了。从图中看出,这必定不是DBR,而是主引导扇。图中红圈的地方,

标示出了DBR所在的位置,红圈的位置是MBR的0x01C6~0x01C9。而从WinHex能看出,我的SD卡

的DBR是在地址0x5600开始的。而红圈的数据为小端模式的,一般来说,单片机的数据存储格式为大端,

所以需要一个转化。而0x2B000000这个小端数据转化为大端之后为0x2B(我个人认为小端就是把高字节

存在低位,低字节存在高位)。而之前读取SD卡的CSD寄存器可知,一个扇区是512byte的。所以经过

简单的算式便可算出DBR的位置。

0x002B * 0x0200 = 0x5600。

那么,我们就可以寻找到DBR了,从WinHex中读取DBR,结果如下所示。

红圈处为DBR开始的地址,恰好是0x5600,和之前计算的一样。其中,较为重点的地方我给出了不同颜

色的标记。

1:(红色)值为0x0002(小端数据),转化为大端数据为0x0200,即512。其含义为标示每个扇区有

512字节。

2:(绿色)值为0x08,表示每个簇有8个扇区。可能值为2个整数次方,但每个簇不能超过32K。

3:(浅蓝)值为0x2000(小端数据),转化为大端数据为0x0020,即32。表示保留区内有32个保留扇

区。那么FAT表就位于保留扇区结束后的位置。所以FAT表的地址为0x0020*0x0200(每个扇区

512byte)=0x4000。

4:(深蓝)值为0x02表示有2份FAT表,另一个是备份所用的。

5: (紫色)值为0xCC03(小端数据),转化为大端数据为0x03CC,表示每个FAT表所占据的扇区数。

那么每个FAT表所占据地址数量为0x03CC*0x0200 = 0x79800。

那么 我的 D B R 位于0x005600

我的FAT1表位于0x005600 + 0x004000 = 0x009600

FAT2表位于0x009600 + 0x079800 = 0x082E00

根目录区位于0x082E00 + 0x079800 = 0x0FC600

至此,我得到了我SD卡存储的所有信息,用WinHex验证下结果。

FAT1表(位于0x009600开始的区域)

FAT2表(位于0x082E00开始的区域)