将原子哥的SDIO例程中的初始化程序弄到F429上面,发现在插卡和没有插卡的时候都返回初始化成功,直觉告诉我初始化并没有真正成功,于是就ST-LINK仿真设置断点然后一个一个命令的发送并通过查看寄存器的值看是否发送成功,当发送到ACMD41时,SDIO的状态寄存器中CRC校验位置位,说明在这里出现了CRC错误,于是查看原子哥关于该命令的响应函数SD_Error CmdResp3Error(void):
先将该函数代码贴出来
[mw_shl_code=c,true]SD_Error CmdResp3Error(void)
{
u32 status;
while(1)
{
status=SDIO->STA;
if(status&((1<<0)|(1<<2)|(1<<6)))break;//CRC错误/命令响应错误/已经收到响应(CRC校验成功)
}
if(SDIO_GetFlagStatus(SDIO_FLAG_CTIMEOUT) != RESET) //响应超时±
{
SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); //清除超时标志
return SD_CMD_RSP_TIMEOUT;
}
SDIO_ClearFlag(SDIO_STATIC_FLAGS);//清除所有标记
return SD_OK;
}[/mw_shl_code]
函数首先判断发生了 CRC错误/命令响应错误/已经收到响应 三种情况的的其中一种
如果是超时,那就返回超时错误,但是却没有判断是否发生了CRC校验失败,从而返回CRC错误,而我的程序恰好是在这里产生了CRC校验失败,但是仍旧返回了OK,所以我觉得还应该在里面加一句:
[mw_shl_code=c,true] if(SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL) != RESET)
{
SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL);
return SDIO_FLAG_CCRCFAIL;
} [/mw_shl_code]
不知道我的想法是不是正确的
但是为什么总在这里发生CRC校验错误呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>