官方的库是支持SDHC的,然后我就单步执行跟踪了一下,发现错误出在SD_PowerON()函数里这个位置:
/*!< If errorstatus is Command TimeOut,
it is a MMC card */
/*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage
range mismatch) or SD card 1.x */
if
(errorstatus == SD_OK)
{
/*下面开始循环地发送 sdio 支持的电压范围,循环一定次数*/
/*!< SD CARD */
/*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)) //
SD_MAX_VOLT_TRIAL=0x0000ffff
{
/*!< SEND CMD55 APP_CMD with RCA as 0 */
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
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);
errorstatus = CmdResp1Error(SD_CMD_APP_CMD);
if (errorstatus != SD_OK)
{
return(errorstatus);
}
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_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 = (((response >> 31) == 1) ? 1 : 0);
count++;
}
if (count >= SD_MAX_VOLT_TRIAL)
{
errorstatus = SD_INVALID_VOLTRANGE;
return(errorstatus);
}
在库中SD_PowerON()函数是完成SD卡的上电、识别操作。上面这一段代码是循环地发送ACMD41指令,循环一定次数。SD_SEND_OP_COND(ACMD41)命令的目的是给予SD卡控制器一个识别SD卡是否可以在所给Vdd范围下工作的机制。可是当我用SDHC时,上面的while循环中会无法检测到OCR寄存器的 pwr_up 位置1 ,然后循环次数count就超出SD_MAX_VOLT_TRIAL,跳出循环。然后在if里面errorstatus被赋值SD_INVALID_VOLTRANGE,超时跳出。就是说,卡需求电压不在 SDIO 的供电电压范围内,SDHC卡无法上电。这是为什么?要怎么能解决这一问题啊……(怀疑是不是官方的库出问题了)
求高人指点!
官方的库大家应该都有,多余代码我就不传了,可以到
stm324xg_eval_sdio_sd.c文件中查看。