SD卡和FAT檔案系統示例

2021-06-09 16:05:16 字數 2444 閱讀 8835

1.   初始化sd卡:

我現在用的多是spi模式,所以在這裡只討論spi模式。在spi模式中,所有的指令都要求先將cs腳置0。所以這點,我在後面就不再強調了。

cmd0,使sd卡從sd模式轉到spi模式。判斷返回值r0,如果不是card is not ready,說明硬體上有問題。

cmd8,引數是0x000001aa,判斷sd卡符合哪個標準。如果返回illegalcommand,說明是ver1.x的卡,否則就是ver2.0的卡。

cmd1,如果是ver2.0的卡,引數是1<<30,否則就是0,讀取sd卡的狀態,反覆,直到cardisready或者超時。這裡有一 個問題,spec上建議使用acmd1,說是通用性比cmd1好,而且cmd1並不是一開始就可以使用的。但是我在實際使用中,發現一些老卡對這個指令會 返回parametererror。搞不懂是為什麼,而且實際使用中cmd1也很好用,並沒有出現sd卡不能初始化的問題,所以我現在都直接用cmd1。

到這裡基本上sd卡就初始化完畢了。接下來就可以讀取資料了。

2.  讀取cid(cmd10),sd卡鑑別資訊,這一步不是必須的

鑑別資訊中包括了生產商id,應用id,產品名稱,產品版本,產品序列號,生產日期。

3.  讀取csd(cmd9),sd卡資訊

返回的csd有兩個版本:

if (csd[0] & 0x40 ==0x40)    的卡

容量=1024l*(csd[8]<<8+csd[9]) 

if (csd[0] & 0x40 !=0x40)   // ver1.x的卡

容量=(((csd[6]&0x03)<<10)|(csd[7]<<2) |((csd[8]&0xc0)>>6) +1) * (1<<((((csd[9]&0x03)<<1)|((csd[10]&0x80)>>7))+ 2))

這個數字就是這張sd卡裡面總共有多少個扇區。

4. 讀取partitiontable

讀取sd卡的扇區0到buf。

如果buf[0]不是0xeb或者0xe9,說明這是乙個分割槽表。

buf[454]開始的四個byte是該分割槽的扇區數。例如63表示在這個分割槽前有63個扇區,那麼這個分割槽的第乙個扇區就是扇區63。

buf[458]開始的四個byte是該分割槽的扇區數。例如7990000,不是這個分割槽有7990000個扇區。那麼這個分割槽的塊位址就是63~7990063。

乙個裝置可以最多有四個分割槽,其他三個分割槽的相關資料是在buf[470]/buf[474],buf[486]/buf[490],buf[502]/buf[506]。

注意,讀取buf的時候檢查最好兩位,應該是55aa。

5.  讀取bpb

到這裡我們已經知道第乙個分割槽是在什麼位置了。現在需要做的就是讀取這個分割槽的0扇區,也就是sd卡的第36個扇區。讀到的512個byte就是這個分割槽的詳細資料了。

檢查buf[0],應該是0xeb或者0xe9。如果是的話,那就是bpb表了。

接下來比較重要的幾個數字是:

buf[13]的sectorspercluster,就是每個簇的扇區數,也就是你在讀取檔案是需要一次讀取的扇區數。例如8。

buf[14-15]的reservedsectors,保留扇區數,這個保留扇區是在分割槽第乙個扇區到fat表之間的扇區數。例如38。

buf[28-31]的hiddensectors,隱藏扇區數,這個隱藏扇區指的是在這個分割槽前面有多少個扇區,這個值在分割槽表裡也有的。就是63。

buf[19-20]和buf[32-35],前者是fat16格式中的扇區數,後者是fat32格式中的扇區數。這個值在分割槽表裡也是有的。就是7990000。

buf[16],fat表數,一般是2。

buf[22-23],buf[36-39],fat表占用的扇區數,前者是fat16的,後者是fat32的。例如7793。

好了,到這裡我們就可以讀取fat檔案系統中的資料了。

6. 讀取fat表

在上面的例子中,fat表的位置應該是分割槽的第乙個扇區再偏移隱藏扇區數,就是63+38,等於101。所以從sd卡的101扇區開始,就是分割槽一的fat表,一共有7793個扇區。

7.  讀取根目錄

在fat16中,根目錄是單獨的。應該是可以建立512個檔案,每個檔案占用32byte,所以總共是512*32/512=32個扇區。

根目錄是跟在fat表後面的,所以第乙個扇區是在101+7793*2=15687。

對於fat32系統,這段忽略。

8. 讀取資料區

fat16中,資料區是在根目錄後面的,所以第乙個扇區是15687+32=15719。就是在sd卡上的第15719個扇區。

而fat32中,由於沒有根目錄,所以資料區直接跟在fat表後面的,所以就是第15687個扇區。這個扇區就是lba=2的地方。所以之後如果上層的檔案操作函式,要對lba=1000寫資料,那就是對1000+15687=16687扇區進行寫操作。

到此,我們就得到了整個fat系統的結構和資料,接下來就可以開始操作檔案了。

sd卡驅動 FAT檔案系統(三)

4 測試和使用 移植好以後,經過測試,可以順利讀出sd卡中的檔案,在使用過程中遇到兩個問題 1 怎麼讀寫sd卡子目錄裡面的檔案?在fatfs檔案系統中,檔案目錄相關的函式有 fresult f opendir dir const char open an existing directory fre...

sd卡檔案系統

在手機tf卡經歷多次受損後 chksdk終於失去作用 換了讀卡器,先前的是用類似u盤的,後面是專業 先前手機執行狀態下解除安裝unmountsd卡再裝上測試可行 曾有多次 可能導致檔案系統內交叉鏈結太多 壞前有大量讀寫,直接執行解除安裝,結果檔案系統變成raw 尋求解答,發現原格式是fat檔案系統根...

製作SD卡檔案系統

一 先說一下關於檔案系統方面的東西 因為根檔案系統主要負責啟動執行的配置檔案,所以linux在啟動必須先掛載根檔案系統。這樣 在啟動後就可以自動或手動掛載其他檔案系統。常見的檔案系統型別 儲存裝置 檔案系統 型別 ramdram proc,sysfs,ranfs sdram rom各種 flash ...