高级会员

- 积分
- 579
- 金钱
- 579
- 注册时间
- 2019-8-4
- 在线时间
- 187 小时
|
1金钱
本帖最后由 taomao 于 2019-12-9 11:26 编辑
SD_Error CmdResp1Error(u8 cmd)
{
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) //04, 响应超时
{
SDIO_ClearFlag(SDIO_FLAG_CTIMEOUT); //清除命令响应超时标志
return SD_CMD_RSP_TIMEOUT;//3
}
if(SDIO_GetFlagStatus(SDIO_FLAG_CCRCFAIL) != RESET) //01, CRC错误,所有的响应格式都需要判断CRC吗
{
SDIO_ClearFlag(SDIO_FLAG_CCRCFAIL); //清除标志
return SD_CMD_CRC_FAIL;
}
if(SDIO->RESPCMD!=cmd)return SD_ILLEGAL_CMD;//16,命令不匹配
SDIO->ICR=0X5FF; //清除标记
return (SD_Error)(SDIO->RESP1&SD_OCR_ERRORBITS);//返回卡响应
}
//检查R3响应的错误状态
//返回值:错误状态
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;
}2.这些定义对应的卡类型是什么
#define SDIO_STD_CAPACITY_SD_CARD_V1_1 ((u32)0x00000000)
#define SDIO_STD_CAPACITY_SD_CARD_V2_0 ((u32)0x00000001)
#define SDIO_HIGH_CAPACITY_SD_CARD ((u32)0x00000002)
#define SDIO_MULTIMEDIA_CARD ((u32)0x00000003)
#define SDIO_SECURE_DIGITAL_IO_CARD ((u32)0x00000004)
#define SDIO_HIGH_SPEED_MULTIMEDIA_CARD ((u32)0x00000005)
#define SDIO_SECURE_DIGITAL_IO_COMBO_CARD ((u32)0x00000006)
#define SDIO_HIGH_CAPACITY_MMC_CARD ((u32)0x00000007)
|
最佳答案
查看完整内容[请看2#楼]
CCRCFAIL是看看有没有接收到命令响应的,这个是必须的,至于定义的卡的类型,SD卡是有区别的,比如说大容量的,多媒体的,后面的地址是定义的,到时判断的话,可以根据后面的数值判断
|