STM32之CubeL4(四)--- SD/MMC + SDIO + HAL

本文详细介绍了STM32中SD/MMC/SDIO的概念区分,重点讲解了SDIO总线的物理层和协议层,包括命令、响应和数据传输机制。此外,还探讨了SD和SDIO卡的结构、初始化流程以及SDIO Host控制器的内部结构和HAL库接口。内容深入浅出,适合嵌入式开发人员参考。
摘要由CSDN通过智能技术生成

我们进行嵌入式开发时,常会遇到SD卡驱动或者扩展SDIO模块,ST提供的SD卡HAL标准库中常出现SDMMC,为什么SD经常与MMC一块出现,SD与SDIO又有什么关系呢?

一、SD/MMC/SDIO概念区分

MMC(MultiMediaCard)从本质上看,是一种用于固态非易失性存储的内存卡(memory card)规范,定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。

从1997年MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode、等等),进化出了MMC、SD、microSD、SDIO、eMMC等不同的规范,如下图所示(图片取自博客:MMC/SD/SDIO介绍):
MMC进化到SD与SDIO过程图
SD卡(Secure Digital Memory Card)是在MMC的基础上发展而来的,相比MMC增加了两个主要特色:SD卡强调数据的安全,可以设定所储存的使用权限,防止数据被他人复制;SD卡的传输速度比MMC卡快。在数据传输和物理规范上,SD卡向前兼容了MMC卡,所有支持SD卡的设备也支持MMC卡,这也是我们在SD卡驱动文件中常见到SDMMC的原因。
SD容量与速度
SDIO(Secure Digital Input Output)是从SD规范演化来的,强调的是接口 I/O功能,不再关注另一端的具体形态(可以是Wi-Fi card、Bluetooth card、GPS card、GSM/GPRS card 、Camera card、Radio/TV card等)。SDIO和SD卡规范间的一个重要区别是增加了低速标准,低速卡的目标应用是以最小的硬件开销支持低速IO能力。因此,SDIO接口兼容SD卡,或者说SD卡就是其中一种具有安全存储功能的SDIO Card,SDIO Card也可以是兼具多种功能的组合卡Combo Card(比如 I/O + Memory)。
SDIO标准规范

二、SDIO Bus简介

SDIO/SD协议规范包含三部分:Host Controller、SDIO Bus、SDIO Card,三者的结构框图如下所示:
SDIO结构框图
SDIO总线和USB总线类似,都是采用主从模式通信,其中一端是主机端(Host Controller / Adapter),另一端是设备端(SDIO Card),采用 Host - Device 这样的设计是为了简化 Device 的设计,所有的通信都是由 Host 端发出命令开始的。在 Device 端只要能解析 Host 的命令,就可以同 Host 进行通信了,SDIO 的 Host 可以连接多个 Device。

2.1 SDIO Bus物理层

SDIO Bus的物理信号有 CK、CMD、DATA三类(SDIO适配器时钟SDIOCLK用于驱动SDIO Host,并用于产生SDIO_CK时钟):

  • SDIO_CK:Host给Device的时钟信号,SDIO卡时钟频率全速模式可达0-25MHZ(低速模式为0-400KHZ),SD卡或MMC卡的高速版本时钟频率可达上百兆赫兹;
  • SDIO_CMD:双向的命令、响应信号线,Command由Host发送给Device,Response由Device 返回给Host;
  • SDIO_D[7:0]: 双向的数据传输线,数据位宽允许动态配置为 1-bit(默认)、4-bit、8-bit模式(数据线与命令线通常要保持上拉状态,以保护数据免受总线浮动影响);
  • VCC/VDD:按照工作电压的不同,SD卡可分为高电压版(3.3V)和双电压版(1.8V和3.3V)。

SDIO的信号传输模式有SD 4-bit、SD 1-bit、SPI三种(8-bit模式一般用于MMC),以最常见的SD卡9 pin引脚(3根电源线 + 6根信号线)为例,分别工作在这三种模式下的引脚功能定义如下表所示:
SD卡传输模式
依据 SD 标准,所有的 SD(记忆卡)与 SDIO(外设)都必须支持 SPI mode,因此 SPI mode 是「required」。SDIO新增的低速标准本身就为了减少硬件开支,因此不支持上面的SD 4-bit模式。

2.2 SDIO Bus协议层

SDIO 总线的通信是基于命令和数据流的,由一个起始位开始,由一个停止位终止。

  • 命令(Command):就是一个标记,用于发起(或结束)一个操作,由主机发送到单个卡(寻址命令)或者所有卡(广播命令);
  • 响应(Response):也是一个标记,从寻址的卡或者所有卡(同步)发送给主机,作为向先前接收到的命令的回答;
  • 数据(Data):可以从主机到卡,也可以从卡到主机,数据线的个数可以是 1、4、8。

SDIO总线上的基本交互是命令/响应交互,这种总线交互直接在命令或者响应的结构里面传输它们的信息。SDIO的每次操作都是由Host 在CMD线上发起一个命令,对于有的Command,Device 需要返回 Response,有的则不需要。

SDIO总线上传输的数据可以是数据块(比如SD memory card 这类块设备),也可以是数据流(比如 I/O function card 这类字符设备),数据块需附加CRC(Cyclic Redundancy Check)位来保证数据准确传输。主机端可以配置单线或者多线传输,数据块可以单块操作或多块操作,数据块写操作使用busy来表示DAT0数据线上的持续写操作,不管使用几线传输。SDIO总线上命令、响应、数据块、数据流的交互示意图如下:
SDIO命令/响应交互过程

2.2.1 SDIO Command

Command是一次操作开始的令牌,从主机发送到一个卡设备(寻址命令)或者连接到主机的所有卡设备(广播命令)。每个命令都有一个起始位和结束位,总长度为48 bits,并且每个命令都有 7 bits 的CRC 校验码。命令只能通过CMD线传输,并且MSB(Most Significant Bit)为先(也即最高有效位在前),Command的编码格式如下图所示:
SDIO命令格式
命令的开始位(始终为0)、传输位(始终为1,表示Host–>Device的传输方向)、 CRC7 和结束位(始终为1)由 SDIO 硬件控制,我们需要设置的就只有命令索引和参数部分。其中命令索引(CMD0 ~ CMD63共64个命令)在 SDIO_CMD 寄存器里面设置,命令参数则由寄存器 SDIO_ARG 设置。

SDIO的命令分为应用相关命令ACMD 和通用命令CMD 两部分,应用相关命令ACMD 的发送,必须先发送通用命令 CMD55 ,然后才能发送应用相关命令 ACMD 。 SDIO的命令根据发送范围和是否带响应可以分为下面四种不同的类型:

  • Broadcast Commands(BC):发送到所有卡,没有响应返回;
  • Broadcast Commands with Response(BCR):发送到所有卡,同时收到从所有卡返回的响应;
  • Addressed(point-to-point) Commands(AC):由Host 发送到指定的卡设备,没有数据的传输;
  • Address(point-to-point) Data Transfer Commands(ADTC):由Host 发送到指定的卡设备且伴随有数据传输。

SD卡与SDIO卡支持的命令共分为12类(class 0 ~ class 11),下面按命令类别class和命令类型type,将SD/SDIO支持的常用命令及其功能描述汇总如下(保留命令、SPI模式命令等没有列出):
SD与SDIO卡支持的命令列表
上面的命令中出现的CID、CSD、OCR、SCR等都是卡设备寄存器(SD/SDIO Card寄存器信息下文再单独介绍),实际上Host 与Card Device 之间的命令/响应信息交互,都是通过Host 读写Card Device 的寄存器信息实现的。类似于,CPU控制SDIO Host 发送命令、解析响应、传输数据等操作,都是通过CPU 读写 SDIO Host 的寄存器信息实现的。

2.2.2 SDIO Response

Response从卡设备发回数据的令牌,回应主机之前发送的命令。每个响应也都有一个起始位(始终为0)、传输位(始终为0,表示Device --> Host 方向)和结束位(始终为1),总长度为48 bits(短响应)或者136 bits(长响应),有相应的 CRC 校验码(除了R3/R4没有CRC)。响应信号也只在 CMD 线上传输,并且 MSB(Most Significant Bit) 为先,Response的编码格式如下图所示:
SDIO响应格式
SD存储卡有5种类型的Response:R1/R1b、R2、R3、R6、R7,SDIO卡还支持另外两种Response 类型:R4、R5。只有R2 为136 bits的长响应(为了返回 CID 或 CSD 这类长达 128 bits的数据),其余的响应均为48 bits的短响应。从前面SD/SDIO命令列表中可以看到,每个命令对应哪种响应格式,这七种Response的内容及描述如下:
SD与SDIO卡响应类型及结构
上面这些响应返回的内容,多数也是卡设备自身的寄存器信息,比如CID、CSD、OCR、CSR等,这些寄存器在下文单独介绍。

2.2.3 SDIO Data

Data可以从主机Host 到卡设备,也可以从卡设备到主机,通过数据线传输,SDIO总线定义了3种数据模式——1bit、4bit、8bit,其中SD/SDIO卡只用到1bit和4bit模式(MMC卡会使用8-bit 模式),SD卡传输数据时使用的是4bit模式。

在SDIO_DATA线上传输的数据包格式跟Command和Response类似的是,在每根数据线上传输的每个数据包也都包含一个起始位和一个结束位,而且每个数据包内也都包含CRC校验位。CRC状态反馈和busy 标识只会通过DATA0 从卡设备Device 发送到主机Host,跟DATA1 ~ DATA3无关。SD有两种数据包格式:

  • Usual data(8-bit width):常规数据是先发送低字节,再发送高字节,但每个字节则是先高位后低位的顺序发送;
    常规数据包格式
  • Wide width data(SD memory register):宽位数据从高位开始传输。
    宽位数据包格式
    从上面两幅图的对比可以看出,宽位数据包主要用于传输SD Status和SCR(SD Configuration Register)等信息,正常的数据传输主要还是使用常规数据包格式。

三、SDIO Card简介

3.1 SD memory card简介

前面介绍SDIO bus传输模式时,拿SD存储卡作为SDIO Card示例,我们都见过SD卡长啥样,但你知道SD存储卡的内部结构吗?
SD存储卡结构

3.1.1 SD卡寄存器简介

SD卡内部跟SDIO bus直接相连的是Card interface controller,与Card interface controller相连的除了memory core interface用于访问存储颗粒外,就是SD卡的各个寄存器了。从上图也可以看到SD卡主要的寄存器位宽,各个寄存器的功能描述如下:
SDIO寄存器功能简介
限于篇幅,SD卡各个寄存器内部每一位的作用及设置就不展开介绍了,感兴趣可以到网站:https://www.sdcard.org/downloads/pls/archive/index.html下载相关文档查阅。

3.1.2 SD卡操作模式简介

SD卡系统(Host & Card)定义了两种操作模式:

  • 卡识别模式:卡在复位后会处于“识别模式”,直到收到 SEND_RCA(CMD3)命令(主机复位所有卡片后将进入该模式);
  • 数据传输模式:当 RCA 第一次发布后,卡会处于“数据传输模式”(主机会在总线上所有的卡都被识别后进入该模式)。
    SD卡状态与操作模式
  • SD卡识别模式

当主机复位所有卡片后将进入卡片识别模式,在识别模式下将会确认卡片的操作电压并要求卡片发布自己的相对地址(默认地址为0x0000),在此操作模式下只会用到 CMD 线并且工作在专门的时钟频率 F-od(400 KHz)。SD卡识别模式的流程图如下:
SD卡初始化与识别流程

  1. 上电后发送命令CMD0(GO_IDLE_STATE),使所有的卡设备进入“Idle”状态;
  2. 发送命令CMD8(只有V2.0以上版本的SD卡才支持该命令,MMC卡和V1.x的SD卡不支持该命令),如果卡设备有Response,说明该卡为SD V2.0以上版本;
  3. 发送命令CMD55+ACMD41(在发送ACMD41这类应用指令之前需要先发送CMD55指令),探测卡设备的工作电压是否符合host 端的要求,并通过HCS位告诉SD卡,主机Host 是否支持高容量卡SDHC(HCS置1 表示Host 支持SDHC),ACMD41的命令与响应格式如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流云IoT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值