1 SDIO接口
控制器对SD卡进行读写操作一般有两种通信协议接口:1)SPI接口;2)SDIO接口
SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SDI/0卡都有SDIO接口。STM32推出的一系列的控制器会带有SD主机,SDIO接口,它可以与MMC卡,SD卡,SDI/O卡以及CE-ATA设备通过SDIO接口进行数据传输。
1.1 SD卡物理结构
一张SD卡包含有存储单元,存储单元接口,电源检测,卡及接口控制器和接口驱动器5个部分
存储单元是存储数据部件:存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;
接口驱动器控制SD卡引脚的输入输出;
SD卡总共有8个寄存器,用于设定或者表示SD卡信息。
1.2 SD卡寄存器列表
1.3 SDIO总线拓扑
SD卡一般支持SDIO和SPI 两种接口,本章内容只介绍SDIO接口操作方式;
SD卡与SDIO的接口示意图如下:
虽然可以共用总线,但不推荐多卡槽共用总线信号,要求一个单独SD总线应该连接一个单独的SD卡;
CLK:时钟线,由SDIO主机产生,由STM32控制器输出;
CMD:命令控制线,SDIO主机通过改下发送命令控制SD卡,如果命令要求SD卡提供应答,SD卡也是通过该线传输应答信息;
D0-3:数据线,传输读写数据;SD卡可将D0拉低表示忙状态;
SDIO的通信时序的物理逻辑非常简单,SDIO不管时从主机控制器向SD卡传输,还是SD卡向主机控制器传输都只以CLK时钟线的上升沿为有效。
SD卡操作过程中会使用两种不同频率的时钟同步数据,一个时识别卡阶段时钟频率FOD,最高为400KHz;另外一个时数据传输模式下时钟频率FPP,默认最高为25MHz,如果通过相关寄存器配置使SDIO工作再告诉模式,此时数据传输模式最高频率为50MHz。
1.4 SDIO总线协议
SD总线通信是基于命令、数据和响应传输这三个部分。通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD通信协议中规定,一般是主机发送一个命令(Command),从设备在接受命令后做出响应(Response),如果有需要会有数据(Data)传输;
SD数据是以块形式传输的,SD卡中一个数据块长度一般为512字节,数据可以从主机到卡 ,也可以从卡到主机。数据块需要CRC来保证数据传输成功。CRC位由SD卡系统硬件生成。STM32控制器可以控制使用单线或4线传输。
SD数据传输支持单块和多块读写,他们分别对应着不同的操作命令,多块写入还需要使用命令来停止写入操作。数据写入前需要检测SD卡忙状态,因为SD卡在接收到数据后编程到存储区过程还需要一定的操作时间。SD卡忙状态通过把D0线拉低表示。
数据块单块读写操作与多块读写类似,只是无需忙状态检测;
使用4数据线传输时,每次传输4bit数据,每根数据线都必须有起始位、终止位以及CRC位,CRC位每根数据线都要分别检查,并把检查结果汇总然后在数据传输后通过D0线反馈给主机;
SD卡数据包有两种格式,一种是常规数据(8bit宽),它先发低字节再发高字节,而每个字则是先发高位再发低位,4线传输示意图如下:
另外一种数据包发送格式是宽位数据格式,对SD卡而言宽位数据发送方式是针对SD卡SSR(SD状态)寄存器内容发送的,SSR寄存器总共有512bit,在主机发出ACMD13命令后SD卡将SSR寄存器内容通过DAT发送给主机。宽位数据格式示意图如下:
1.5 SDIO命令
SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
命令格式:SD命令格式固定为48bit,都是通过CMD线连续传输的,数据线不参与;
SD命令的组成:
- 起始位和终止位:命令的主体包含在起始位和终止位之间,他们都只包含一个数据位,起始位为0,终止位为1;
- 传输标志:用于区分传输方向,该位为1时表示命令,方向为主机传输到SD卡,该位为0时表示响应,方向为SD卡传输到主机;
- 命令主体内容:命令主体内容包含命令、地址信息/参数和CRC校验三个部分;
命令主体内容:
命令主体内容包括命令、地址信息/参数和CRC校验三个部分。
- 命令号:它固定占有6bit,所有共有64个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于SD卡操作,只是专门用于MMC卡或者SD I/O卡。
- 地址/参数:每个命令有32bit地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这32bit用于指定参数,而寻址命令这32bit用于指定目标SD卡的地址。
- CRC7校验:长度为7bit的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。
2 SD卡的操作模式及切换
2.1 SD卡的操作模式:
SD卡标准由多个版本,STM32控制器对SD卡进行数据读写之前需要识别卡的版本:V1.0标准卡、V2.0标准卡、V2.0高容量卡或者不被识别卡。STM32控制器目前最高支持《Physical Layer Simplified Specification V4.1》定义的SD卡;
SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别和数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直接被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。
在卡识别模式下:主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围,识别为SD卡类型,并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。在卡识别过程中,要求SD卡工作在识别时钟F0D的状态下。
上电后:所有卡处于空闲状态,可发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态;
使用SEND_IF_COND(CMD8)命令根据响应确定卡的电压支持范围。CMD8是SD卡标准V2.0版本才有的新命令,因此如果主机有接收到响应,可以判断卡为V2.0或者更高版本的SD卡。
使用SD_SEND_OP_COND(ACMD41)命令识别或拒绝不匹配它的电压范围的卡。并通过HCS位及其响应判断是SDSC还是SDHC卡。
使用ALL_SEND_CID(CMD2)来控制所有卡返回它们的卡识别号(CID),处于准备状态的卡在发送CID之后就进入识别状态。
发送SEND RELATIVE ADDR(CMD3)命令,让卡自己推荐一个相对地址(RCA)并响应命令。这个RCA是16bit地址,而CID是128bit地址,使用RCA简化通信。
2.2 数据传输模式
只有SD卡处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。
CMD7用来选定和取消指定的卡,卡在待机状态下还不能进行数据通信,因为总线上可能有多个卡都是出于待机状态,必须选择一个RCA地址目标卡使其进入传输状态才可以进行数据通信。同时通过CMD7命令也可以让已经被选择的目标卡返回到待机状态。
数据传输模式下的数据通信都是主机和目标卡之间通过寻址命令点对点进行的。卡处于传输状态下可以使用块的读写以及擦除命令对卡进行数据读写、擦除。
CMD12可以中断正在进行的数据通信,让卡返回到传输状态。CMD0和CMD15会中止任何数据编程操作,返回卡识别模式,这可能导致卡数据被损坏。
3 STM32控制器
3.1 STM32的SDIO功能框图
STM32控制器有一个SDIO,由两部分组成:SDIO适配器和总线接口SDIO适配器提供SDIO主机功能,可以提供SD时钟、发送命令和进行数据传输。总线接口用于控制器访问SDIO适配器,并且可以产生中断和DMA请求信号。
左图为STM32F1/F4/F7系列; 右图为STM32H7系列
SDIO使用两个时钟信号,一个是SDIO适配器时钟,另外一个是总线时钟。STM32控制器的SDIO是针对MMC卡和SD卡的主设备,所以预留有8根数据线,对于SD卡最多用四根数据线。
3.2 SDIO适配器
SDIO适配器是SD卡系统主机部分,是STM32控制器与SD卡数据通信中间设备。SDIO适配器由五个单元组成,分别是控制单元、命令路径单元、数据路径单元、寄存器单元以及FIFO。
命令路径:
命令路径控制命令发送,并接收卡的响应,当SD卡处于某一状态时,SDIO适配器必然处于特定状态与之对应。STM32控制器以命令路径状态机(CPSM)来描述SDIO适配器状态变化,并加入了等待超时检测功能,以便退出永久等待的情况。
对SD卡进行读写,大致的操作流程“
- 确保SD卡处于传输就绪状态,就是SD卡可以传输数据。
- 确保SD卡在就绪的状态后,可以对SD卡进行数据的传输了。
- 为了保证操作的完成,需要检测对应的操作是否执行成功,就需要通过中断来检测对应的事件是否发送,这些事件会对应不同的中断,比如发送完成,接收完成等