基于STM32 SDIO接口驅(qū)動(dòng)SD卡的設(shè)計(jì)(下)
接上篇
2.1 SD卡初始化
實(shí)現(xiàn)SDIO驅(qū)動(dòng)SD卡,最重要的步驟是 SD卡的初始化。 STM32F1的SDIO控制器可支持SD2.0 高容量卡(SDHC,最 大32G)、SD2.0 標(biāo)準(zhǔn)容量卡(SDSC,最大 2G)以及SD1.x 卡和 MMC卡,本文采用SDHC作為數(shù)據(jù)采集模塊的存儲(chǔ)單 元??ǖ念愋筒煌?,所支持的協(xié)議也不同。因此在初始化過 程中,主控制器必須先判斷卡的類型,獲得卡的基本信息, 最后完成卡的初始化,即對(duì)相關(guān)的寄存器進(jìn)行配置。SD卡 的初始化流程如圖5所示。
首 先 , 要 初 始 化 與 S D 卡 連 接 的 硬 件 資 源 , 如 對(duì)
圖5 SD卡的初始化流程
STM32F1的SDIO、GPIO和NVIC等相關(guān)的寄存器進(jìn)行配置。
然后執(zhí)行卡上電操作,發(fā)送CMD0指令,對(duì)卡進(jìn)行軟復(fù)位。 上電重置之后,主控制器通過CMD8指令區(qū)分SD卡類型, 只有SD2.0的卡才會(huì)響應(yīng)該指令,MMC卡和SD1.x的卡不會(huì) 響應(yīng);在發(fā)送CMD8的時(shí)候,參數(shù)需要設(shè)置VSH位以獲得主 控制器的供電情況。接著發(fā)送應(yīng)用命令A(yù)CMD41(發(fā)送該命 令之前要先發(fā)送 CMD55),設(shè)置參數(shù)的HCS 位以告訴 SD 卡,主控制器是否支持高容量卡(SDHC)。SD 卡接收到 ACMD41 后,返回SD 卡的OCR 寄存器內(nèi)容,主控制器通過 OCR 寄存器CCS位完成對(duì)SD 2.0卡的識(shí)別。
識(shí)別卡的類型后,便可發(fā)送CMD2 和 CMD3 命令,分 別用于獲得卡 CID 寄存器數(shù)據(jù)和卡相對(duì)地址(RCA)。獲得 卡 RCA 之后,便可以發(fā)送 CMD9(帶 RCA 參數(shù)),獲得 SD 卡的 CSD 寄存器內(nèi)容,其包括SD卡的容量和扇區(qū)大小等十 分重要的信息。至此,SD卡的初始化基本結(jié)束,最后通過 CMD7 命令,選中要操作的SD卡,即可開始對(duì) SD 卡進(jìn)行讀 寫操作。
SD卡初始化函數(shù)關(guān)鍵代碼如下:
SD_Error SD_Init(void)
{
SD_Error errorstatus = SD_OK; //重置SD_Error狀態(tài) GPIO_Configuration(); //SDIO 外設(shè)底層引腳初始化 SDIO_DeInit(); //對(duì)SDIO的所有寄存器進(jìn)行復(fù)位 errorstatus=SD_PowerON(); //SD卡上電
if(errorstatus==SD_OK)
errorstatus=SD_InitializeCards(); //初始化 SD 卡,識(shí)別卡類型
if(errorstatus==SD_OK)errorstatus=SD_GetCardInfo(&SDCardInfo); //獲取卡信
息
if(errorstatus==SD_OK)
e r r o r s t a t u s = S D _ S e l e c t D e s e l e c t ( (u 3 2 ) ( S D C a r d In f o. RCA<<16)); //選中 SD 卡
return errorstatus; //初始化未成功,返回錯(cuò)誤信息
}
2.2 SDIO驅(qū)動(dòng)卡讀/寫數(shù)據(jù)
S D 卡 初 始 化 完 成 后 , 就 可 以 使 用 S D I O 向 S D 卡 讀 、 寫數(shù)據(jù)了。 SDIO控制器與SD卡一般是以數(shù)據(jù)塊的形式進(jìn) 行通信。SD數(shù)據(jù)的讀寫主要用到SDIO的數(shù)據(jù)FIFO寄存器
(SDIO_FIFO)。SDIO_FIFO包括接收和發(fā)送FIFO,他們 由一組連續(xù)的32 個(gè)地址上的 32 個(gè)寄存器組成,主控制器可 以使用 FIFO 讀寫多個(gè)操作數(shù)。要從SD卡讀數(shù)據(jù),必須讀 SDIO_FIFO 寄存器,要寫數(shù)據(jù)到 SD 卡,則要寫 SDIO_FIFO寄存器。有關(guān)SDIO數(shù)據(jù)FIFO的讀、寫用到的固件庫(kù)函數(shù)分
別是:uint32_t SDIO_ReadData (void) 和 void SDIO_WriteData (uint32_t Data)。通過調(diào)用這些接口函數(shù),可以很方便地實(shí) 現(xiàn)SDIO驅(qū)動(dòng)層的設(shè)計(jì)。
3 結(jié)論
通過SD卡主控制器的設(shè)計(jì),將SD卡的存儲(chǔ)方式創(chuàng)新性 地應(yīng)用到快捷鐵路貨車監(jiān)測(cè)系統(tǒng)的數(shù)據(jù)采集模塊,簡(jiǎn)化了監(jiān) 測(cè)系統(tǒng)的設(shè)計(jì),減小了系統(tǒng)的尺寸,提高了系統(tǒng)的可靠性, 并且方便了與上位機(jī)的數(shù)據(jù)通信。本設(shè)計(jì)采用ARM Cortex?- M3內(nèi)核的32位微控制器STM32F103作為主控制器,詳細(xì)介 紹了SD卡和SDIO接口原理,所設(shè)計(jì)的硬件電路和軟件滿足 SD卡驅(qū)動(dòng)的功能要求,可加快整個(gè)監(jiān)測(cè)系統(tǒng)的設(shè)計(jì)進(jìn)程。
評(píng)論