首页 > 代码库 > SD3.0协议解读三

SD3.0协议解读三

SD卡功能描述

所有主机和SD卡间的通信都是由主机控制的,这和USB是一致的,例如:U盘并没有主动通知USB控制器的能力,USB鼠标也没有主动通知USB控制器的能力,当然,SD卡也是没有主动通知SD控制器的能力的。

主机发送的命令有两种,一种是一对多,另一种自然是一对一了,他们分别是:

1.广播命令:广播命令发送给所有挂在SD总线上的SD卡,有一些广播命令需要SD卡作出响应。

2.寻址(点对点)命令:寻址命令只发送给具有相应地址的卡,并需要找到的那张卡返回一个响应。

SD卡有两种模式,一种是卡识别模式,另一种是数据传输模式。

1.卡识别模式:在重置(reset)后,当主机查找总线上的新卡时,处于卡识别模式。重置后SD卡将始终处于该模式下,直到收到SEND_RCA命令(CMD3)。

2.数据传输模式:当卡收到RCA(CMD3)后,卡就会进入数据传输模式。

总的来说,卡二种操作模式,有10种状态,这两种操作模式十种状态贯穿了整个协议的精华,所以我们有必要来认识一下。



下面我们将对SD3.0的卡初始化识别模式的流程进行翻译,这段翻译比较枯燥无味,但是没办法,确实比较复杂,不仔细啃啃英文就难以理解这流程是怎么搞的。

卡识别模式:

在卡识别模式,主机重置所有处于卡识别模式的SD卡,检验操作电压范围,识别卡,并请求卡发送相对卡地址(RCA)。这些操作都是在各自的CMD线上完成的。在卡识别的过程中,卡的操作频率应该在Fod下。

卡复位:

发送GO_IDLE_STATE(CMD0)到SD卡后,除处于非活动状态(Inactive state)之外的SD卡都会进入空闲状态(Idle state);在Idle状态,SD卡的CMD线处于输入模式,默认相对地址为0x0000,默认驱动寄存器设定为最低速度,最大驱动电流能力。

工作条件检测:

在控制器和SD卡进行任何通信之前,控制器不清楚SD卡支持的工作电压范围,故而控制器首先使用默认的电压发送一条reset指令(CMD0),紧跟着的CMD8指令,用于取得SD卡支持工作电压范围数据。SD卡通过检测CMD8的参数部分来检查控制器使用的工作电压,控制器通过分析回传的CMD8参数部分来校验SD卡是否可以在所给电压下工作。如果SD卡可以在指定电压下工作,则它回送CMD8的命令响应字,其中包含check voltage, check pattern。如果SD卡不支持所给电压,则SD卡不会给出任何响应信息,并继续处于Idle状态。在PLV2.0(physical layer version2.0)下,在首次执行ACMD41之前,必须执行CMD8指令,用以初始化SDHC卡,SDHC卡根据是否接收到CMD8指令来鉴别控制器是否支持PLV2.0协议。使用低电压的控制器也必须在ACMD41命令之前发送CMD8,避免可以工作在两种电压模式下的SD卡因为没有接收到CMD8, 而默认工作在高电压环境下,被误认为是只支持高电压工作模式。
SD_SEND_OP_COND(ACMD41)命令的目的是给予SD卡控制器一个识别SD卡是否可以在所给Vdd范围下工作的机制,如果SD卡无法在指定Vdd范围内工作,则它会进入非活动状态(Inactive state)。要注意的是,ACMD41是应用相关型命令,因而,每次发出的ACMD41命令都必须紧跟在一条APP_CMD(CMD55)命令之后。在空闲态(Idle State)下使用的CMD55命令使用默认的卡相对地址(RCA)0x0000。

卡初始化和识别过程:

SD卡的初始化开始于接收到ACMD41指令之后,ACMD指令的HCS(Host Capacity Support)位如果设定为1的话,表明控制器支持SDHC卡,否则表示不支持。
在CMD8命令发送之后的ACMD41指令其功能有所扩展,在参数里多了HCS部分,在响应里面多了CCS(Card Capacity Status)部分。HCS参数会被不响应CMD8命令的SD卡所抛弃。控制器向不响应CMD8的卡发送ACMD41指令时,HCS位应该设置为零0。如果向SDHC卡发送HCS位为0的ACMD41命令,SDHC卡返回的响应,其busy标识位永远为0,代表忙状态。HCS标识位用来表明SD卡是否已经完成初始化,如果未完成,HCS为零,否则为1,如果HCS为0,控制器会重复发送ACMD41指令,SD卡只检查首次接收到的ACMD41指令的HCS位。
响应CMD8的SD卡发送的对于ACMD41指令响应会包含CCS部分,控制器只检查HCS标志位为1的响应所包含的CCS位。CCS=1表明其为SDHC卡,否则为标准SD卡。
控制器随后发送ALL_SEND_CID(CMD2)命令,查询各个卡的CID(unique card identification)值,还没有被识别的SD卡(处于Ready状态)会发送CID值作为响应,发送完CID值之后,SD卡进入识别状态(Identification state),然后控制器发送CMD3(SEND_RELATIVE_ADDR)命令,要求各个SD卡发送一个新的相对地址(RCA),RCA在之后的数据传输模式中用于寻址。RCA发送完之后。SD卡进入Stand-by状态,在这个状态,如果控制器想要给SD卡分配一个新的RCA,它可以发送另一条CMD3命令给SD卡。最后发布的RCA为SD卡的真实RCA。

卡的初始化和识别流程具体如下(SD模式):


总结一下流程:

当host上电后,使所有的卡设备处于卡识别模式,完成设置有效操作电压范围,卡识别和请求卡相对地址等操作。
1、发送指令CMD0使卡设备处于idle状态;

2、发送指令CMD8,如果卡设备有response,说明此卡为SD2.0以上;

3、发送指令CMD55+ACMD41,该指令是用来探测卡设备的工作电压是否符合host端的要求;在发送ACMD41这类指令之前需要先       发送CMD55指令,在SDIO中ACMD41指令被CMD5替代。

4、发送指令CMD11转换工作电压到1.8V;

5、发送指令CMD2获取CID;

6、发送指令CMD3获取RCA(relative card address)

好了,这篇文章就聊到这里,是否对SD卡的初始化和识别过程有了更清晰的了解呢?这只是协议上的流程,具体的代码实现我们后面再慢慢分析,千万不能急呀~~