2011年6月20日 星期一

DIY - PIC:PIC18F4550 SD Card Inside (八十六)

DIY - PICPIC18F4550 SD Card Inside (十六)

讀取 SD 記憶卡內的資料首先需要安裝一個叫做 WinHEX 的軟體。WinHEX 是一款相當優秀的 16 進制代碼編輯器,它可以進行 HexASCII 編碼的編輯與修改,支持多檔搜尋替換功能模式,一般和邏輯運算,磁片磁區的編輯 (包括 FAT16FAT32 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. 根據檔系統的基本配置資訊計算 FATFDT,資料簇的起始位址和大小。 
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)
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=0x4E000x0200 是一個磁區大少 512byte

BPB 所在的位置 = 0x00000027 x 0x0200=0x4E00 (磁區 0x27=39)

DBR (DOS Boot Record) 內容值含義解釋
BPB 資訊包括總磁區數,每磁區的位元組數,FAT 表數目和大小,根目錄的位置等等,這些資訊對於FAT檔系統來講是基本參數,直接決定後面的檔操作的正常與否。也就是邏輯磁區 0 號。但邏輯 0 磁區並不在 0 號磁區之中,使用 WinHex,看 0 磁區 (0x4E00),結果如下所示。

BPB (BIOS Parameter block) 位置 0x4E00 (磁區 0x27=39)
0x4E030x4E0A的內容為 ASCII 碼的“MSDOS5.0” 
0x4E0B0x4E0C的兩個位元組 00 02,即 0x0200=512,代表每個磁區 (sector) 512 個位元組(byte) 
0x4E0D02 代表每個簇 (cluster) 2 個磁區 
0x4E0E0x4E0F的兩個位元組 06 00 0x6 代表有 6-1 個保留磁區,即是第一個 FAT表所在磁區為引導磁區 (39)+6=磁區45 = 0x6 x 0x200 = 0x000C00 
0x4E1002 代表有兩個 FAT  
0x4E110x4E1200 02,即 0x2000=512,代表 FDT(目錄區) 512 登記項 
0x4E160x4E17的兩個位元組 ED 00,即 0x00ED=237,代表每個 FAT 表占 237 個磁區 
0x4E360x4E3D代表的就是“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 (File Allocation Table) 表的標誌在最前 2-4 個位元組,如果是 FAT16,那麼應該前兩個位元組一定是是 0xF8 0xFF,如果是 FAT32,前四個自己一定是 0xF8 0xFF 0xFF 0x0F;如果 FAT 表有備份,那麼還要檢查第二個 FAT 表的內容。

以下是FAT表的結構:
 
上表中,0607 單元映射了磁片3號簇區。有之前的介紹中可以知道,我這張 SD 1個簇包含 4 個磁區。也就是說在寫資料時,只有寫完了3號簇的 4 個扇後,將 FAT 表的0607 單元填寫 0400;才可繼續在04號簇上寫資料。如果資料寫完後還沒有寫滿3號簇,則在 FAT 表的 0607單元填寫 FFFF.也就是說在 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)
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
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)
2011 06 20 天氣報告 
氣溫: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 記憶卡 程式 (八十三)

沒有留言:

張貼留言