初级会员

- 积分
- 141
- 金钱
- 141
- 注册时间
- 2017-10-30
- 在线时间
- 51 小时
|
10金钱
(1)在CMD8后面的第一个CMD55解释的是:为了检测卡的类型,响应了cmd55,是sd卡;没响应的是mmc或不支持的卡 。
这个解释不甚理解,CMD55还有检测卡类型的功能呢?仅仅知道在发送ACMD命令之前一定要先发送CMD55。希望大家能解释下,谢谢。
(2)在程序的最后出现这句:validvoltage=(((response>>31)==1)?1:0); //判断SD卡上电是否完成,
希望大家解释下这样写的含义是什么?为什么response要右移31位呢?
谢谢大家了!!!
(1) // 此处发送CMD55是为了检测卡的类型
SDIO_CmdInitStructure.SDIO_Argument = 0x00;//发送CMD55,短响应
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_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); //发送CMD55,短响应
errorstatus=CmdResp1Error(SD_CMD_APP_CMD); //等待R1响应 ,看是否响应,没响应的是mmc或不支持的卡
if(errorstatus==SD_OK)//SD2.0/SD 1.1,否则为MMC卡
{ //响应了cmd55,是sd卡,可能为1.x,可能为2.0
//SD卡,发送ACMD41 SD_APP_OP_COND,参数为:0x80100000
while((!validvoltage)&&(count<SD_MAX_VOLT_TRIAL))
{
(2) SDIO_CmdInitStructure.SDIO_Argument = 0x00;//发送CMD55,短响应
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD; //CMD55
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); //发送CMD55,短响应
errorstatus=CmdResp1Error(SD_CMD_APP_CMD); //等待R1响应
if(errorstatus!=SD_OK)return errorstatus; //响应错误
//acmd41,命令参数由支持的电压范围及HCS位组成,HCS位置一来区分卡是SDSc还是sdhc
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType; //发送ACMD41,短响应
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r3
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus=CmdResp3Error(); //等待R3响应
if(errorstatus!=SD_OK)return errorstatus; //响应错误
response=SDIO->RESP1;; //得到响应
validvoltage=(((response>>31)==1)?1:0); //判断SD卡上电是否完成,
//读取卡的ocr寄存器的pwr_up位,看是否已工作在正常电压
count++;//计算循环次数
}
|
|