读出SD卡中的数据,然后拷贝到Nand中,这个过程需要文件系统的支持,和MCU的控制,本文文件系统采用的是FAT32,MCU是STC12LE5A56S2。
第一章 Fat32在SD卡中的实现
1.Fat32在SD中的分布
图1-1-1 Fat32在SD卡中的分布
BootSector大小是一个扇区,512个字节;ReservedSector是保留扇区,在本SD卡中保留扇区的个数是36个;Fat1与Fat2是分区表,二者内容完全一样;RootDirector是根目录,所在簇号是2,占用一簇8个扇区;DataArea即为数据存取部分。
2.BootSector解剖
图1-2-1 BootSector 内容
BootSector是操作系统引导扇区,又被称为DBR(Dos Boot Sector),用WinHex打开后的内容如图1-2-1所示。在DBR中真正对我们有用的是BPB(BIOS Parameter Block),BPB位于DBR的12-90字节处。BPB详细内容如下:
字段名称 长度 含义 偏移量
jmpBoot 3 跳转指令 0
OEMName 8 这是一个字符串,标识了格式化该分区的操作系统的名称和版本号 3
BytesPerSec 2 每扇区字节数 11
SecPerClus 1 每簇扇区数 13
RsvdSecCnt 2 保留扇区数目 14
NumFATs 1 此卷中FAT表数 16
RootEntCnt 2 FAT32为0 17
TotSec16 2 FAT32为0 19
Media 1 存储介质 21
FATSz16 2 FAT32为0 22
SecPerTrk 2 磁道扇区数 24
NumHeads 2 磁头数 26
HiddSec 4 FAT区前隐扇区数 28
TotSec32 4 该卷总扇区数 32
FATSz32 4 FAT表扇区数 36
ExtFlags 2 FAT32特有 40
FSVer 2 FAT32特有 42
RootClus 4 根目录簇号 44
FSInfo 2 文件系统信息 48
BkBootSec 2 通常为6 50
Reserved 12 扩展用 52
DrvNum 1 - 64
Reserved1 1 - 65
BootSig 1 - 66
VolID 4 - 67
FilSysType 11 - 71
FilSysType1 8 - 82
表1-2-1 BPB内容介绍
在BPB中对我们最重要的是红色标记的部分,根据图1-1,知道了保留扇区的数目就可以求得FAT所在的扇区;知道了FAT表的个数,每个FAT表所占的扇区以及FAt表的起始扇区,就可以求得根目录所在的起始扇区了。
3.FAT表解剖
图1-3-1 FAT表中的内容
Fat表中的内容如图1-3-1所示,开始的8个字节“F8 FF FF 0F FF FF FF FF”为FAT表的开始标志字节。记录是从簇2开始的,簇2中的内容是“FF FF FF 0F”表示簇2没有后继簇—即该文件一个簇就可以装下;簇3中的内容是“04 00 00 00”表示簇3的下一簇是簇4—Fat采用的是小段模式。
4.根目录解剖
图1-4-1 RootDirectory中的内容
在根目录中使用32字节来表示一个文件(目录也被当作文件来看待),这32个字节的含义如表1-4-1所示。
表 1-4-1 文件属性说明
在这32字节中,对我们来说最重要的就是起始簇了,因为知道了起始簇就能找到文件所在的扇区位置。
5.单片机读SD卡流程
图1-5-1 读SD卡流程
采用的单片机是STC12LE5A56S2,有1280字节的RAM,每次读一个扇区,512字节。启动扇区(BootSector)对于SD卡来说一般是0扇区,知道了启动扇区就能知道该SD卡中的保留扇区、FAT表的起始扇区以及FAT表所占扇区,进而求得根目录。在根目录中可以通过文件名或属性来查找所需要的文件,进而找到文件的起始簇,有了起始簇在通过FAT表来判断是否是结束簇,若不是FAT表会告知下一簇,若是则读过程结束。
第二章 Fat32在Nand Flash中的实现
采用的单片机仅仅有1280字节的RAM,缓冲区的大小只能是一个扇区512字节,要实现SD卡中的数据拷贝到Nand Flash中,采用的思想便是SD卡中的数据与Nand Flash进行一一映射,而不再进行数据的处理(只有少许改动)。这样不仅节省了RAM,而且在完成了向Nand Flash中写入数据后,就可以将Nand Flash当作SD卡来对待,不用再重新写Nand Flash文件系统的读过程。
FAT32 在Nand Flash上的分布如表1-1所示:
表2-1
红色部分是在读出SD卡的0扇区内容后需要做的修改,然后再写进Nand Flash的0扇区中。