讀出SD卡中的數(shù)據(jù),然后拷貝到Nand中,這個過程需要文件系統(tǒng)的支持,和MCU的控制,本文文件系統(tǒng)采用的是FAT32,MCU是STC12LE5A56S2。
圖1-1-1 Fat32在SD卡中的分布
BootSector大小是一個扇區(qū),512個字節(jié);ReservedSector是保留扇區(qū),在本SD卡中保留扇區(qū)的個數(shù)是36個;Fat1與Fat2是分區(qū)表,二者內(nèi)容完全一樣;RootDirector是根目錄,所在簇號是2,占用一簇8個扇區(qū);DataArea即為數(shù)據(jù)存取部分。
圖1-2-1 BootSector 內(nèi)容
BootSector是操作系統(tǒng)引導(dǎo)扇區(qū),又被稱為DBR(Dos Boot Sector),用WinHex打開后的內(nèi)容如圖1-2-1所示。在DBR中真正對我們有用的是BPB(BIOS Parameter Block),BPB位于DBR的12-90字節(jié)處。BPB詳細(xì)內(nèi)容如下:
字段名稱 | 長度 | 含義 | 偏移量 |
jmpBoot | 3 | 跳轉(zhuǎn)指令 | 0 |
OEMName | 8 | 這是一個字符串,標(biāo)識了格式化該分區(qū)的操作系統(tǒng)的名稱和版本號 | 3 |
BytesPerSec | 2 | 每扇區(qū)字節(jié)數(shù) | 11 |
SecPerClus | 1 | 每簇扇區(qū)數(shù) | 13 |
RsvdSecCnt | 2 | 保留扇區(qū)數(shù)目 | 14 |
NumFATs | 1 | 此卷中FAT表數(shù) | 16 |
RootEntCnt | 2 | FAT32為0 | 17 |
TotSec16 | 2 | FAT32為0 | 19 |
Media | 1 | 存儲介質(zhì) | 21 |
FATSz16 | 2 | FAT32為0 | 22 |
SecPerTrk | 2 | 磁道扇區(qū)數(shù) | 24 |
NumHeads | 2 | 磁頭數(shù) | 26 |
HiddSec | 4 | FAT區(qū)前隱扇區(qū)數(shù) | 28 |
TotSec32 | 4 | 該卷總扇區(qū)數(shù) | 32 |
FATSz32 | 4 | FAT表扇區(qū)數(shù) | 36 |
ExtFlags | 2 | FAT32特有 | 40 |
FSVer | 2 | FAT32特有 | 42 |
RootClus | 4 | 根目錄簇號 | 44 |
FSInfo | 2 | 文件系統(tǒng)信息 | 48 |
BkBootSec | 2 | 通常為6 | 50 |
Reserved | 12 | 擴(kuò)展用 | 52 |
DrvNum | 1 | - | 64 |
Reserved1 | 1 | - | 65 |
BootSig | 1 | - | 66 |
VolID | 4 | - | 67 |
FilSysType | 11 | - | 71 |
FilSysType1 | 8 | - | 82 |
表1-2-1 BPB內(nèi)容介紹
在BPB中對我們最重要的是紅色標(biāo)記的部分,根據(jù)圖1-1,知道了保留扇區(qū)的數(shù)目就可以求得FAT所在的扇區(qū);知道了FAT表的個數(shù),每個FAT表所占的扇區(qū)以及FAt表的起始扇區(qū),就可以求得根目錄所在的起始扇區(qū)了。
圖1-3-1 FAT表中的內(nèi)容
Fat表中的內(nèi)容如圖1-3-1所示,開始的8個字節(jié)“F8 FF FF 0F FF FF FF FF”為FAT表的開始標(biāo)志字節(jié)。記錄是從簇2開始的,簇2中的內(nèi)容是“FF FF FF 0F”表示簇2沒有后繼簇—即該文件一個簇就可以裝下;簇3中的內(nèi)容是“04 00 00 00”表示簇3的下一簇是簇4—Fat采用的是小段模式。
圖1-4-1 RootDirectory中的內(nèi)容
在根目錄中使用32字節(jié)來表示一個文件(目錄也被當(dāng)作文件來看待),這32個字節(jié)的含義如表1-4-1所示。
表 1-4-1 文件屬性說明
在這32字節(jié)中,對我們來說最重要的就是起始簇了,因為知道了起始簇就能找到文件所在的扇區(qū)位置。
采用的單片機(jī)是STC12LE5A56S2,有1280字節(jié)的RAM,每次讀一個扇區(qū),512字節(jié)。啟動扇區(qū)(BootSector)對于SD卡來說一般是0扇區(qū),知道了啟動扇區(qū)就能知道該SD卡中的保留扇區(qū)、FAT表的起始扇區(qū)以及FAT表所占扇區(qū),進(jìn)而求得根目錄。在根目錄中可以通過文件名或?qū)傩詠聿檎宜枰奈募M(jìn)而找到文件的起始簇,有了起始簇在通過FAT表來判斷是否是結(jié)束簇,若不是FAT表會告知下一簇,若是則讀過程結(jié)束。
采用的單片機(jī)僅僅有1280字節(jié)的RAM,緩沖區(qū)的大小只能是一個扇區(qū)512字節(jié),要實現(xiàn)SD卡中的數(shù)據(jù)拷貝到Nand Flash中,采用的思想便是SD卡中的數(shù)據(jù)與Nand Flash進(jìn)行一一映射,而不再進(jìn)行數(shù)據(jù)的處理(只有少許改動)。這樣不僅節(jié)省了RAM,而且在完成了向Nand Flash中寫入數(shù)據(jù)后,就可以將Nand Flash當(dāng)作SD卡來對待,不用再重新寫Nand Flash文件系統(tǒng)的讀過程。
FAT32 在Nand Flash上的分布如表1-1所示:
表2-1
紅色部分是在讀出SD卡的0扇區(qū)內(nèi)容后需要做的修改,然后再寫進(jìn)Nand Flash的0扇區(qū)中。
聯(lián)系客服