SD卡的命令格式及解析

SD卡的命令格式:

 

SD卡的指令由6字節(Byte)組成,如下:

Byte1:0 1 x x x x x x(命令號,由指令標誌定義,如CMD39爲100111即16進制0x27,那麼完整的CMD39第一字節爲01100111,即0x27+0x40)

Byte2-5:Command Arguments,命令參數,有些命令沒有參數

Byte6:前7位爲CRC(Cyclic Redundacy Check,循環冗餘校驗)校驗位,最後一位爲停止位0

2.SD卡的命令

SD卡命令共分爲12類,分別爲class0到class11,

不同的SDd卡,主控根據其功能,支持不同的命令集 如下:

Class0 :(卡的識別、初始化等基本命令集)

CMD0:復位SD 卡.

CMD1:讀OCR寄存器.

CMD9:讀CSD寄存器.

CMD10:讀CID寄存器.

CMD12:停止讀多塊時的數據傳輸

CMD13:讀 Card_Status 寄存器

Class2 (讀卡命令集):

CMD16:設置塊的長度

CMD17:讀單塊.

CMD18:讀多塊,直至主機發送CMD12爲止 .

 

Class4(寫卡命令集) :

CMD24:寫單塊.

CMD25:寫多塊.

CMD27:寫CSD寄存器 .

Class5 (擦除卡命令集):

CMD32:設置擦除塊的起始地址.

CMD33:設置擦除塊的終止地址.

CMD38: 擦除所選擇的塊.

Class6(寫保護命令集):

CMD28:設置寫保護塊的地址.

CMD29:擦除寫保護塊的地址.

CMD30: Ask the card for the status of the write protection bits

 

class7:卡的鎖定,解鎖功能命令集

class8:申請特定命令集 。

class10 -11 :保留

 

有關sd卡驅動和fat fs的實現用了3個文件來實現。sdboot.c爲sd的驅動(可理解爲pdd)層,主要實現一些對sd控制器的配置以及一些基本sd命令的實現和對sd 卡的操作。sdmmc.c實現了從sd卡讀取nk並跳到內存去運行的代碼(基本可以理解爲sd驅動的mdd層)。sdfat.c文件就是實現fat fs的。mdd層通過fatfs來對pdd層操作以實現讀取文件。

    在整個過程中遇到了很多問題,現在列舉如下:

1)sd卡初始化問題

    配置gpio有關sd的功能:SDCMD, SDDAT[3:0]。

    使能CLKCON中的SDI位。

    時鐘以及計算公式:SDIPRE   = PCLK/(CLK)-1;INICLK=300000;SDCLK=24000000; MMCCLK= 15000000

    cmd0-cmd55-cmd41-cmd2-cmd3-cmd7-cmd6-cmd17

2)對sd卡操作問題

    SD卡包括:一個標識寄存器CID,一個相應地址寄存器RCA,一個其他參數寄存器

CSD。

    對sd卡的操作是驅動通過sd controller來發相應的命令以達到讀寫等操作的:發送命令通過SDICmdCon[7:0]的除了開始2bit:CmdIndex放置要發送的命令號;SDICmdCon[8]開始發送命令來完成的。

    檢測卡的插入,直接用中斷引腳的電平來判斷。

    判斷插入的卡是否是sd卡,用命令cmd55和cmd41,因爲mmc卡對cmd55不做迴應。

    命令9就是獲取sd卡中csd寄存器的值的,該值包括很多sd卡的信息,其中就有sd卡的容量。這個值在sd卡接收到cmd9之後會以response的 形式存放在sd控制器的SDI Response Register[0,1,2,3]中。在執行cmd9,cmd10等這樣的命令的時候,卡的狀態應該是不選中的,或直接在執行它們之前發送 cmd7(0)不選中卡,不然的話會timeout。

    用cmd17來讀取單個block的數據,該命令要帶地址參數(該參數通過cmd3命令來獲取),然後根據SDIDSTA和SDIFSTA狀態值來從sd 控制器的SDIDAT寄存器中讀出要讀的數據。該命令與cmd9相反,在執行它之前要選中卡。讀完一個block之後要做一些善後工作,爲下次讀取做好準 備,不然的話checkcmdend就要一直循環了。因爲用的是每次都讀一個block,並地址要以block對齊,這樣就要考慮要讀取的地址是否是 block對齊的,長度是否夠一個block。

    SDIDCON這個數據控制寄存器也很重要,一些對數據的操作形式就是在這裏設置的。

3)fat文件系統問題

    根據MBR找到分區表,根據分區表找到該分區MBR[446B+4個分區表(每個16B)+2B結束符)

    分區表中的第9-12字節爲該分區的啓始地址(單位沒sector),第13-16字節爲分區的長度(單位也是sector)

http://hjx5548.blog.163.com/blog/static/563676392009111704249875/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章