关于SD卡上电失败的问题

2019-07-20 04:45发布

开了一张板子,MCU使用的是stm32f407vet,然后挂了一张金士顿2G的用的TF卡,然后把原子哥的SDIO代码移植过去,发现程序经常死在上电这里.板子断电再上电就能够通过,然后调试调试着就死了,在给卡上电这里就死活过不去,然后把卡拔出来插进去又OK.
一开始以为是硬件设计的原因,后来找到一张N年前的诺基亚512M的TF卡,每次都能过.然后又怀疑是卡的问题,又把多年前开了一块103的板子拿出来试,为了代码的一致性还专门去下载了原子哥103开发板的例程,然后卡也是OK的.
然后我就彻底懵逼了,各种查资料,说什么一开始要发74个时钟,什么的我都试过了,反正就是在407的板子上面用那张2G的金士顿TF卡不行,也不是不行,就是经常莫名其妙就死掉了.
不知道有没有朋友遇到过类似情况的,还望指点指点,大半夜的睡不着发个贴子求助一下大家.
我在下面贴代码.....
   


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
阿法尔大胡子
2019-07-20 09:59
本帖最后由 阿法尔大胡子 于 2016-11-15 02:58 编辑

[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]

一周热门 更多>