SDIO

一.SDIO 简介:
STM32F1 的 SDIO 控制器包含 2 个部分:SDIO 适配器模块和 AHB 总线接口,其功能框图
如图 40.1.1.1 所示
在这里插入图片描述
1.SDIO_D介绍:
a.如果一个 SD 或 SD I/O 卡接到了总线上,可以通过主机配置数据传输使用 SDIO_D0 或SDIO_D[3:0]。所有的数据线都工作在推挽模式
b.如果一个多媒体卡接到了总线上,则 SDIO_D0、SDIO_D[3:0]或 SDIO_D[7:0]可以用于数据传输
所有的数据线都工作在推挽模式

2.SDIO_CMD 介绍:
SDIO_CMD 有两种操作模式:
① 用于初始化时的开路模式(仅用于 MMC 版本 V3.31 或之前版本)
② 用于命令传输的推挽模式(SD/SD I/O 卡和 MMC V4.2 在初始化时也使用推挽驱动)

3.SDIO 的时钟:
a. 卡时钟(SDIO_CK):对于 SD 或 SD I/O 卡,时钟频率可以在 0MHz 至 25MHz
间变化 SDIO_CK=SDIOCLK/(2+CLKDIV)

b. SDIO 适配器时钟(SDIOCLK):其频率等于 AHB 总线频率(HCLK),并用于产生 SDIO_CK 时钟一般为72M

c. AHB 总线接口时钟(HCLK/2):该时钟用于驱动 SDIO 的 AHB 总线接口,其频率为
HCLK/2

二.SDIO 的命令与响应
应用相关命令(ACMD)和通用命令(CMD)
注意:必须先发送通用命令(CMD55),然后才能发送应用相关命令(ACMD)。
1.SDIO 的命令格式如表 40.1.3.1 所示
在这里插入图片描述
我们需要设置的就只有命令索引和参数部分
一般情况下,选中的 SD 卡在接收到命令之后,都会回复一个应答(注意 CMD0 是无应答的),这个应答我们称之为响应,响应也是在 CMD 线上串行传输的

2.响应格式:
短响应(48 位)和长响应(136 位)
注意:这两种响应类型都带 CRC 错误检测(注意不带 CRC 的响应应该忽略 CRC 错误标志,如 CMD1 的响应)
长/短响应的格式如表 40.1.3.2 所示
在这里插入图片描述
说明:
对于短响应,命令索引存放在 SDIO_RESPCMD 寄存器,参数则存放在 SDIO_RESP1 寄存器里面。
对于长响应,则仅留 CID/CSD 位域,存放在 SDIO_RESP1~SDIO_RESP4 等 4 个寄存器

三.SD存储卡响应格式
SD 存储卡总共有 5 类响应(R1、R2、R3、R6、R7)
以R1响应为例说明:
在这里插入图片描述
在收到 R1 响应后,我们可以从 SDIO_RESPCMD 寄存器和 SDIO_RESP1 寄存器分别读出命令索引和卡状态信息

四.SDIO 控制器与 SD 卡之间的传输
a.对于 SDI/SDIO 存储器,数据是以数据块的形式传输的,
b.对于 MMC 卡,数据是以数据块或者数据流的形式传

1.SDIO(多)数据块读操作,如图 40.1.3.1 所示:
在这里插入图片描述
注意:
单个数据块读的时候,在收到 1 个数据块以后即可以停止了,不需要发送停止命令(CMD12)。
但是多块数据读的时候,SD 卡将一直发送数据给主机,直到接到主机发送的 STOP 命令(CMD12)

2.SDIO(多)数据块写操作,如图 40.1.3.2 所示:
在这里插入图片描述
注意:
和读操作相比多了一个繁忙判断,新的数据块必须在 SD 卡非繁忙的时候发送。
这里的繁忙信号由 SD 卡拉低 SDIO_D0,以表示繁忙,SDIO 硬件自动控制,不需要我们软件处理

五.相关寄存器
在这里插入图片描述

SDIO 的数据 FIFO 寄存器(SDIO_FIFO)
a.他们由一组连续的 32 个地址上的 32 个寄存器组成
b. 要从 SD 卡读数据,就必须读 SDIO_FIFO 寄存器,要写数据到 SD 卡,则要写 SDIO_FIFO 寄存器
c.SDIO 将这 32 个地址分为 16 个一组,发送接收各占一半
d.每次读写的时候,最多就是读取发送 FIFO 或写入接收 FIFO 的一半大小的数据,也就是 8 个(32 个字节),这里特别提醒,我们操作 SDIO_FIFO(不论读出还是写入)必须是以 4 字节对齐的内存进行操作,否则将导致出错!

六.MIcor SD卡引脚图
在这里插入图片描述
在这里插入图片描述
七.SD卡初始化
在这里插入图片描述

在这里插入图片描述

ACMD41的命令和响应
在这里插入图片描述
SD 卡在接收到 ACMD41 后,返回 OCR 寄存器内容,
如果是 2.0 的卡,主机可以通过判断OCR 的 CCS 位来判断是 SDHC 还是 SDSC;
如果是 1.x 的卡,则忽略该位。
OCR 寄存器的最后一个位用于告诉主机 SD 卡是否上电完成,如果上电完成,该位将会被置 1

CMD8命令即响应
在这里插入图片描述
VHS 位定义如表 40.1.5.2 所示:
在这里插入图片描述

如果 SD 卡支持CMD8,且支持该电压范围,则会通过 CMD8 的响应(R7)将参数部分原本返回给主机

CMD2,用于获得 CID 寄存器的数据,CID 寄存器数据各位定义如表 40.1.5.5 所示:
在这里插入图片描述
SD 卡在收到 CMD2 后,将返回 R2 长响应(136 位),其中包含 128 位有效数据(CID 寄存器内容),存放在 SDIO_RESP1~4 等 4 个寄存器里面。通过读取这四个寄存器,就可以获得SD 卡的 CID 信息

CMD3,用于设置卡相对地址(RCA,必须为非 0),对于 SD 卡(非 MMC 卡),在收到CMD3 后,将返回一个新的 RCA 给主机,方便主机寻址

八.软件设计
a.读取
在这里插入图片描述

写入
在这里插入图片描述

1) SDIO 时钟相关初始化函数 SDIO_Init。
void SDIO_Init(SDIO_InitTypeDef* SDIO_InitStruct);
设置 SDIO_InitTypeDef 结构体类型参数成员变量的值达到设置 SDIO 时钟控制寄存器 SDIO_CLKCR 的目的,参数包括旁路时钟分频器,时钟分频系数等

2) SDIO 发送命令函数 SDIO_SendCommand。
void SDIO_SendCommand(SDIO_CmdInitTypeDef *SDIO_CmdInitStruct);
设置 SDIO 的命令寄存器 SDIO_CMD 和命令参数寄存器 SDIO_ARG
在发送命令之前,必须先设置命令参数,该函数既可以设置命令又可以设置参数一举两得

3) SDIO 数据通道配置函数 SDIO_DataConfig
void SDIO_DataConfig(SDIO_DataInitTypeDef* SDIO_DataInitStruct);
设置 SDIO_DataInitTypeDef 结构体类型参数成员变量的值来配置 SDIO 的数据
通道状态机,包括数据传输使能传输方向传输模式DMA 使能数据块长度等信息

4) SDIO 数据 FIFO 寄存器读写函数:SDIO_ReadData 和 SDIO_WriteData

5) 其他常用函数。
函 数 包 括 SDIO 时 钟 使 能 函 数 SDIO_ClockCmd ,
电源状态控制函数SDIO_SetPowerState,
SDIO DMA 使能函数 SDIO_DMACmd
以及 SDIO 状态获取函数SDIO_GetFlagStatus

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不知道起个啥名“”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值