想讀取 SD 記憶卡內的資料,首先需要安裝一個叫做 WinHEX 的軟體。WinHEX 是一款相當優秀的 16 進制代碼編輯器,它可以進行 Hex 和 ASCII 編碼的編輯與修改,支持多檔搜尋替換功能模式,一般和邏輯運算,磁片磁區的編輯 (包括 FAT16、FAT32和 NTFS 分區格式),檔比對和分析功能。
▲ WinHEX 軟體 |
▲ SD 記憶卡的內容 |
磁區資料 | 開始磁區 | 磁區計算 | 大小 | 磁區 | 結束磁區 |
Boot Sector | 0 (0x00) | (19.5KB *1024) /512 | 19.5KB | 39 | 38 |
BPB | 39 (0x27) | (3KB *1024) /512 | 3KB | 6 | 44 |
FAT1 | 45 | (118.5KB *1024) /512 | 118.5KB | 237 | 281 |
FAT2 | 282 | (118.5KB *1024) /512 | 118.5KB | 237 | 518 |
Directory | 519 | (16KB *1024) /512 | 16KB | 32 | 550 |
Data | 551 | (60653KB *1024) /512 | 60653KB | 121306 | 121856 |
讀取 SD 記憶卡文檔的流程:
1. 讀物理磁區 0,得到引導扇(邏輯磁區0)的偏移位址。
2. 讀引導扇的內容,得到檔系統基本配置資訊。
3. 根據檔系統的基本配置資訊計算 FAT,FDT,資料簇的起始位址和大小。
4. 根據要讀的檔案名搜索 FDT 表,找到要讀檔的起始資料簇編號,大小。
5. 根據檔的起始資料簇編號在 FAT 表中查找所有該檔佔用的資料簇及資料簇訪問的先後關係。
6. 讀取該檔的起始資料簇的內容,及下一資料簇內容(有需要時)。
首先,我們為了知道我們的 SD 記憶卡的基本資訊,MBR 是每個 SD 記憶卡最多只有一個,也可以沒有,而 DBR (DOS Boot Record) 是每個分區一個,SD 記憶卡有多少個分區就有多少個 DBR 區。而 DBR 表更可找到 BPB (BIOS Parameter block) 的位置,SD記憶卡資訊一般被存儲在 BPB 表中。DBR 會在物理磁區 0 號。
▲ DBR (DOS Boot Record) 位置 0x0000 (磁區 0x00=0) |
1. 正常的話,該磁區最後兩個位元組如上圖所示為 55 AA,如果不是則證明是讀錯了,或者該 SD 記憶卡沒有被格式化。
2. 在0x01CA 開始的四個位元組 D9 DB 01 00,即 0x0001DBD9=121,817,代表該 SD 卡有 121,817 個磁區,因為每個磁區有 512 位元組,所以該SD卡容量為121,817*512/1024/1024=59.48MByte
3. 在 0x0180 之前的區域全是 0,省略掉了。從上圖中看出,這必定不是 DBR,而是主引導扇。圖中藍框的地方,標示出了 DBR 所在的位置,藍框位置是 MBR 的磁區位置 (0x01C6~0x01C9) ,四個位元組 27 00 00 00,即 0x00000027 x 0x0200=0x4E00,0x0200 是一個磁區大少 512byte。
BPB 所在的位置 = 0x00000027 x 0x0200=0x4E00 (磁區 0x27=39)
▲ DBR (DOS Boot Record) 內容值含義解釋 |
▲ BPB (BIOS Parameter block) 位置 0x4E00 (磁區 0x27=39) |
0x4E0B~0x4E0C的兩個位元組 00 02,即 0x0200=512,代表每個磁區 (sector) 有 512 個位元組(byte)
0x4E0D的 02 代表每個簇 (cluster) 有 2 個磁區
0x4E0E~0x4E0F的兩個位元組 06 00 即 0x6 代表有 6-1 個保留磁區,即是第一個 FAT表所在磁區為引導磁區 (39)+6=磁區45 = 0x6 x 0x200 = 0x000C00
0x4E10的 02 代表有兩個 FAT 表
0x4E11~0x4E12的 00 02,即 0x2000=512,代表 FDT(目錄區) 有 512 登記項
0x4E16~0x4E17的兩個位元組 ED 00,即 0x00ED=237,代表每個 FAT 表占 237 個磁區
0x4E36~0x4E3D代表的就是“FAT16”的ASCII碼,說明這 SD 卡是 FAT16 的格式
FAT1 表位於0x004E00 + 0x000C00 = 0x005A00 (Sector=0x2D=45)
FAT2 表位於0x005A00 + 0x01DA00 = 0x023400 (Sector=0x11A=282)
FDT 表位於0x005A00 + 0x01DA00 + 0x01DA00 = 0x040E00 (Sector=0x207=519)
DATA 位於0x040E00 + 0x004000 = 0x044E00 (Sector=0x227=551)
▲ BPB (BIOS Parameter block) 內容值含義解釋 |
以下是FAT表的結構:
上表中,06、07 單元映射了磁片3號簇區。有之前的介紹中可以知道,我這張 SD 卡1個簇包含 4 個磁區。也就是說在寫資料時,只有寫完了3號簇的 4 個扇後,將 FAT 表的06,07 單元填寫 04,00;才可繼續在04號簇上寫資料。如果資料寫完後還沒有寫滿3號簇,則在 FAT 表的 06,07單元填寫 FF,FF.也就是說在 FAT 表中記錄著每個資料簇的狀態,且每個資料簇的狀態佔用兩個位元組。如果這兩個位元組等於 0xFFF,則代表該資料簇以被佔用,且檔在該資料簇中結束。如果這兩個位元組等於0x0001~0xFFFE,則代表該資料簇已被佔用,且該檔沒有結束,而該檔存放的下一資料簇的簇號就等於這兩個位元組的大小。
FAT16記錄項的取值含義(16 進制) | |
FAT16 記錄項的取值 | 對應簇的表現情況 |
0000 | 未分配的簇 |
0002~FFEF | 已分配的簇 |
FFF0~FFF6 | 系統保留 |
FFF7 | 壞簇 |
FFF8~FFFF | 文件結束簇 |
▲ FAT1 位置 0x5A00 (磁區0x2D=45) 地址範圍 0x5A00 - 0x0233FF 大小為 0x1DA00 =121344B (118.5kB) |
▲ FAT2 位置 0x023400 (Sector=0x11A=282) 與 FAT1 相同 |
▲ FDT (File Directory Table) 位置 0x040E00 (Sector=0x207=519) |
54 45 53 54 20 20 20 20 54 58 54 20 18 54 EE AA
CC 3E CC 3E 00 00 C8 BB CC 3E 03 00 4C 21 01 00
每個檔登記資訊如下圖所示:
▲ FDT 目錄的內容值含義解釋 |
▲ Datalog.txt 內容,位置 0x044E00 (Sector=0x227=551) |
▲ Test.txt 內容,位置 0x045200 (Sector=0x229=553) |
氣溫:28.5 度 @ 22:00
相對濕度:百分之73%
天氣:大致多雲
一號戒備信號 ( 2011 年 06 月 20 日 21 時 35 分 )
DIY - 電子 : PIC18F4550 MCHPMSD 實 驗板 (七十七)
DIY - 電子 : PIC18F4550 MCHPMSD 程式介紹 (七十八)
DIY - 電子 : PIC18F4550 MCHPMSD 編 程開始 (七十九)
DIY - 電子 : PIC18F4550 MCHPMSD 初始化 (八十)
DIY - 電子 : PIC18F4550 MCHPMSD 讀取 SD 記憶卡 程式 (八十一)
DIY - 電子 : PIC18F4550 MCHPMSD 寫入 SD 記憶卡 程式 (八十二)
DIY - 電子 : PIC18F4550 MCHPMSD SD 記憶卡 程式 (八十三)
沒有留言:
張貼留言