01、SD卡簡介
SD卡(SecureDigital MemoryCard)即:安全數碼卡,它是在MMC的基礎上發展而來,是一種基於半導體快閃記憶器的新一代記憶設備,它被廣泛地於便攜式裝置上使用,例如數碼相機、個人數碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司於1999年8月共同開發研制。
SD卡按容量分類,可以分為3類:SD卡、SDHC卡、SDXC卡,如下表所示:
SD卡外形和接口圖如下圖所示:
SD卡由9個引腳與外部通信,支持SPI和SDIO兩種模式,不同模式下,SD卡引腳功能描述如下表所示:
02、SD卡特點
①高容量,最大可達2TB(目前已有512GB的SD卡)。
②高安全性。
③高速,目前已有讀取速度近100MB/S的SD卡。
④體積小巧,標准SD卡大小只有一張郵票大小,重量僅2g。
⑤接口簡單,支持SPI和SDIO兩種訪問模式。
注意:TF卡+卡套,組合起來也可以當SD卡用,不過,很大一部分TF卡,不支持SPI訪問模式。所以,SPI驅動SD卡的時候,盡量選擇大卡(SD卡),而不要選擇TF卡。
03、SD的寄存器
SD的5個寄存器
這些寄存器的詳細介紹,請參考《SD卡2.0協議.pdf》第五章
04、SD卡的操作
4.1、SD的初始化
要實現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卡的讀寫操作了。
4.2、SD卡讀操作
SD卡單塊數據塊讀取流程
SD卡多塊數據塊讀取流程
CMD16指令說明
CMD17指令說明
CMD18指令說明
CMD12指令說明
4.3、SD卡寫操作
SD卡單塊數據塊寫入流程
SD卡多塊數據塊寫入流程
CMD13指令說明
R1響應:
SD卡狀態,請參考《SD卡2.0協議.pdf》第63頁-Table4-35
CMD24指令說明
ACMD23指令說明
注意:發送ACMD之前,必須先發送CMD55,通知SD卡,接下來要發送的是應用命令(APPCMD),而非標准命令
CMD55指令說明
CMD25指令說明