学习笔记之基于STM32F103的SD卡实验

1. SD卡协议

SD卡的寄存器

图1   SD卡寄存器
                                                                                                                                                           

2. SDIO控制器

注:SD卡一般可以支持SDIO和SPI两种方式,本次只学习SDIO方式。

2.1 SDIO的功能

STM32F1 的 SDIO 控制器支持多媒体卡(MMC 卡)、SD 存储卡、SD I/O 卡和 CE-ATA 设
备等。SDIO 的主要功能如下:
➢ 与多媒体卡系统规格书版本 4.2 全兼容。支持三种不同的数据总线模式:1 位(默认)、
4 位和 8 位。
➢ 与较早的多媒体卡系统规格版本全兼容(向前兼容)。
➢ 与 SD 存储卡规格版本 2.0 全兼容。
➢ 与 SD I/O 卡规格版本 2.0 全兼容:支持良种不同的数据总线模式:1 位(默认)和 4 位。
➢ 完全支持 CE-ATA 功能(与 CE-ATA 数字协议版本 1.1 全兼容)。 8 位总线模式下数据
传输速率可达 48MHz。
➢ 数据和命令输出使能信号,用于控制外部双向驱动器。
➢ SDIO不管从主控制器向SD卡传输还是接受都只以CLK时钟线的上升沿有效。
STM32F1 的 SDIO 控制器包含 2 个部分:SDIO 适配器模块和 AHB 总线接口,其功能框图
如图示:

图2  STM32F1 SDIO 控制器功能框图

SDIO_CK(SD卡接口时钟线):由SDIO主机产生,一般不超过400Khz,此外SDIO_CK 与 SDIOCLK 的关系:SDIO_CK = SDOCLK/(2+CLKDIV);

SDOCLK(SDIO适配时钟线):该时钟用于驱动 SDIO 适配器,其频率等于 AHB 总线频率(HCLK);    

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

SDIO_CMD:控制命令线,SDIO主机可以由此发送命令来控制SD卡,此外也可以通过该线接受应答信号;

SDIO_D:数据线。                                                                                                                   

 注:复位后默认情况下 SDIO_D0 用于数据传输。初始化后主机可以改变数据总线的宽度(通过 ACMD6 命令设置)。如果一个多媒体卡接到了总线上,则 SDIO_D0、SDIO_D[3:0]或 SDIO_D [7:0]可以用于数据传输(由于MMC 版本 V3.31 和之前版本的协议只支持 1 位数据线,所以只能用 SDIO_D0)。如果一个 SD 或 SD I/O 卡接到了总线上,可通过主机配置数据传输使用 SDIO_D0  或 SDIO_D[3:0]。

2.1 SDIO的命令和响应

SDI数据是以块的形式进行传输的,数据块的长度一般是512个字节。此外,数据块需要CRC位(由SD卡硬件系统产生,可以单线或者4线控制)来保证传输成功。

图3 SDIO命令格式

在实际操作中,我们只需要编写索引(例如:CMD0,CMD1)和参数部分(利用SDIO_ARG寄存器控制),一般SD卡收到命令后会发送应答(除了CMD0),这种响应有长(136位,一般是R2 类)短(48位)之分但都含有CRC(或1111111)校验。值得注意的是,传输位为1时表示命令,传输位为0是表示响应。

图4 长响应格式

图5 短响应格式 

接下来,本文列举了一些常用的命令及响应集:

CMD0[31:0]复位所有卡到空闲状态
CMD2[31:0]R2通知所有卡返回CID值
CMD3[31:0]R6通知所有卡发布新的RCA
CMD8[31:12]保留位[16:0]填充位R7发送卡的接口信息,包括电压等
CMD15[31:12]保留位[16:0]填充位使卡进入inactive模式
ACMD41[31]保留位[30]HCS(OCR)[29:24]保留位[23:0]电压R3要求卡发送它的支持信息(HCS)和OCR的内容
ACMD55[31:16]RCA[16:0]填充位R1指定下个命令是特定应用命令(用于ACMD41前)

 图5 SD常用响应 

2.2 SDIO的相关寄存器

电源控制寄存器(SDIO_POWER) 控制SD卡的供电
时钟控制寄存器(SDIO_CLKCR)主要用于设置SDIO_CK的分配系数
参数控制寄存器(SDIO_ARG)存储命令参数,写命令前先写入此寄存器
命令响应寄存器(SDIO_RESPCMD)存储最后收到的命令响应中的命令索引
响应寄存器组(SDIO_RESP1~SDIO_RESP4)存放接收到卡的响应部分的信息。短响应放在SDIO_RESP1中,长响应依次放在4个寄存器中。
命令寄存器(SDIO_CMD)主要设置命令索引
数据定时器寄存器(SDIO_DTIMER)用于存储 以卡总线时钟(SDIO_CK)为周期的数据超时时间
数据长度寄存器(SDIO_DLEN) 设置需要传输的数据字节长度
数据控制寄存器(SDIO_DCTRL)    用于控制数据通道状态机(DPSM),包括数据传输使能、传输方向、传输模式、DMA 使能、数据块长度等信息
状态寄存器(SDIO_STA)用来查询 SDIO 控制器的当前状态
数据 FIFO 寄存器(SDIO_FIFO)数据 FIFO 寄存器包括 接收和发送 FIFO
FIFO计数器寄存器(SDIO_FIFOCNT) 当SDIO_DCTRL中的DTEN使能,并且DPSM处于Idle state时,SDIO_LEN/4的数值加载到该寄存器中
中断寄存器(SDIO_ICR)       
中断屏蔽寄存器(SDIO_MASK)    
注:为了防止FIFO寄存器出错,所有的数据均严格按4字节传输。
2.3 工作流程

 图6 SDIO工作流程 
 免责声明:本文所引用的各种资料均用于自己学习使用,这里感谢正点原子和野火官方的资料以及各位优秀的创作者。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值