SD卡(SecureDigital MemoryCard)即:安全數碼卡,它是在MMC的基礎上發展而來,是一種基於半導體快閃記憶器的新一代記憶設備,它被普遍地於便攜式裝置上使用,例如數碼相機、我的數碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司於1999年8月共同開發研製。git
SD卡按容量分類,能夠分爲3類:SD卡、SDHC卡、SDXC卡,以下表所示:安全
SD卡外形和接口圖以下圖所示:3d
SD卡由9個引腳與外部通訊,支持SPI和SDIO兩種模式,不一樣模式下,SD卡引腳功能描述以下表所示:blog
①高容量,最大可達2TB(目前已有512GB的SD卡)。接口
②高安全性。開發
③高速,目前已有讀取速度近100MB/S的SD卡。文檔
④體積小巧,標準SD卡大小隻有一張郵票大小,重量僅2g。it
⑤接口簡單,支持SPI和SDIO兩種訪問模式。pdf
注意:TF卡+卡套,組合起來也能夠當SD卡用,不過,很大一部分TF卡,不支持SPI訪問模式。因此,SPI驅動SD卡的時候,儘可能選擇大卡(SD卡),而不要選擇TF卡。基礎
SD的5個寄存器
這些寄存器的詳細介紹,請參考《SD卡2.0協議.pdf》第五章
要實現SDIO驅動SD卡,最重要的步驟就是SD卡的初始化,只要SD卡初始化完成了,那麼剩下的(讀寫操做)就簡單了,因此咱們這裏重點介紹SD卡的初始化。
下圖參見《SD卡2.0協議.pdf》這個文檔。
從SD卡初始化流程可知,無論什麼卡(這裏咱們將卡分爲4類:SD2.0高容量卡(SDHC,最大32G),SD2.0標準容量卡(SDSC,最大2G),SD1.x卡和MMC卡),首先咱們要執行的是卡上電(設置SDIO_POWER
[1:0]=11),上電後發送CMD0,對卡進行軟復位,以後發送CMD8命令,用於區分SD卡2.0,只有2.0及之後的卡才支持CMD8命令,MMC卡和V1.x的卡,是不支持該命令的。CMD8命令格式以下表:
在發送CMD8的時候,經過其帶的參數咱們能夠設置VHS位,以告訴SD卡,主機的供電狀況,讓SD卡知道主機的供電範圍。
VHS位定義以下表所示:
這裏咱們使用參數0X1AA,即告訴SD卡,主機供電爲2.7~3.6V之間,若是SD卡支持CMD8,且支持該電壓範圍,則會經過CMD8的響應(R7,關於SD卡響應,請參考《SD卡2.0協議.pdf》第4.9節)將參數部分本來返回給主機,若是不支持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位有效數據(CID寄存器內容),存放在SDIO_RESP1~4等4個寄存器裏面。經過讀取這四個寄存器,就能夠得到SD卡的CID信息。
CMD3,用於設置卡相對地址(RCA,必須爲非0),對於SD卡(非MMC卡),在收到CMD3後,將返回一個新的RCA給主機,方便主機尋址。RCA的存在容許一個SDIO接口掛多個SD卡,經過RCA來區分主機要操做的是哪一個卡。對於MMC卡,則不是由SD卡自動返回RCA,而是主機主動設置MMC卡的RCA,即經過CMD3帶參數(高16位用於RCA設置),實現RCA設置。一樣MMC卡也支持一個SDIO接口掛多個MMC卡,不一樣於SD卡的是全部的RCA都是由主機主動設置的,而SD卡的RCA則是SD卡發給主機的。
在得到卡RCA以後,咱們即可以發送CMD9(帶RCA參數),得到SD卡的CSD寄存器內容,從CSD寄存器,咱們能夠獲得SD卡的容量和扇區大小等十分重要的信息。CSD寄存器咱們在這裏就不詳細介紹了,關於CSD寄存器的詳細介紹,請你們參考《SD卡2.0協議.pdf》。
至此,咱們的SD卡初始化基本就結束了,最後經過CMD7命令,選中咱們要操做的SD卡,便可開始對SD卡的讀寫操做了。
SD卡單塊數據塊讀取流程
SD卡多塊數據塊讀取流程
CMD16指令說明
CMD17指令說明
CMD18指令說明
CMD12指令說明
SD卡單塊數據塊寫入流程
SD卡多塊數據塊寫入流程
CMD13指令說明
R1響應:
SD卡狀態,請參考《SD卡2.0協議.pdf》第63頁-Table4-35
CMD24指令說明
ACMD23指令說明
注意:發送ACMD以前,必須先發送CMD55,通知SD卡,接下來要發送的是應用命令(APPCMD),而非標準命令
CMD55指令說明
CMD25指令說明