初始化工作分为两大步:第一步:进行电压适配工作。第二部:进行相对地址设定工作。
发送指令时可能会有状态转换,尤其是初始化时。
指令分为两类:一类为通用指令,另一类为针对某种卡的特定指令,但特定指令的实际数可以通用指令相同,所以CMD55+特定指令来发送特定指令,
电压适配工作
1、发送CMD0指令(GO_IDLE_STATE) 卡进入idle状态
2、发送指令CMD8(SEND_IF_COND),如果卡设备有response,说明此卡为SD2.0以上
3、发送指令CMD55(SDIO_APP_CMD),若响应为sd2.0/sd1.1,否则为mmc
4、发送指令CMD55+ACMD41,该指令是用来探测卡设备的工作电压是否符合host端的要求
第四步具体代码如下:
while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
{
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_APP_CMD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SDIO_APP_CMD);
if (errorstatus != SD_OK)
{
return(errorstatus);
}
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SD_APP_OP_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp3Error();
if (errorstatus != SD_OK)
{
return(errorstatus);
}
response = SDIO_GetResponse(SDIO_RESP1);
validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
count++;
}
至此完成电压适配阶段,以上就是俗称的上电部分。
相对地址设定
1、发送CMD2(ALL_SEND_CID),获取CID,状态从Ready状态到Identification 状态
2、发送CMD3(SET_REL_ADDR),卡自动重置相对地址,并将相对地址发送过来;状态从Identification状态到 Stand-by状态,对以后的CMD2和CMD3不回应
完成第二部分。
另外附上以参考博客网址:http://blog.youkuaiyun.com/bingqingsuimeng/article/details/7958710
http://blog.163.com/huang_minjian/blog/static/182076549201123155822420/