目录

SDIO简介

SD卡物理结构

 SDIO总线

总线拓扑

总线协议

命令

命令格式

命令类型

命令描述

响应

 SD卡的操作模式及切换

SD卡的操作模式

卡识别模式

 数据传输模式

STM32的SDIO功能框图

控制单元

 命令路径

数据路径

数据FIFO

适配器寄存器

SDOI初始化结构体

SDIO命令初始化结构体

SDIO数据初始化结构体


SDIO简介

SD卡(Secure Digtial Memory Card)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另一种就是是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F10X系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SD I/O卡以及CE-ATA设备进行数据传输。

MMC卡可以说是SD卡的前身,现阶段已经用的很少了。SD I/O卡本身不是用于存储的卡,它是指利用SDIO传输协议的一种外设。比如说WIFI Card,他主要是提供WIFI功能,有些WIFI模块是利用串口或者SPI接口进行通信的,但WIFI SDIO Card是利用SDIO接口i进行通信的。使用SDIO接口的设备可以见下图:

SD卡物理结构

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

 SD卡共有8个寄存器,用于设定或表示SD卡信息,参考下表,这些寄存器只能通过对应的命令访问,对SD卡进行读写控制操作并不是像操作控制寄存器GPIO相关寄存器那样一次读写一个寄存器的,它是通过命令来控制的,SDIO定义了64个命令,每个命令都有意义,可以实实现某一特定功能,SD卡接收到命令之后,根据命令的要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

名称 bit宽度 描述
CID 128 卡识别号:用来识别的卡的个体号码(唯一的)
RCA 16 相对地址:卡的本地系统地址、初始化时,动态的由卡建议,主机核准
DSR 16 驱动级寄存器:配置卡的输出驱动
CSD 128 卡的特定数据:卡的操作条件信息
SCR 64 SD配置寄存器:SD卡特殊特性信息
OCR 32 操作条件寄存器
SSR 512 SD状态:SD卡专有特征的信息
CSR 32 卡状态:卡状态信息

 SDIO总线

总线拓扑

SD卡一般都支持SDIO和SPI这两种接口,SDIO总线拓扑参考图SD卡总线拓扑,虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡。

SD卡使用9 pin通信,其中3根电源线、1根时钟线、1根命令线和4根数据线,具体说明如下:

  • CLK:时钟线,由SDIO主机产生,即由STM32控制器输出;
  • CMD:命令控制线,SDIO主机通过该线发送命令控制SD卡,如果要求SD卡提供应答(响应),SD卡也是通过该线传输应答消息;
  • D0-3:数据线,传输读写数据,SD卡可将D0拉低表示忙状态;
  • VDD、VSS1、VSS2:电源和地信号

实际上,SDIO的通信时序简单许多,SDIO不管是从主机控制器向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿有效,SD卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率FOD,最高为400khz,另一个是数据传输模式下时钟频率FPP,默认最高为25MHZ,如果通过相关寄存器配置使SDIO工作在高速模式、此时数据传输模式最高频率为50MHZ。

对于STM32控制器,只有一个SDIO主机,所以只能连接一个SDIO设备,开发板上集成了一个Micro SD卡槽和SDIO接口的WIFI模块,要求只能使用其中一个设备。SDIO接口的WIFI模块一般集成有使能线,如果有需要用到SD卡需要先控制该使能线禁用WIFI模块。

总线协议

SD总线通信是基于命令和数据传输的。通讯有一个起始位(“0”),由一个停止位(“1”)终止。SD通信一般是主机发送一个命令(Command),从设备在接收到命令后做出响应,如有需要会有数据(Data)传输参与。

SD总线的基本交互是命令与响应交互,见图命令与响应交互。

SD数据是以块的形式传输的,SDHC卡数据块宽度 一般为512字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要CRC位来保证数据传输成功。CRC位由SD卡系统硬件生成,S

TM23控制器可以使用单线或4线传输,本开发板设计使用4线传输。图多块写入操作为主机向SD卡写入数据块操作示意。

SD数据传输支持单块和多块读写,他们分别对应不同的操作指令,多块写入还需要使用命令来停止整个写入操作,数据写入之前还需要检测SD卡忙状态,因为SD卡在接收到数据后,编程到存储区过程需要一定的操作时间,SD卡忙状态通过把D0线拉低表示。

数据块读操作与之类似,只是无需忙状态检测。

使用4根数据线传输时,每次传输4bit数据,每根数据线都必须有起始位,停止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输完后通过D0线反馈给主机。

SD卡数据包有两种格式,一种是常规数据,它先发低字节再发高字节,而每个字节则是先发高位再发低位,4线传输示意如图所示;

4线同步发送,每根线发送一个字节的其中两个位,数据位在4线顺序排列发送,DAT3数据线发较高位,DAT0数据线发较低位。

另外一种数据包发送格式是宽位数据包格式,对SD卡而言宽位数据包发送方式是针对SD卡SSR(SD状态) 寄存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT线发送给主机。宽位数据包格式见下图:

命令

命令格式

SD命令格式 固定为48bit,都是通过CMD线连续传输的(数据线不参与),见图SD命令格式

SD命令组成如下:

  • 起始位和停止位:命令的主体包含在起始位与终止位之间,它们都包含一个数据位,起始位为0,终止位为1.
  • 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机。

命令主体内容包括命令,地址信息/参数和CRC校验三个部分。

  • 命令号:它固定占用6Bit,所以总共有64个命令(代号CMD0-CMD63) ,每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
  • 地址/参数:每个命令由32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址
  • CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。

命令类型

SD命令有4种类型:

  • 无响应广播命令(bc),发送到所有卡,不返回任务响应
  • 带响应广播命令(bcr),发送到所有卡,同时接受来自所有卡响应
  • 寻址命令(ac),发送到选定卡,DAT线无数据传输
  • 寻址数据传输命令(adtc),发送到选定卡,DAT线有数据传输

另外,SD卡主机模块系统旨在为各种应用程序类型提供一个标准接口。在此环境中,需要有特定的客户/应用程序功能。为实现这些功能,在标准中定义了两种类型的通用命令;特定应用命令(ACMD)和常规命令(GEN_CMD)。要使用SD卡制造商特定的ACMD命令,如ACMD6,需要在发送该命令之前无发送CMD55命令,告知SD卡接下来的命令为特定应用命令。CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。

命令描述

SD卡系统的命令被分为多个类,每个类支持一种“卡的功能设置”。具体的命令表可以参考具体的SDIO标准协议的内容。

响应

响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的装态。SDIO总共有7个响应类型(代号R1-R7),其中SD卡没有R4、R5类型响应。特定的命令对应有特定的响应类型,比如当主机发送CMD3命令时,可以得到响应R6。与命令一样,SD卡的响应也是通过CMD线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是48bit长度,只有R2类型是长响应,其长度136bit.各个类型响应具体情况见具体内容。除了R3类型之外,其他响应的使用CRC7校验来校验,对于R2类型是使用CID和CSD寄存器内部CRC7。

 SD卡的操作模式及切换

SD卡的操作模式

SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别模式和数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备:同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后进入数据传输模式。在每个操作模式下,SD卡都有几种状态;

卡识别模式

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

 主机上电后,所有卡处于空闲状态,包括当前处于无效状态的卡。主机也可以发送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时钟频率设置为FPP,默认最高为25MHZ,频率切换可以通过CMD4命令来实现。数据传输模式下,SD卡状态转换过程中见下图:

 CMD7用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡是处于待机状态,必须选择一个RCA地址目标卡使其进入传输状态下可以进行数据通信。同时通过CMD7命令也可以让已经被选择的目标卡返回到待机状态。

数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用SD部分命令描述中面向块的读写以及擦除命令对卡进行数据读写、擦除。CMD12可以中断正在进行的数据通信,让卡返回到传输状态。CMD0和CMD15 会终止任何数据编程操作,返回卡识别模式,这可能导致卡数据被破坏。

STM32的SDIO功能框图

STM32控制器有一个SDIO,有两部分组成:SDIO适配器和AHB接口,见图SDIO功能框图。SDIO适配器提供SDIO主机功能,可以提供SD时钟、发送命令和进行数据传输。AHB接口用于控制器访问SDIO适配器寄存器并且可以产生中断和DMA请求信号。

SDIO功能框图

 SDIO使用两个时钟信号,一个是SDIO适配器时钟(SDIOCLK=HCLK=72MHZ),另一个是AHB总线时钟的二分频(HCLK/2,一般为36MHZ).适配器寄存器和FIFO使用AHB总线一侧的时钟(HCLK/2),控制单元,命令通道和数据通道使用SDIO适配器一侧的时钟(SDIOCLK).

SDIO_CK是SDIO接口与SD卡用于同步的时钟信号。它使用SDIOCLK作为SDIO_CK的时钟来源,可以通过设置BYPASS模式直接得到,这是SDIO_CK=SDIOCLK=HCLK。若禁止BYPASS模式,可以通过配置时钟寄存器的CLKDIV位控制分频因子,即SDIO_CK=SDIOCLK/(2+CLKDIV)=HCLK/(2+CLKDIV)。配置时钟要注意,SD卡普遍要求SDIO_CK时钟频率不超过25MHZ。STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根线,对于SD卡最多用4根线。

SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。SDIO适配器由5个单元组成,分别是控制单元,命令路径单元,数据路径单元、寄存器单元以及FIFO、见图

控制单元

控制单元包含电源管理和时钟管理功能,结构如图所示,电源管理部件会在系统断电和上电阶段禁止SD卡总线输出信号。时钟管理部件控制clk线时钟信号生成。一般使用SDIOCLK分频得到。

 命令路径

命令路径控制命令发送,并接受卡的响应,结构图如下:

 当SD卡处于某一状态时,SDIO适配器必然处于特定状态与之对应。STM32控制器以命令路径状态机(CPSM)来描述SDIO适配器的状态变化,并加入了等待超时检测功能,以便推出永远等待的情况。CPSM的描述见图CPSM状态机描述图。

数据路径

数据路径部件负责与SD卡相互数据传输,内部结构图如下:

SD卡系统数据传输状态转换,SDIO适配器以数据路径状态机(DPSM)来描述SDIO适配器状态变化情况。并加入了等待超时检测功能,以便退出永久等待情 况。发送数据时,DPSM 处于等待发送 (Wait_S) 状态,如果数据 FIFO 不为空,DPSM 变成发送 状态并且数据路径部件启动向卡发送数据。接收数据时,DPSM 处于等待接收状态,当 DPSM 收到起始位时变成接收状态,并且数据路径部件开始从卡接收数据。DPSM 状态机描述见图 DPSM 状态机描述图

 

数据FIFO

数据FIFO(先进先出)部件是一个数据缓冲器,带发送和接受单元。控制器的FIFO包含宽度为32bit,深度为32字的数据缓冲器和接收/发送逻辑。其中SDIO状态寄存器(SDIO_STA)的TXACT位用于指示当前正在发送数据,RXACT位指示当前正在接收数据,这两个位不可能同时为1.

  • 当TXACT为1时,可以通过AHB接口将数据写入到传输FIFO
  • 当RXACT为1时,接收FIFO存放从数据路径部件接收到的数据。

根据FIFO空或满状态会把SDIO_STA寄存器位置1,并可以产生中断和DMA请求。

适配器寄存器

适配器寄存器包含了控制SDIO外设的各种寄存器,内容较多,可以通过学习SDIO提供的各种结构体来了解。

SDOI初始化结构体

标准库函数对 SDIO 外设建立了三个初始化结构体,分别为 SDIO 初始化结构体 SDIO_InitTypeDef 、 SDIO 命令初始化结构体 SDIO_CmdInitTypeDef 和 SDIO 数据初始化结构体 SDIO_DataInitTypeDef 。 这些结构体成员用于设置 SDIO 工作环境参数,并由 SDIO 相应初始化配置函数或功能函数调用, 这些参数将会被写入到 SDIO 相应的寄存器,达到配置 SDIO 工作环境的目的。
typedef struct 
{ 
 uint32_t SDIO_ClockEdge; // 时钟沿
 uint32_t SDIO_ClockBypass; // 旁路时钟
 uint32_t SDIO_ClockPowerSave; // 节能模式
 uint32_t SDIO_BusWide; // 数据宽度
 uint32_t SDIO_HardwareFlowControl; // 硬件流控制
 uint8_t SDIO_ClockDiv; // 时钟分频
} SDIO_InitTypeDef;

SDIO命令初始化结构体

typedef struct 
{ 
 uint32_t SDIO_Argument; // 命令参数
 uint32_t SDIO_CmdIndex; // 命令号
 uint32_t SDIO_Response; // 响应类型
 uint32_t SDIO_Wait; // 等待使能
 uint32_t SDIO_CPSM; // 命令路径状态机
 } SDIO_CmdInitTypeDef;

SDIO数据初始化结构体

typedef struct 
{ 
 uint32_t SDIO_DataTimeOut; // 数据传输超时
 uint32_t SDIO_DataLength; // 数据长度
 uint32_t SDIO_DataBlockSize; // 数据块大小
 uint32_t SDIO_TransferDir; // 数据传输方向
 uint32_t SDIO_TransferMode; // 数据传输模式
 uint32_t SDIO_DPSM; // 数据路径状态机
 } SDIO_DataInitTypeDef;

SD卡读写测试实验以及SD卡文件系统移植可参考野火STM32教程。