基于STM32 SDIO接口驱动SD卡的设计(下)
接上篇
2.1 SD卡初始化
实现SDIO驱动SD卡,最重要的步骤是 SD卡的初始化。 STM32F1的SDIO控制器可支持SD2.0 高容量卡(SDHC,最 大32G)、SD2.0 标准容量卡(SDSC,最大 2G)以及SD1.x 卡和 MMC卡,本文采用SDHC作为数据采集模块的存储单 元。卡的类型不同,所支持的协议也不同。因此在初始化过 程中,主控制器必须先判断卡的类型,获得卡的基本信息, 最后完成卡的初始化,即对相关的寄存器进行配置。SD卡 的初始化流程如图5所示。
首 先 , 要 初 始 化 与 S D 卡 连 接 的 硬 件 资 源 , 如 对
图5 SD卡的初始化流程
STM32F1的SDIO、GPIO和NVIC等相关的寄存器进行配置。
然后执行卡上电操作,发送CMD0指令,对卡进行软复位。 上电重置之后,主控制器通过CMD8指令区分SD卡类型, 只有SD2.0的卡才会响应该指令,MMC卡和SD1.x的卡不会 响应;在发送CMD8的时候,参数需要设置VSH位以获得主 控制器的供电情况。接着发送应用命令ACMD41(发送该命 令之前要先发送 CMD55),设置参数的HCS 位以告诉 SD 卡,主控制器是否支持高容量卡(SDHC)。SD 卡接收到 ACMD41 后,返回SD 卡的OCR 寄存器内容,主控制器通过 OCR 寄存器CCS位完成对SD 2.0卡的识别。
识别卡的类型后,便可发送CMD2 和 CMD3 命令,分 别用于获得卡 CID 寄存器数据和卡相对地址(RCA)。获得 卡 RCA 之后,便可以发送 CMD9(带 RCA 参数),获得 SD 卡的 CSD 寄存器内容,其包括SD卡的容量和扇区大小等十 分重要的信息。至此,SD卡的初始化基本结束,最后通过 CMD7 命令,选中要操作的SD卡,即可开始对 SD 卡进行读 写操作。
SD卡初始化函数关键代码如下:
SD_Error SD_Init(void)
{
SD_Error errorstatus = SD_OK; //重置SD_Error状态 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驱动卡读/写数据
S D 卡 初 始 化 完 成 后 , 就 可 以 使 用 S D I O 向 S D 卡 读 、 写数据了。 SDIO控制器与SD卡一般是以数据块的形式进 行通信。SD数据的读写主要用到SDIO的数据FIFO寄存器
(SDIO_FIFO)。SDIO_FIFO包括接收和发送FIFO,他们 由一组连续的32 个地址上的 32 个寄存器组成,主控制器可 以使用 FIFO 读写多个操作数。要从SD卡读数据,必须读 SDIO_FIFO 寄存器,要写数据到 SD 卡,则要写 SDIO_FIFO寄存器。有关SDIO数据FIFO的读、写用到的固件库函数分
别是:uint32_t SDIO_ReadData (void) 和 void SDIO_WriteData (uint32_t Data)。通过调用这些接口函数,可以很方便地实 现SDIO驱动层的设计。
3 结论
通过SD卡主控制器的设计,将SD卡的存储方式创新性 地应用到快捷铁路货车监测系统的数据采集模块,简化了监 测系统的设计,减小了系统的尺寸,提高了系统的可靠性, 并且方便了与上位机的数据通信。本设计采用ARM Cortex?- M3内核的32位微控制器STM32F103作为主控制器,详细介 绍了SD卡和SDIO接口原理,所设计的硬件电路和软件满足 SD卡驱动的功能要求,可加快整个监测系统的设计进程。
- STM32学习笔记:在IAR中建立FWlib 3.0项目(08-13)
- 基于STM32单片机的火控系统信号采集测试(11-14)
- 基于LabVIEW的STM32调试平台设计(11-17)
- 基于STM32的LF RFID识别系统设计(11-25)
- STM32中断与嵌套NVIC快速入门(01-25)
- 基于TLC5947的旋转LED屏显示控制器设计(01-25)