手上有两个老SD卡,1G和2G,用电脑读卡器测试是完全正常的。
但,使用CH32V307的SD卡接口,发送任何命令,都无响应。
读取其它SD卡(4G、16G、32G)的信息都没有问题,所以硬件肯定没问题,程序也应该没啥大问题。
目前能想到的是,CH32V307工作频率144M,给SD卡分频后,最少560k,不能低到SD要求的400k,不知道是否有影响。
别的还能有啥问题?
手上有两个老SD卡,1G和2G,用电脑读卡器测试是完全正常的。
但,使用CH32V307的SD卡接口,发送任何命令,都无响应。
读取其它SD卡(4G、16G、32G)的信息都没有问题,所以硬件肯定没问题,程序也应该没啥大问题。
目前能想到的是,CH32V307工作频率144M,给SD卡分频后,最少560k,不能低到SD要求的400k,不知道是否有影响。
别的还能有啥问题?
刚才把错误码打印出来,能看到,其实1G、2G的卡还是有点响应的。
1、发送CMD0,让SD卡进入IDLE状态,这个不需要响应。
2、发送CMD8,参数0x000001AA,通过 CmdResp7Error 得到错误码 3,超时。
3、发送CMD55,参数0,通过 CmdResp1Error 得到错误码 0x00400000,这个应该是SD卡反馈的,不知道啥意思。
4、后面再发送命令,CMD1、CMD2,都是返回错误码 3,超时。
您好,
EVT中的SDIO例程有打印功能,您可以直接运行后将打印信息发送至邮箱:lbw@wch.cn。
错误码在sdio.h文件下有给出,可以对照查看。
下文是调试信息,SD开头的,是我加的,体现了发送命令的过程,参数,及反馈。最后一个错误码 3,是原始的调试信息。
总的来说,主要错误就是 3,SD_CMD_RSP_TIMEOUT,超时。
这个是出问题的,2G卡的调试信息:
SD: Port Inited
SD: GoIdleState(0) Ok(0)
SD: Determine Card Type
SD: SendIfCond(0x000001AA) Err: 0x00000003 //第一个需要应答的命令就超时了
SD: Card V1.1
SD: AppCmd(0) Err: 0x00400000
SD: SendOpCond(0x80FF8000) Err: 0x00000003
SD Card Error: 3
这个是能正常访问的,4G卡的调试信息:
SD: Card V2.0
SD: AppCmd(0) Ok
SD: AppCmd(0) Ok(0)
SD: SdAppOpCond(0xC0100000) Ok(0)
SD: OCR: 0x00FF8000
SD: AppCmd(0) Ok(1)
SD: SdAppOpCond(0xC0100000) Ok(1)
SD: OCR: 0xC0FF8000
SD: High Capacity SD
SD: Get Card Information
SD: AllSendCID Ok
SD: CID: 0x02544D53 41303447 039C5E8C 88009714
SD: SetRelAddr Ok, RCA = 0x1234
SD: SendCSD(0x12340000) Ok
SD: CSD: 0x400E0032 5B590000 1D7B7F80 0A40005C
SD: CSD Version 2.0
SD: Max Line Speed: 0x32 = 25Mbps
SD: Command Class: 0101 1011 0101 (Class11-0)
SD: DeviceSize: 7547
SD: Capacity: 3774MB, Block: 512B
......
您好,
抱歉,我没看懂你的打印信息代表了什么过程,可以明确是什么阶段什么命令的超时吗?
是发送CMD55时返回错误。
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);
//对于老旧的小容量卡(大SD卡),1G、2G,在这儿会返回错误 0x00400000
您好,
发送CMD55指令代表下一条将发送特定应用命令,这个操作在多个过程中均有使用。麻烦使用我们EVT中的例程进行测试,提供串口打印信息,以便我同步问题现象,谢谢。