STM32——SD卡实验(SDIO方式)
一、SD卡簡介
1、什么是SD卡?
SD卡(Secure Digital Memory Card)即:安全數碼卡。它是在MMC的基礎上發展而來,是一種基于半導體快閃記憶器的新一代記憶設備,它被廣泛的用于便攜裝置上使用,例如數碼相機、個人數碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝以及美國SanDiak公司于1999年8月共同開發研制。SD卡容量分類,分為三類:SD卡、SDHC卡、SDXC卡。如下表所示:
?
SD卡外形和接口圖如下圖所示:
SD卡由9個引腳與外部通信,支持SPI和SDIO兩種模式,不同模式下,SD卡引腳功能描述如下表所示:
?
SD模式:第一個腳DAT3(也就是第四根數據線),第二個腳CDM(用于傳輸命令與響應),第三個腳VSS(接地GND),第四個腳VCC(電源),第五個腳CLK(提供SD卡時鐘),第六個引腳VSS(GND),第七位~第九位以及第一位組成四位寬的數據線訪問SD卡。
SPI模式:第一個腳CS(片選),第二腳MOSI,第三個腳VSS(GND),第四個腳VCC(電源),第五個腳CLK(時鐘腳),第六個腳VSS(GND),第七個腳MISO,第八個和第九個腳NC(沒有用到)。
2、SD卡特點
1、高容量,最大可達2TB(目前已有512GB的SD卡)
2、高安全性
3、高速(目前已有讀取速度近100MB/S的SD卡)
4、體積小巧,標準SD卡大小只有一張郵票大小,重量僅2g
5、接口簡單,支持SPI和SDIO兩種訪問模式。
注意:TF卡+卡套,組合起來可以當SD卡用,不過很大一部分TF卡不支持SPI訪問模式。所以SPI驅動SD卡的時候,盡量選擇大卡(SD卡),而不要選擇TF卡。
3、SD卡寄存器
SD卡一般有5個寄存器,如下表:
?
4、SD卡初始化流程
(要實現SDIO驅動SD卡,最重要的步驟就是SD卡的初始化,只要SD卡初始化完成了,那么剩下的操作就簡單了。)
?
首先Power-on,然后發送CMD0進行軟復位,然后發送CMD8(CMD8帶一個參數:主機的供電電壓范圍)。如果2.0以后的卡并且電壓參數支持主機的供電范圍,那么這個卡(2.0以后的卡)就會產生一個響應;如果是2.0以后的卡但是電壓參數不支持主機的供電范圍,那么就不會響應(1.X的卡、MMC卡也不會響應)。所以CMD8主要用來區分1.0和2.0的卡。如果是2.0的卡,則會產生一個響應,響應以后就可以知道這個SD卡的供電范圍,然后就發送ACMD41指令(附帶一個參數:HCS位:告訴主機是否支持SDHC(高容量)卡,如果主機支持SDHC那么就設置HCS位=1,不支持HCS=0),若發送ACMD41指令之后且支持SDHC同時這個卡剛好是SDHC,那么就會產生一個響應(卡已準備好),準備好之后會返回OCR寄存器數據。如果OCR中的CCS=1,那么這個卡就是2.0SDHC卡;CCS=0,這個卡就是2.0SD卡。如果發送CMD8之后不響應,就可能是1.0、MMC卡或者是2.0的卡但是不支持電壓范圍;然后也發送ACMD41指令且HCS=0,如果對指令有響應那么就是1.0的卡,如果不響應指令那么就可能是電壓不支持等其他原因;如果連ACMD41指令都沒發,那么可能就是MMC卡(通過發送CMD1來確定是不是MMC卡)。MMC卡的初始化比較簡單,發送CMD0和CMD1就可以了。
從SD卡初始化流程給可知,不管什么卡(將卡分為四類:SD2.0高容量卡、SD2.0標準容量卡、SD1.X卡和MMC卡),首先要執行的就是卡上電(設置SDIO_POWER[1:0]=11),上電之后發送CMD0,對卡進行軟復位,之后發送CMD8命令,用于區分SD卡2.0,只有2.0及以后的卡才支持CMD8命令,MMC卡和SD1.X的卡不支持該命令。
CMD8命令格式如下表:
在發送CMD8的時候,通過其帶的參數我們可以設置VHS位以告訴SD卡,主機的供電情況,讓SD卡知道主機的供電范圍。
VHS位定義如下表所示:
?
這里我們使用參數0X1A,即告訴SD卡,主機供電為2.7V~3.6V之間,如果SD卡支持CMD8,且支持電壓范圍,則會通過CMD8的響應將參數部分原本返還給主機,如果不支持CMD8,或不支持這個電壓范圍,則不響應。在發送CMD8后,發送ACMD41(注意:發送ACMD41之前要先發送CMD55),來進一步確認卡的操作電壓范圍,并通過HCS位來告訴SD卡,主機是不是支持高容量卡(SDHC)。
ACMD41命令格式如下表:
?
ACMD41指令響應(R3),包含了SD卡OCR寄存器內容,其定義如下圖:
對于支持CMD8的卡,主機設置ACMD41的參數HCS=1,告訴SD卡,主機支持SDHC卡。
對于2.0的卡,OCR的CCS位用于表示SDHC還是SDSC;對于1.X的卡,則忽略該位;對MMC卡,則不支持ACMD41,MMC卡只需發送:CMD0和CMD1即可完成初始化。
CMD2用于獲取CID寄存器數據,CID寄存器各位定義如下表:
?
SD卡在收到CMD2后,將返回R2長響應(136位),其中包含128位有效數據(CIR寄存器內容),存放在SDIO_RESP1~4等4個寄存器里面。通過讀取這四個寄存器,就可以獲取SD卡的CID信息。
CMD3用于設置卡相對地址(RCA,必須為0),對于SD卡(非MMC卡),在收到CMD3之后將返回一個新的RCA給主機,方便主機尋址。RCA的存在允許一個SDIO接口掛多個SD卡,通過RCA來區分主機要操作的是哪個卡。對于MMC卡,則不是由SD卡自動返回RCA,而是主機主動設置MMC卡的RCA,即通過CMD帶參數(高16位用于RCA設置),實現RCA設置。同樣MMC卡也支持一個SDIO接口掛多個MMC卡,不同于SD卡的是所有的RCA都是由主機主動設置的,而SD卡的RCA則是SD卡發給主機的。
在獲得卡RCA之后,我們便可以發送CMD9(帶RCA參數),獲得SD卡的CSD寄存器內容,從CSD寄存器,我們可以得到SD卡的容量和扇區大小等十分重要的信息。
二、SD卡讀數據
1、SD卡單塊數據塊讀取流程:
注意:CMD16設置的數據塊大小,一般為512節,此設置直接決定SD卡的塊大小,SD卡默認的塊大小自動失效。
2、SD卡多塊數據塊讀取流程:
3、CMD16指令說明:
?
4、CMD17指令說明:
?
5、CMD18指令說明:
?
6、CMD12指令說明:
?
7、SD卡單塊數據塊寫入流程:
發送CMD16指令,設置數據塊大小—>等待指令響應—>發送CMD13指令,查詢卡狀態—>
等待READY_FOR_DATA位=1—>發送CMD24指令,開始寫入數據—>寫一個數據塊的數據,完成單塊寫入。
8、SD卡多塊數據塊寫入流程
?
(發送ACMD23指令,預擦除數據塊)該指令僅對SD卡有效。另外,在ACMD指令發送之前需先發送CMD55
9、CMD13指令說明
?
10、R1響應:
?
11、CMD24指令說明:
?
12、ACMD23指令說明:
?
注意:發送ACMD之前,必須先發送CMD55,通知SD卡,接下來要發送的是應用命令(APP CMD),而非標準命令。
13、CMD55指令說明
?
14、CMD25指令說明
?
總結
以上是生活随笔為你收集整理的STM32——SD卡实验(SDIO方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我猜,你还不知道数据标注公司在做什么吧?
- 下一篇: 【题解】codeforces786A B