在上一章中,我们对SD卡做了介绍,了解了SDIO的通信协议,接下来我们将要介绍SD卡从上电到可正常读写期间,具体是怎么通信的。
1、SD卡操作模式
STM32控制器对SD卡进行数据读写之前需要识别卡的种类:V1.0标准卡、V2.0标准卡、V2.0高容量卡或者不被识别卡。
SD卡系统(包括主机和SD卡)定义了两种操作模式:卡识别模式和数据传输模式。在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。在每个操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换,如下表所示:
操作模式 | SD卡状态 |
无效模式(Inactive) | 无效状态(Inactive State) |
卡识别模式(Card identification mode) | 空闲状态(Idle State) |
准备状态(Ready State) | |
识别状态(Identification State) | |
数据传输模式(Data transfer mode) | 待机状态(Stand-by State) |
传输状态(Transfer State) | |
发送数据状态(Sending-data State) | |
接收数据状态(Receive-data State) | |
编程状态(Programming State) | |
断开连接状态(Disconnect State) |
2、卡识别模式
在卡识别模式下,主机会复位所有处于“卡识别模式”的SD卡,确认其工作电压范围,识别SD卡类型,并且获取SD卡的相对地址(卡相对地址较短,便于寻址)。
在卡识别过程中,SD卡工作在识别时钟频率FOD(最大400KHz),且1线传输方式的状态下。
卡识别模式状态切换图如下所示:
根据识别转换图,我们对转换流程进行讲解。
2.1、SD卡Reset
主机上电后,所有卡处于空闲状态,包括当前处于无效状态的卡。主机也可以发送GO_IDLE_STATE(CMD0)让所有卡软复位从而进入空闲状态,但当前处于无效状态的卡并不会复位。
上电或CMD0
后,所有卡的CMD数据线都处于输入模式,等待接收下一条命令。这些卡被初始化为一个默认的SD卡相对地址(RCA=0x0000
),并设置SD卡驱动级寄存器(DSR
)默认为最低的速度和最高的驱动能力。
2.2、SD卡操作条件的确认
在主机和SD卡开始通信时,主机可能不知道SD卡支持的电压,SD卡也可能不知道它是否支持当前提供的电压。主机发出一个复位命令(CMD0
),同时假定它电压可能被SD卡支持。为了验证电压,在《Physical Layer Specification Version 2.00》文档中定义了以下新命令(CMD8
)。
注意:CMD8是SD卡标准V2.0版本才有的新命令,所以如果主机有接收到响应,可以判断卡为V2.0或更高版本SD卡。
SEND_IF_COND
(CMD8
)用于验证SD卡接口操作条件。SD卡通过分析CMD8
的参数来检测操作条件的有效性,主机通过分析CMD8
的响应来检测操作条件的有效性。提供的电压通过命令CMD8
的参数VHS域来指定。