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