关于SD卡的初始化问题
前天刚刚画了60大洋买了个4G的金士顿sd卡, 但是在用stm32初始化的时候, 卡在这些代码里面了while ((!validvoltage) &&(count < SD_MAX_VOLT_TRIAL))
{
/* SEND CMD55 APP_CMD with RCA as 0 */
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_MMC;
SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_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)
{
rt_kprintf("CmdResp3Error.\n");
return(errorstatus);
}
response = SDIO_GetResponse(SDIO_RESP1);
validvoltage = (bool) (((response >> 31) == 1) ? 1 : 0);
count++;
}
if (count >= SD_MAX_VOLT_TRIAL)
{
errorstatus = SD_INVALID_VOLTRANGE;
return(errorstatus);
}
经过追踪, 到这一步初始化的时候,会出错, 原因是count>= SD_MAX_VOLT_TRIAL,
请问下, 这段代码到底是干嘛的, (power_ON函数里面的);
另外, SD_MAX_VOLT_TRIAL是什么意思。。看得一头雾水。 注明下, 这个是基于rt_thread的fliesystem历程修改的- - 输出为:SD INVAKUD_VOLTRANGE,count = ffff. 是否是硬件有问题?或卡的兼容性不太好
程序里默认是1bit模式,并且时钟也调低了的,对大多数卡应该能够识别。 硬件应该是没问题的,因为可以发命令。另外, 听说要在发送命令前发送74个时钟, 请问是怎么发送呢。。。都没看到源代码有这个。 问题解决了, 原因很简单, 因为没有在使用前给它74个初始化时钟周期。
可以参考下我这个sdcar.c,我在里面加了这句:
for(;i < 74; i++)
{
SDIO_SendCommand(&SDIO_CmdInitStructure);
CmdError();
}
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdError(); 回复【5楼】xuzhenglim
-----------------------------------------------------------------------
强烈要求楼主上传sdcard.c
页:
[1]