本文讲述SDIO的原理和SD卡的原理 SD卡着重讲解V2.0
SDIO的原理: SDIO是专门为SD卡做的总线协议是一个在APB2 总线和SD卡 MMC卡之间的一个总线协议。 SDIO 几乎可以驱动所有的SD卡或者MMC卡 。
下图是描述了SDIO的结构图:
由此图可以得知 SDIO_CK时钟线是依靠PCLK2和SDIOCLK两个时钟的操作 其中 PCLK2是APB2的时钟 SDIOCLK 是经过锁相环倍频以后得到的时钟。注意 PCLK2的时钟和SDIOCLK的关系必须符合一下的公式
下面图是SDIO的引脚说明
下面介绍SD卡的一些命令和response的一些知识以及程序的大致写法:
命令的格式如下图所示:
硬件会帮助写入除了参数和命令以外的数据 我们只要关心命令和参数就好
response的格式:
每个命令都有相应的回复命令 而且在stm32的硬件有一个叫STA的寄存器是校验CRC还有命令是否传达正确的寄存器
下面通过程序的流程来解释一下SDIO的驱动和SD卡
1. 一开始配置好了GPIO之后开始给配置SDIO 此时SDIO的CLK的必须小于400khz。 注意一上来的时候 卡是只有SDIO0 这个位工作 在初始化之后如果是SD2.0的卡请设置成4条线传输数据
2. 给SDIO上电 通过给寄存器SDIO->POWER 和SDIO->CLKCR置1 来开启时钟
3. 给SDIO发送CMD0 这个命令可以把SD卡置成idle的模式等待 实际上是给SD卡进行充电。 SDIO 需要给这个SD卡发送不少于74个时钟来给SD卡充电
4. 给SD卡发CMD8 CMD8 是为了来确定使用的SD卡的电压 CMD8的回复R7 我们也可以查询SDIO->STA 是否发送正常 下图是STA的寄存器的图:
5. 发送CMD55 CMD55是可以发送可以发送ACMD41 ACMD41可以进一步的去查阅此卡的电压从而确定是什么卡 是否此卡是好卡
6. 然后发送CMD2命令 可以得到CID的 CID是此卡的信息
7. 发送CMD3命令 可以得到RCA的值 这个值是此卡的相对地址值
8 发送CMD7 命令可以选中这个卡 (此时RCA这个值就是CMD7 的参数值)
9.此后我们可以改变卡的工作模式由1线变为4线 随后可以把传输速度变为12Mhz (SDV2.0 如果是高性能的卡可以变得更快)
这个时候初始化完毕 相关资料请看SD 2.0的相关文档和stm32的SDIO的文档有详细的介绍 下一节将会讲述如何写和读block的问题
注: 图上传不上去 。。。