关于SD卡上电失败的问题

2019-07-20 04:45发布

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


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
阿法尔大胡子
1楼-- · 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]
阿法尔大胡子
2楼-- · 2019-07-20 10:04
 精彩回答 2  元偷偷看……
正点原子
3楼-- · 2019-07-20 14:30
 精彩回答 2  元偷偷看……
阿法尔大胡子
4楼-- · 2019-07-20 18:27
正点原子 发表于 2016-11-17 22:52
换多两个卡试试吧。103的频率比407低,你降低下SDIO时钟频率看看

好奇怪的问题,我甚至怀疑有可能是布线布局的原因,然后我都用103的板子和407的板子相互飞线来调试,结果现象跟之前一样,103 OK  407不行,然后我就怀疑是不是驱动的原因,又去买了一个逻辑分析仪,然后逻辑分析仪出来的数据,初始化流程,全部都是一样的,103在第二次CMD41的时候就能够读到上电标志位,407怎么都不行,然后时钟频率的话都是400K
阿法尔大胡子
5楼-- · 2019-07-20 18:47
 精彩回答 2  元偷偷看……
flying1104
6楼-- · 2019-07-20 22:43
遇到同样问题,返回0x40FF8000 用的是一张TF卡8G的,隔一次开关电就可以读取,然后不可的情况下,无论怎么复位都不行,可以的情况下,怎么复位都可以
不知道是否卡的兼容性问题,后面找多几张测试一下。。。。。

一周热门 更多>