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/