STM32下SD卡驅(qū)動詳解
說道SD卡就會想到他的具體驅(qū)動,網(wǎng)上也有很多例子,但是都沒這么詳細(xì)說一個(gè)過程對于新手很難吃懂,當(dāng)然這篇對于做過的同學(xué)來說沒有什么作用,現(xiàn)在來具體分析一下吧。
本文引用地址:http://www.ex-cimer.com/article/201611/316586.htm我們所說的SD卡只是閃存的一種其全稱是Secure Digital,意為“安全數(shù)碼”,是由日本兩大電器集團(tuán)松下電器和東芝聯(lián)手SanDisk共同推出的,于1999年8月首次發(fā)布。常見的閃存有:SD卡、CF卡、XD卡、MMC卡、SM卡、Mini SD卡、T-Flash卡。而SD卡又分類為:
SD、MiniSD、MicroSD、SDHC、MiniSD、MicroSD、SDXC、smart SD、SDI/O。它們在外形、速度、容量和命令都有區(qū)別。說道這就得說說最近的反日了,其實(shí)我們真沒必要給國家添麻煩了,我們身邊很多東西都是別人的,只是都不知道。所以壯大自己的知識為國家多做點(diǎn)事才是真正的愛國。
SD卡支持兩種總線方式:SD方式與SPI方式。其中SD方式采用6線制,使用CLK、CMD、DAT0~DAT3進(jìn)行數(shù)據(jù)通信。而SPI方式采用4線制,使用CS、CLK、DataIn、DataOut進(jìn)行數(shù)據(jù)通信。SD方式時(shí)的數(shù)據(jù)傳輸速度與SPI方式要快,采用單片機(jī)對SD卡進(jìn)行讀寫時(shí)一般都采用SPI模式。采用不同的初始化方式可以使SD卡工作于SD方式或SPI方式。
這就說明SD卡里面是有一個(gè)控制器的,有相應(yīng)寄存器,我們用SD卡其實(shí)是對相應(yīng)的寄存器的設(shè)置,設(shè)置好后就可以用命令來對它進(jìn)行操作了,(所以說SD卡用起來簡單,因?yàn)楹芏嗍耂D卡廠商已經(jīng)做了)。
一,SPI方式驅(qū)動SD卡的方法
SD卡的SPI通信接口使其可以通過SPI通道進(jìn)行數(shù)據(jù)讀寫。從應(yīng)用的角度來看,采用SPI接口的好處在于,很多單片機(jī)內(nèi)部自帶SPI控制器,不光給開發(fā)上帶來方便,同時(shí)也見降低了開發(fā)成本。然而,它也有不好的地方,失去了SD卡的快速的性能優(yōu)勢。(SPI模式下用USB下載測試只有100K~300K的速度,而用SD模式就可以高達(dá)3M~10M),這就是SPI嚴(yán)重的缺點(diǎn),但是對于我們學(xué)生用SPI是最簡單,SD模式有很復(fù)雜的模式轉(zhuǎn)換,轉(zhuǎn)來轉(zhuǎn)去的有一定的難度,不過也可以做SD模式,很多控制器都有SDIO了。
二,SD卡的命令
SD卡最重要的就是初始化,初始化重要的是命令的使用。SD卡初始化成功后幾乎都能用了,所以我們要重點(diǎn)看一下初始化,不同的卡又不同的初始化過程(初始化時(shí)要注意SPI的速度不要高于400K)
SD卡的典型初始化過程如下:
1、初始化與SD卡連接的硬件條件(MCU的 SPI配置,IO口配置);
2、上電延時(shí)(>74 個(gè) CLK)(必須的);
3、復(fù)位卡(CMD0);
4、激活卡,內(nèi)部初始化并獲取卡類型(CMD1(用于 MMC卡)、CMD55、CMD41)(不同的地方就在這里)
5.、查詢 OCR,獲取供電狀況(CMD58)(就是電壓,一般不判斷不然很多卡不能用);
6、是否使用CRC(CMD59)(CRC校驗(yàn));
7、設(shè)置讀寫塊數(shù)據(jù)長度(CMD16);
8、讀取 CSD,獲取存儲卡的其他信息(CMD9);
9、發(fā)送 8CLK 后,禁止片選;
下面用圖表示一下:(網(wǎng)上都有)
可以看出操作SD卡都是命令,只要把這些命令作用搞清楚就可以自己驅(qū)動SD卡了,我把命令都貼出來:
SPI方式下的要SD模式下的話STM官方有很詳細(xì)的庫文件;
Class0 :(卡的識別、初始化等基本命令集)
CMD0:復(fù)位SD 卡.
CMD1:讀OCR寄存器.
CMD9:讀CSD寄存器.
CMD10:讀CID寄存器.
CMD12:停止讀多塊時(shí)的數(shù)據(jù)傳輸
CMD13:讀 Card_Status 寄存器
Class2 (讀卡命令集):
CMD16:設(shè)置塊的長度
CMD17:讀單塊.
CMD18:讀多塊,直至主機(jī)發(fā)送CMD12為止 .
Class4(寫卡命令集) :
CMD24:寫單塊.
CMD25:寫多塊.
CMD27:寫CSD寄存器 .
Class5 (擦除卡命令集):
CMD32:設(shè)置擦除塊的起始地址.
CMD33:設(shè)置擦除塊的終止地址.
CMD38: 擦除所選擇的塊.
Class6(寫保護(hù)命令集):
CMD28:設(shè)置寫保護(hù)塊的地址.
CMD29:擦除寫保護(hù)塊的地址.
CMD30: Ask the card for the status of the write protection bits
class7:卡的鎖定,解鎖功能命令集
class8:申請?zhí)囟罴?/p>
class10 -11 :保留
其中 class1, class3,class9:SPI模式不支持
命令知道了我們來看一下命令的格式:
SD卡的指令由6字節(jié)(Byte)組成,如下:
Byte1:0 1 x x x x x x(命令號,由指令標(biāo)志定義,如CMD39為100111即16進(jìn)制0x27,那么完整的CMD39第一字節(jié)為01100111,即0x27+0x40)
Byte2-5:Command Arguments,命令參數(shù),有些命令沒有參數(shù)
Byte6:前7位為CRC(Cyclic Redundacy Check,循環(huán)冗余校驗(yàn))校驗(yàn)位,最后一位為停止位1
byte1 byte2-5 byte6
01命令號參數(shù) CRC校驗(yàn)+1
參數(shù)是命令需要的沒有參數(shù)的用0,比如CMD16在這寫的就是512。
評論