STM32的SD卡与SDIO接口

STM32的SD卡与SDIO接口

一、SD卡的简介

1.SD卡的主要参数
在这里插入图片描述
2.SD卡的SDIO 模式和SPI 模式
在这里插入图片描述
在这里插入图片描述
3.SD卡寄存器
在这里插入图片描述

二、命令和响应

1.SD卡的操作过程
  主机(单片机等)发起“命令”,SD 卡根据命令的内容决定是否发送响应信息及数据等,如果是数据读/写操作,主机还需要发送停止读/写数据的命令来结束本次操作,这意味着主机发起命令指令后,SD 卡可以没有响应、数据等过程,这取决于命令的含义。
在这里插入图片描述
2. SD 卡的命令格式
在这里插入图片描述
  SD 卡的命令固定为 48 位,由 6 个字节组成,字节 1 的最高 2 位固定为 01,低 6 位为命令号(比如 CMD16,为 10000B 即 16 进制的 0X10,完整的 CMD16,第一个字节为 01010000,即 0X10+0X40)。字节 2~5 为命令参数,有些命令是没有参数的。字节 6 的高七位为 CRC 值,最低位恒定为 1。

CRC7的计算:
在这里插入图片描述

SD卡的命令:
在这里插入图片描述
在这里插入图片描述
  上表中,大部分的命令是初始化的时候用的。表中的 R1、R3 和 R7 等是 SD 卡的应答信号,每个响应也有规定好的格式。在规定为有响应的命令下,每发送一个命令,SD 卡都会给出一个应答,以告知主机该命令的执行情况,或者返回主机需要获取的数据,应答可以是 R1~R7,R1 的应答。

三、卡模式

在这里插入图片描述
  对于我们来说两种有效操作模式:卡识别模式和数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的 SDIO 设备,对 SD 卡进行数据读写之前需要识别卡的种类:V1.0 标准卡、V2.0 标准卡、V2.0 高容量卡或者不被识别卡;同时,SD 卡也处于卡识别模式,直到被主机识别到,即当 SD 卡在卡识别状态接收到 CMD3 (SEND_RCA)命令后,SD 卡就进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。

  在卡识别模式下,主机会复位所有处于“卡识别模式”的 SD 卡,确认其工作电压范围,识别 SD 卡类型,并且获取 SD 卡的相对地址(卡相对地址较短,便于寻址)。在卡识别过程中,要求 SD 卡工作在识别时钟频率 FOD 的状态下。

  主机上电后,所有卡处于空闲状态,包括当前处于无效状态的卡。主机也可以发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态,但当前处于无效状态的卡并不会复位。

  主机在开始与卡通信前,需要先确定双方在互相支持的电压范围内。SD 卡有一个电压支持范围,主机当前电压必须在该范围可能才能与卡正常通信。SEND_IF_COND(CMD8)命令就是用于验证卡接口操作条件的(主要是电压支持)。卡会根据命令的参数来检测操作条件匹配性,如果卡支持主机电压就产生响应,否则不响应。而主机则根据响应内容确定卡的电压匹配性。CMD8 是 SD 卡标准 V2.0 版本才有的新命令,所以如果主机有接收到响应,可以判断卡为 V2.0
或更高版本 SD 卡。

  SD_SEND_OP_COND(ACMD41)命令可以识别或拒绝不匹配它的电压范围的卡。ACMD41命令的 VDD 电压参数用于设置主机支持电压范围,卡响应会返回卡支持的电压范围。对于对CMD8 有响应的卡,把 ACMD41 命令的 HCS 位设置为 1,可以测试卡的容量类型,如果卡响应的 CCS 位为 1 说明为高容量 SD 卡,否则为标准卡。卡在响应 ACMD41 之后进入准备状态,不响应 ACMD41 的卡为不可用卡,进入无效状态。ACMD41 是应用特定命令,发送该命令之前必须先发 CMD55。

  ALL_SEND_CID(CMD2)用来控制所有卡返回它们的卡识别号(CID),处于准备状态的卡在发送 CID 之后就进入识别状态。之后主机就发送 SEND_RELATIVE_ADDR(CMD3)命令,让卡自己推荐一个相对地址(RCA)并响应命令。这个 RCA 是 16bit 地址,而 CID 是 128bit 地址,使用 RCA 简化通信。卡在接收到 CMD3 并发出响应后就进入数据传输模式,并处于待机状态,主机在获取所有卡 RCA 之后也进入数据传输模式。

在这里插入图片描述

四、 数据模式

  在数据模式下我们可以对 SD 卡的存储块进行读写访问操作。SD 卡上电后默认以一位数据总线访问,可以通过指令设置为宽总线模式,可以同时使有 4 位总线并行读写数据,这样对于支持宽总线模式的接口(如:SDIO 和 SPI 等)都能加快数据操作速度。

  SD 卡有两种数据模式,一种是常规的 8 位宽,即一次按一字节传输,另一种是一次按 512字节传输,我们只介绍前面一种。当按 8-bit 连续传输时,每次传输从最低字节开始,每字节从最高位(MSB)开始发送,当使用一条数据线时,只能通过 DAT0 进行数据传输,那它的数据传输结构如下图 所示。
在这里插入图片描述
  当使用 4 线模式传输 8-bit 结构的数据时,数据仍按 MSB 先发送的原则,DAT[3:0]的高位发送高数据位,低位发送低数据位。硬件支持的情况下,使用 4 线传输可以提升传输速率。
在这里插入图片描述
  只有 SD 卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机 SD 时钟频率设置为 FPP,默认最高为 25MHz,频率切换可以通过 CMD4 命令来实现。数据传输模式下,SD 卡状态转换过程见图下所示。
在这里插入图片描述
  CMD7 用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡都是出于待机状态,必须选择一个 RCA 地址目标卡使其进入传输状态才可以进行数据通信。同时通过 CMD7 命令也可以让已经被选择的目标卡返回到待机状态。
  数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以通过命令对卡进行数据读写、擦除。CMD12 可以中断正在进行的数据通信,让卡返回到传输状态。CMD0 和 CMD15 会中止任何数据编程操作,返回卡识别模式,注意谨慎使用,不当操作可能导致卡数据被损坏。

五、SDIO接口简介

在这里插入图片描述
  STM32F4 的 SDIO 控制器支持多媒体卡(MMC 卡)、SD 存储卡、SDI/O 卡和 CE-ATA 设备等。SDIO 的主要功能如下:
➢ 与多媒体卡系统规格书版本 4.2 全兼容。支持三种不同的数据总线模式:1 位(默认)、4 位和 8 位。
➢ 与较早的多媒体卡系统规格版本全兼容(向前兼容)。
➢ 与 SD 存储卡规格版本 2.0 全兼容。SD 卡规范版本 2.0,包括 SD 和高容量 SDHC 标准卡,故不支持超大容量 SDXC/SDUC 标准卡,所以 STM32F4xx 的 SDIO 可以支持的最高卡容量是 32GB。
➢ 与 SDI/O 卡规格版本 2.0 全兼容:支持良种不同的数据总线模式:1 位(默认)和 4 位。
➢ 完全支持 CE-ATA 功能(与 CE-ATA 数字协议版本 1.1 全兼容)。8 位总线模式下数据传输速率可达 48MHz。
➢ 数据和命令输出使能信号,用于控制外部双向驱动器。
➢ SDIO 不具备兼容 SPI 的通信模式。

STM32F4 的 SDIO 控制器包含 2 个部分:SDIO 适配器模块和 APB2 总线接口,其功能框图如图下 所示:
在这里插入图片描述
  复位后默认情况下 SDIO_D0 用于数据传输。初始化后主机可以改变数据总线的宽度(通过ACMD6命令设置)。如果一个多媒体卡接到了总线上,则SDIO_D0、SDIO_D[3:0]或SDIO_D[7:0]可以用于数据传输。MMC 版本 V3.31 和之前版本的协议只支持 1 位数据线,所以只能用SDIO_D0(为了通用性考虑,在程序里面我们只要检测到是 MMC 卡就设置为 1 位总线数据)。
  如果一个 SD 或 SDI/O 卡接到了总线上,可以通过主机配置数据传输使用SDIO_D0 或SDIO_D[3:0]。所有的数据线都工作在推挽模式。SDIO_CMD 有两种操作模式:
①用于初始化时的开路模式(仅用于 MMC 版本 V3.31 或之前版本)
②用于命令传输的推挽模式(SD/SDI/O 卡和 MMCV4.2 在初始化时也使用推挽驱动)

六、 SDIO 的时钟

从图 50.2.1.1 我们可以看到 SDIO 总共有 3 个时钟,分别是:
① 卡时钟(SDIO_CK):每个时钟周期在命令和数据线上传输 1 位命令或数据。对于多媒体卡 V3.31 协议,时钟频率可以在 0MHz 至 20MHz 间变化;对于多媒体卡 V4.0/4.2 协议,时钟频率可以在 0MHz 至 48MHz 间变化;对于 SD 或 SDI/O 卡,时钟频率可以在 0MHz 至 25MHz间变化。
② SDIO 适配器时钟(SDIOCLK):该时钟用于驱动 SDIO 适配器,来自 OLL48CK,其频率一般为 48Mhz,并用于产生 SDIO_CK 时钟。
③ APB2 总线接口时钟(PCLK2):该时钟用于驱动 SDIO 的 APB2 总线接口,其频率为HCLK/2,一般为 84Mhz。

SDIO_CK 与 SDIOCLK 的关系为:
在这里插入图片描述
  其中,SDIO CLK 为 PLL48CK,一般是 48Mhz,而 CLKDIV 则是分配系数,可以通过 SDIO的 SDIO_CLKCR 寄存器进行设置(确保 SDIO_CK 不超过卡的最大操作频率)。
  在 SD 卡刚刚初始化的时候,其时钟频率(SDIO_CK)是不能超过 400Khz的,否则可能无法完成初始化。在初始化以后,就可以设置时钟频率到最大了(但不可超过 SD卡的最大操作时钟频率)

七、 SDIO 的命令与响应

  SDIO 的命令分为应用相关命令(ACMD)和通用命令(CMD)两部分,应用相关命令(ACMD)的发送,必须先发送通用命令(CMD55),然后才能发送应用相关命令(ACMD)。
  SDIO 的所有命令和响应都只通过 SDIO_CMD 引脚传输的,任何命令的长度都是固定为 48位,SDIO 的命令格式如下表 所示:
在这里插入图片描述
  所有的命令都是由 STM32F4 发出,其中开始位、传输位、CRC7 和结束位由 SDIO 硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引(如 CMD0,CMD1 之类的)在 SDIO_CMD 寄存器里面设置,命令参数则由寄存器 SDIO_ARG 设置。
  一般情况下,选中的 SD 卡在接收到命令之后,都会回复一个应答(注意 CMD0 是无应答的),这个应答我们称之为响应,响应也是在 CMD 线上串行传输的。STM32F4 的 SDIO 控制器支持 2 种响应类型,即:短响应(48 位)和长响应(136 位),这两种响应类型都带 CRC 错误检测(注意不带 CRC 的响应应该忽略 CRC 错误标志,如 CMD1 的响应)。短响应的格式如下表 所示:
在这里插入图片描述长响应的格式如下表 所示:
在这里插入图片描述
  硬件为我们滤除了开始位、传输位、CRC7 以及结束位等信息,对于短响应,命令索引存放在 SDIO_RESPCMD 寄存器,参数则存放在 SDIO_RESP1 寄存器里面。对于长响应,则仅留 CID/CSD 位域,存放在 SDIO_RESP1~SDIO_RESP4 等 4 个寄存器。

SDIO应用相关命令和通用命令共有四种不同的类型:
1.广播指令,无应答(代号bc):发送完此类命令后,并不会有反馈,但操作已经生效。
2.广播指令,有应答(代号bcr):发送完此类命令后,SD卡会给予反馈。可能是一些寄存器信息,可能是
3.寻址(点对点)指令(代号ac):发送完此类命令后,只有指定地址的SD卡会给予反馈(地址通过命令请求SD卡发布,是唯一的)。此时DAT线上无数据传输。
4.寻址(点对点)数据传输指令(adtc):发送完此类命令后,只有制定地址的SD卡会给予反馈。此时DAT线上有数据传输。
在这里插入图片描述

八、SD与SDIO

1.SDIO(多)数据块读操作
在这里插入图片描述  从上图,我们可以看出,从机在收到主机相关命令后,开始发送数据块给主机,所有数据块都带有 CRC 校验值(CRC 由 SDIO 硬件自动处理),单个数据块读的时候,在收到 1 个数据块以后即可以停止了,不需要发送停止命令(CMD12)。但是多块数据读的时候,SD 卡将一直发送数据给主机,直到接到主机发送的 STOP 命令(CMD12)。
  SDIO(多)数据块写操作,如图 50.2.3.2 所示:数据块写操作同数据块读操作基本类似,只是数据块写的时候,多了一个繁忙判断,新的数据块必须在 SD 卡非繁忙的时候发送。这里的繁忙信号由 SD 卡拉低 SDIO_D0,以表示繁忙,SDIO 硬件自动控制,不需要我们软件处理。
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值