OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6797|回复: 15

关于SD卡上电失败的问题

[复制链接]

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

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


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-11-15 02:56:35 | 显示全部楼层
本帖最后由 阿法尔大胡子 于 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]
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-11-15 02:59:29 | 显示全部楼层
这段代码就是在 SD_PowerON()函数里面
读到的 response 值一直都是 0x00FF8000
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-11-17 22:52:35 | 显示全部楼层
换多两个卡试试吧。103的频率比407低,你降低下SDIO时钟频率看看
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-11-23 22:29:06 | 显示全部楼层
正点原子 发表于 2016-11-17 22:52
换多两个卡试试吧。103的频率比407低,你降低下SDIO时钟频率看看

好奇怪的问题,我甚至怀疑有可能是布线布局的原因,然后我都用103的板子和407的板子相互飞线来调试,结果现象跟之前一样,103 OK  407不行,然后我就怀疑是不是驱动的原因,又去买了一个逻辑分析仪,然后逻辑分析仪出来的数据,初始化流程,全部都是一样的,103在第二次CMD41的时候就能够读到上电标志位,407怎么都不行,然后时钟频率的话都是400K
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-11-23 22:29:41 | 显示全部楼层
正点原子 发表于 2016-11-17 22:52
换多两个卡试试吧。103的频率比407低,你降低下SDIO时钟频率看看

这两天太忙了没有来得及继续研究这个,不过总有一天我要搞定它之后再回来发个贴子
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2014-5-28
在线时间
18 小时
发表于 2016-12-16 15:05:51 | 显示全部楼层
遇到同样问题,返回0x40FF8000 用的是一张TF卡8G的,隔一次开关电就可以读取,然后不可的情况下,无论怎么复位都不行,可以的情况下,怎么复位都可以
不知道是否卡的兼容性问题,后面找多几张测试一下。。。。。
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-12-17 00:05:54 | 显示全部楼层
flying1104 发表于 2016-12-16 15:05
遇到同样问题,返回0x40FF8000 用的是一张TF卡8G的,隔一次开关电就可以读取,然后不可的情况下,无论怎么 ...

后来我买了闪迪的 8G卡,暂时还没有遇到问题,最近也是太忙,没有时间去研究,先将就用着
回复

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2014-5-28
在线时间
18 小时
发表于 2016-12-17 10:27:45 | 显示全部楼层
阿法尔大胡子 发表于 2016-12-17 00:05
后来我买了闪迪的 8G卡,暂时还没有遇到问题,最近也是太忙,没有时间去研究,先将就用着

我原来是8G的闪迪的,换了一张以前4G的没有出现问题,后面再测试下其他的卡,不过感觉应该是程序BUG的多,我也先做完项目,有空再研究
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2016-12-20 21:29:12 | 显示全部楼层
flying1104 发表于 2016-12-17 10:27
我原来是8G的闪迪的,换了一张以前4G的没有出现问题,后面再测试下其他的卡,不过感觉应该是程序BUG的多 ...

是啊,有时候好纠结啊,各种分析都分析不出问题,最近也是一个232都搞得头疼
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-10-15
在线时间
31 小时
发表于 2017-4-11 17:39:43 | 显示全部楼层
请问前辈,您的这个问题解决了么,小弟也碰到了这个问题了,不知道怎么回事,我怀疑是硬件的原因呢,
路漫漫其修远兮,吾将上下而求索
回复

使用道具 举报

7

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2014-12-23
在线时间
39 小时
 楼主| 发表于 2017-4-12 15:03:52 | 显示全部楼层
lpc17707020887 发表于 2017-4-11 17:39
请问前辈,您的这个问题解决了么,小弟也碰到了这个问题了,不知道怎么回事,我怀疑是硬件的原因呢,

还没有时间研究它,后来换了卡之后就解决了,你可以考虑换张卡试试看
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-2-8
在线时间
18 小时
发表于 2017-4-27 15:12:09 | 显示全部楼层
有结贴么,我最近也发现这种问题
程序最初用的主芯片是stm32F207VC 后来由于flash大小不够 换成stm32F207VE
还完之后上电配置就一直出错,单步调试定点在CmdResp1Error CRC无返回
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2015-10-15
在线时间
31 小时
发表于 2017-6-8 18:57:14 | 显示全部楼层
阿法尔大胡子 发表于 2017-4-12 15:03
还没有时间研究它,后来换了卡之后就解决了,你可以考虑换张卡试试看

1、之前我读不了卡的原因是因为我那个SDIO的接线方式,卡VCC在画原理图的时候线没连上,所以布线的时候稀里糊涂的VCC也没走线,发现问题之后我就飞了一根线,就可以读写了,后来写了一个txt文档,有用,
2、换卡有的时候确实是可以解决问题,说句实话,如果第一次做这个SDIO的通信的话,最好多备几张卡,省的搞个半天,走了弯路,谢谢,希望后面的坛友不要在犯我这种错误,
3、第三点就是虽然说SDIO通信的频率也蛮高的,但是说实话频率还没有必要按照高速PCb板的标准去画什么等长线呀,四根数据线随便lay一下其实也是没问题的
路漫漫其修远兮,吾将上下而求索
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2017-8-29
在线时间
8 小时
发表于 2017-9-1 10:30:03 | 显示全部楼层
644232905 发表于 2017-4-27 15:12
有结贴么,我最近也发现这种问题
程序最初用的主芯片是stm32F207VC 后来由于flash大小不够 换成stm32F207V ...

解决了吗?我遇到跟你一样的问题
回复

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2018-2-8
在线时间
18 小时
发表于 2018-12-3 14:41:06 | 显示全部楼层
解决了,SPI方式通信没问题,若直接SD通信存在问题,个人认定应该是板子存在问题,但是硬件工程师也不打算该了,暂时就一直这样用了,没办法,汗汗汗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 01:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表