开了一张板子,MCU使用的是stm32f407vet,然后挂了一张金士顿2G的用的TF卡,然后把原子哥的SDIO代码移植过去,发现程序经常死在上电这里.板子断电再上电就能够通过,然后调试调试着就死了,在给卡上电这里就死活过不去,然后把卡拔出来插进去又OK.
一开始以为是硬件设计的原因,后来找到一张N年前的诺基亚512M的TF卡,每次都能过.然后又怀疑是卡的问题,又把多年前开了一块103的板子拿出来试,为了代码的一致性还专门去下载了原子哥103开发板的例程,然后卡也是OK的.
然后我就彻底懵逼了,各种查资料,说什么一开始要发74个时钟,什么的我都试过了,反正就是在407的板子上面用那张2G的金士顿TF卡不行,也不是不行,就是经常莫名其妙就死掉了.
不知道有没有朋友遇到过类似情况的,还望指点指点,大半夜的睡不着发个贴子求助一下大家.
我在下面贴代码.....
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
[mw_shl_code=c,true] if (errorstatus == SD_OK)//SD2.0/SD 1.1,否则为MMC卡
{
//SD卡,发送ACMD41 SD_APP_OP_COND,参数为:0x80100000
while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
{
SDIO_CmdInitStructure.SDIO_Argument = 0x00;//发送CMD55,短响应
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD; //CMD55
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); //发送CMD55,短响应
errorstatus = CmdResp1Error(SD_CMD_APP_CMD); //等待R1响应
if (errorstatus != SD_OK)return errorstatus; //响应错误
//acmd41,命令参数由支持的电压范围及HCS位组成,HCS位置一来区分卡是SDSc还是sdhc
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType; //发送ACMD41,短响应
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r3
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp3Error(); //等待R3响应
if (errorstatus != SD_OK)return errorstatus; //响应错误
response = SDIO->RESP1;; //得到响应
validvoltage = (((response >> 31) == 1) ? 1 : 0); //判断SD卡上电是否完成
count++;
}
if (count >= SD_MAX_VOLT_TRIAL)
{
errorstatus = SD_INVALID_VOLTRANGE;
return errorstatus;
}
if (response &= SD_HIGH_CAPACITY)
{
CardType = SDIO_HIGH_CAPACITY_SD_CARD;
}
}[/mw_shl_code]
一周热门 更多>