SD卡读写

本文介绍了SD卡的物理结构、SDIO总线拓扑和STM32控制器的SDIO接口操作。内容涵盖SD卡的分类、版本支持以及与STM32的连接方式。讲解了数据传输、SDIO命令格式和卡状态,强调HAL库在简化SD卡操作中的作用。还涉及到HAL库配置、不同模式(轮询、DMA、中断)的使用方法和注意事项,以及调试技巧。
摘要由CSDN通过智能技术生成

前言

1、SD 卡 (Secure Digital Card) 在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口。SDIO 全称是安全数字输入/输出接口,多媒体卡 (MMC)、SD 卡、SD I/O 卡都有 SDIO 接口
2、SDIO接口下的设备分类
在这里插入图片描述
我们常说的SD卡就是指上面的额SD存储卡 (Secure Digital Memory Card) ,MMC (多媒体卡)卡可以说是 SD 卡的前身,现阶段已经用得很少。SD I/O 卡本身不是用于存储的卡,它是指利用 SDIO 传输协议的一种外设。比如 Wi-Fi Card,它主要是提供 Wi-Fi 功能,有些 Wi-Fi 模块是使用串口或者 SPI 接口进行通信的,但 Wi-Fi SDIO Card 是使用 SDIO 接口进行通信的。并且一般设计 SD I/O 卡是可以插入到 SD 的插槽。CE-ATA 是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。
3、目前SD协议提供的SD存储卡规范已经来到8.0版本,但F103、F407\429、F7系列控制器只支持SD存储卡规范2.0版本,即只支持标准容量SD和高容量SDHC标准卡(支持的最高卡容量是32GB),不支持超大容量SDXC标准卡(32GB-2TB)。H7系列则支持4.1版本的SD存储卡规范。
4、只支持到2.0这里,2.0全兼容,32G及以下在这里插入图片描述
5、SD卡不能进行热插拔
6、他的命令什么的不需要了解,直接调用函数就可以了,有32与SD卡之间有标准的协议,都是规定好了的

SD卡物理结构

一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分
在这里插入图片描述
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;
接口驱动器控制SD卡引脚的输入输出。

SD卡总共有8个寄存器,用于设定或表示SD卡信息。
这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
在这里插入图片描述

SDIO总线拓扑

STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。
1、SD卡一般都支持SDIO和SPI这两种接口,本章内容只介绍SDIO接口操作方式,SD卡与SDIO接口示意图如下:

SD卡使用9-pin接口通信,其中3根电源线、1根时钟线、1根命令线和4根数据线,具体如下:
CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;
CMD:命令控制线,SDIO主机通过该线发送命令控制SD卡,如果命令要求SD卡提供应答,SD卡也是通过该线传输应答信息;
D0-3:数据线,传输读写数据;SD卡可将D0拉低表示忙状态;
VDD、VSS1、VSS2:电源和地信号。
在这里插入图片描述
在这里插入图片描述
虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡。

数据传输

1、SD数据是以块(Block)形式传输的,SD卡中一个数据块长度一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功。CRC位由SD卡系统硬件生成。STM32控制器可以控制使用单线或4线传输,本开发板设计使用4线传输。SD数据传输支持单块和多块读写,它们分别对应不同的操作命令
在这里插入图片描述
2、使用4数据线传输时,每次传输4bit数据,每根数据线都必须有起始位、终止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输完后通过D0线反馈给主机。
SD卡数据包有两种格式,一种是常规数据(8bit宽,一般都是用的这种),它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如下图:
在这里插入图片描述
另外一种数据包发送格式是宽位数据格式,对SD卡而言宽位数据发送方式是针对SD卡SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。宽位数据格式示意图如下:
在这里插入图片描述

SDIO命令

SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
1.命令格式
SD命令格式固定为48bit,都是通过CMD线连续传输的,数据线不参与。
在这里插入图片描述
起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为0,终止位为1。
传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。
命令主体内容:命令主体内容包括命令、地址信息/参数和CRC校验三个部分。
命令号:它固定占用6bit,所以总共有64个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
地址/参数:每个命令有32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址。
CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。

SD卡状态

在每个操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换:
在这里插入图片描述
发送完一个数据后,我们等待需要等待SD卡状态不为transfer state(传输状态),才能发送下一个数据

SD卡的操作

1、SD卡有很多命令和响应,但是我们并不需要关心这些,STM32已经帮我们做好了。HAL库已经将操作SD卡时会使用到的命令流程,编写到功能函数里了(比如对SD卡的读写函数)。除非DEBUG,一般我们在使用时并不需要关心命令转换的流程。

2、SDIO使用两个时钟信号,一个是SDIO适配器时钟,另外一个是总线时钟。
STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。
SDIO适配器是SD卡系统主机部分,是STM32控制器与SD

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

成草

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

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

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

打赏作者

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

抵扣说明:

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

余额充值