SD卡(SecureDigital MemoryCard)即:安全數(shù)碼卡,它是在MMC的基礎(chǔ)上發(fā)展而來,是一種基于半導體快閃記憶器的新一代記憶設(shè)備,它被廣泛地于便攜式裝置上使用,例如數(shù)碼相機、個人數(shù)碼助理(PDA)和多媒體播放器等。SD卡由日本松下、東芝及美國SanDisk公司于1999年8月共同開發(fā)研制。
SD卡按容量分類,可以分為3類:SD卡、SDHC卡、SDXC卡,如下表所示:
SD卡外形和接口圖如下圖所示:
SD卡由9個引腳與外部通信,支持SPI和SDIO兩種模式,不同模式下,SD卡引腳功能描述如下表所示:
①高容量,最大可達2TB(目前已有512GB的SD卡)。
②高安全性。
③高速,目前已有讀取速度近100MB/S的SD卡。
④體積小巧,標準SD卡大小只有一張郵票大小,重量僅2g。
⑤接口簡單,支持SPI和SDIO兩種訪問模式。
注意:TF卡+卡套,組合起來也可以當SD卡用,不過,很大一部分TF卡,不支持SPI訪問模式。所以,SPI驅(qū)動SD卡的時候,盡量選擇大卡(SD卡),而不要選擇TF卡。
SD的5個寄存器
這些寄存器的詳細介紹,請參考《SD卡2.0協(xié)議.pdf》第五章
要實現(xiàn)SDIO驅(qū)動SD卡,最重要的步驟就是SD卡的初始化,只要SD卡初始化完成了,那么剩下的(讀寫操作)就簡單了,所以我們這里重點介紹SD卡的初始化。
下圖參見《SD卡2.0協(xié)議.pdf》這個文檔。
從SD卡初始化流程可知,不管什么卡(這里我們將卡分為4類:SD2.0高容量卡(SDHC,最大32G),SD2.0標準容量卡(SDSC,最大2G),SD1.x卡和MMC卡),首先我們要執(zhí)行的是卡上電(設(shè)置SDIO_POWER
[1:0]=11),上電后發(fā)送CMD0,對卡進行軟復位,之后發(fā)送CMD8命令,用于區(qū)分SD卡2.0,只有2.0及以后的卡才支持CMD8命令,MMC卡和V1.x的卡,是不支持該命令的。CMD8命令格式如下表:
在發(fā)送CMD8的時候,通過其帶的參數(shù)我們可以設(shè)置VHS位,以告訴SD卡,主機的供電情況,讓SD卡知道主機的供電范圍。
VHS位定義如下表所示:
這里我們使用參數(shù)0X1AA,即告訴SD卡,主機供電為2.7~3.6V之間,如果SD卡支持CMD8,且支持該電壓范圍,則會通過CMD8的響應(yīng)(R7,關(guān)于SD卡響應(yīng),請參考《SD卡2.0協(xié)議.pdf》第4.9節(jié))將參數(shù)部分原本返回給主機,如果不支持CMD8,或者不支持這個電壓范圍,則不響應(yīng)。
在發(fā)送CMD8后,發(fā)送ACMD41(注意:發(fā)送ACMD41之前,要先發(fā)送CMD55),來進一步確認卡的操作電壓范圍,并通過HCS位來告訴SD卡,主機是不是支持高容量卡(SDHC)
ACMD41命令格式如下表所示:
ACMD41指令響應(yīng)(R3),包含了SD卡OCR寄存器內(nèi)容,其定義如下表所示:
對于支持CMD8的卡,主機設(shè)置ACMD41的參數(shù)HCS=1,告訴SD卡,主機支持SDHC卡。
對2.0的卡,OCR的CCS位用于表示SDHC還是SDSC;對1.x的卡,則忽略該位;
對MMC卡,則不支持ACMD41,MMC卡只需要發(fā)送:CMD0和CMD1即可完成初始化。
CMD2用于獲取CID寄存器數(shù)據(jù),CID寄存器各位定義如下表:
SD卡在收到CMD2后,將返回R2長響應(yīng)(136位),其中包含128位有效數(shù)據(jù)(CID寄存器內(nèi)容),存放在SDIO_RESP1~4等4個寄存器里面。通過讀取這四個寄存器,就可以獲得SD卡的CID信息。
CMD3,用于設(shè)置卡相對地址(RCA,必須為非0),對于SD卡(非MMC卡),在收到CMD3后,將返回一個新的RCA給主機,方便主機尋址。RCA的存在允許一個SDIO接口掛多個SD卡,通過RCA來區(qū)分主機要操作的是哪個卡。對于MMC卡,則不是由SD卡自動返回RCA,而是主機主動設(shè)置MMC卡的RCA,即通過CMD3帶參數(shù)(高16位用于RCA設(shè)置),實現(xiàn)RCA設(shè)置。同樣MMC卡也支持一個SDIO接口掛多個MMC卡,不同于SD卡的是所有的RCA都是由主機主動設(shè)置的,而SD卡的RCA則是SD卡發(fā)給主機的。
在獲得卡RCA之后,我們便可以發(fā)送CMD9(帶RCA參數(shù)),獲得SD卡的CSD寄存器內(nèi)容,從CSD寄存器,我們可以得到SD卡的容量和扇區(qū)大小等十分重要的信息。CSD寄存器我們在這里就不詳細介紹了,關(guān)于CSD寄存器的詳細介紹,請大家參考《SD卡2.0協(xié)議.pdf》。
至此,我們的SD卡初始化基本就結(jié)束了,最后通過CMD7命令,選中我們要操作的SD卡,即可開始對SD卡的讀寫操作了。
SD卡單塊數(shù)據(jù)塊讀取流程
SD卡多塊數(shù)據(jù)塊讀取流程
CMD16指令說明
CMD17指令說明
CMD18指令說明
CMD12指令說明
SD卡單塊數(shù)據(jù)塊寫入流程
SD卡多塊數(shù)據(jù)塊寫入流程
CMD13指令說明
R1響應(yīng):
SD卡狀態(tài),請參考《SD卡2.0協(xié)議.pdf》第63頁-Table4-35
CMD24指令說明
ACMD23指令說明
注意:發(fā)送ACMD之前,必須先發(fā)送CMD55,通知SD卡,接下來要發(fā)送的是應(yīng)用命令(APPCMD),而非標準命令
CMD55指令說明
CMD25指令說明
聯(lián)系客服