SD初始化是SD卡操作的关键。初始化过程需要注意SD卡的类型。SD卡(2G以下)和SDHC卡(2G至32G)分别支持SD协议1.0及2.0,命令和初始化过程略有不同。总线模式分为SPI和SD两种,以SDHC卡SD模式通信为例,介绍SDHC初始化过程。
一、SD Specification V2.0中基本概念
1、命令Command
命令由主机发往从机,可以点对点,也可以是广播,用于对SD卡进行设置或者数据传输。命令格式如下:
一个完整的命令由48位组成。
Command index命令索引:有6位,可以表示64条命令;
Argument命令参数:32位,可以包含命令需要的卡地址等信息;
CRC7:7位循环冗余校验位。
SD模式下的命令和数据流都有一个开始位和结束位。
SD卡的命令分为多个类型。如class0基本命令、class2读命令、class5擦除命令、class8应用特定命令等。详细命令及其功能可参考SD协议手册Simplified Physical Layer Specification V2.0(page46-57)。
2、应答Response
应答是由从机发往主机,用于响应命令的比特流。根据应答长度和内容不同,应答共有分别为:R1,R1b,R2,R3,R6,R7几种类型。其中R1,R1b,R3,R6,R7为短响应,长度为48bits;R2为长响应,长度为136bits。(SDIO接口支持R4,R5)
R1用于返回卡状态等信息,即第8-39位。
R1b与R1相同,只是多了一位忙标志。
R2长度为136位,用于获取CID、CSD信息,第1-127位。
R3用于获取卡的OCR寄存器值,即为ACMD41的命令的应答。
R6包含了卡的RCA信息,即Argument field中高16位部分。作为CMD3命令应答。
R7为CMD8的应答,其中19-16bits表征了卡支持的电压范围,15-8bits为输入的check pattern,建议为0x01AA。
3、寄存器registers
SD卡内部定义了OCR,CID,CSD,RCA,DSR,SCR共6个寄存器。这些寄存器可以通过SD卡的相应命令访问。OCR、CID、CSD、SCR寄存器存储卡特性信息,而RCA、OCR寄存器存储了卡的相关参数。
OCR:Operation Conditions Register操作状态寄存器
32位OCR寄存器存储了卡支持的工作电压范围,同时该寄存器也包含了状态信息。31位:当上电完成后31位置位;30位:表明了卡的容量信息,是高容量还是标准卡,高容量卡该位置位。
如0x40FF8000即表示支持2.7-3.6电压范围。
CID:Card Identification Register卡识别寄存器
CID寄存器有128位长。用于卡识别阶段识别卡信息。每一个卡都有一个独立的识别号用于标识卡的唯一性。
CSD:Card Specific Register卡特性寄存器
CSD寄存器128位长。提供了卡的相关信息。如数据格式,错误校验,最大数据传输时间等,可以通过CMD27命令改变寄存器值。如下图中9表示1<<9=512,读写每块传输的最大字节数为512。
3、状态States
在HOST与SD通信过程中,共有3种模式, 10个卡状态。
操作模式:闲置模式,卡识别模式,数据传输模式;
卡状态:闲置状态,空闲状态,准备状态,识别状态,等待状态,传输状态,数据发送状态,数据接收状态,编程状态,断开状态。
SD卡的上电,初始化以及数据传输都是在这几个状态间的转换。
二、初始化过程
整个过程是一个发送命令获得应答的过程。
1、 发送CMD0命令,使卡复位。当卡上电或收到GO_IDLE_STATE(CMD0)后,卡进入Idle State,此时卡将其RCA设为0。
2、 发送CMD8命令SEND_IF_COND,用来确定卡的操作条件。在host与SD开始通信的时候,host并不知道SD卡所支持的电压范围,在发送CMD0使卡进入空闲状态复位后,SD2.0物理层协议定义了一个新的CMD8来确定SD卡对电压范围的支持。(CMD8是SDHC卡初始化必须的,而标准SD卡不需要此命令,因此该命令的另一个作用是判断卡类型,若有对应R7中的响应内容,说明该卡为SDHC卡,支持SD物理层协议2.0,否则,没有响应,卡保持在Idle state)
3、 发送ACMD41命令SD_SEND_OP_COND,用来识别满足host所提供电压的卡,argument中所用RCA为Idle state卡的默认地址RCA=0x0000。此命令需要注意以下几点:当SDHC卡时,需要注意命令的HCS(host capacity support )位,对于SDHC卡,该位必须置1,对于SD卡,该位清零;同时,该命令应答中的busy位(参考OCR寄存器)表示了卡是否准备好,host必须重复发送ACMD41直到应答中的busy位(OCR寄存器最高位)置1;在应答中,还有一个CCS(card capacity status)位,该位为1时表示当前卡为高容量SD卡,为0时表示当前卡为标准容量卡。(该命令为应用型命令,在之前需要发送CMD55)
4、 发送CMD2命令ALL_SEND_CID,该命令使总线上的卡发送其CID,即表征卡唯一性的信息,如出厂序列号等,其应答为R2。此时卡由Ready State状态进入Identification State。
5、 发送CMD3命令SEND_RELATIVE_ADDR,该命令用于设定卡的新地址,SD卡会给卡返回一个RCA,卡收到新地址后自动进入Stand by state状态。
4、5两个过程即为SD卡识别过程。
多个卡时,回到步骤4,直到把所有的卡识别,分配地址。当某一个被识别后,HOST再一次发送CMD2命令时,其便不再响应,其他没有被识别到的SD卡依次发送其CID号,继续发送CMD3获得它们的RCA后,便识别所有的卡。