发现原子哥的F407的SDIO例程对SD卡初始化 CmdResp3Error(void)有一处小小的问题

2019-07-20 04:36发布

将原子哥的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校验错误呢?


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
正点原子
1楼-- · 2019-07-20 06:51
恩,你是对的,这里可以加上CRC校验错误返回失败。
电子玩霸
2楼-- · 2019-07-20 11:50
 精彩回答 2  元偷偷看……
天际超体
3楼-- · 2019-07-20 16:43
返回SD_CMD_RSP_TIMEOUT初始化不成功,请问是怎么回事啊?
熊大
4楼-- · 2019-07-20 17:17
R3没有CRC检测 当然你检测的话 一直显示错误
往事啊
5楼-- · 2019-07-20 22:03
 精彩回答 2  元偷偷看……

一周热门 更多>