aaa1982 发表于 2009-10-8 23:03:04

极度郁闷的调试问题,请教Gorgon Meducer(必须经过一个断点才能正确执行下去,但不是需要

Gorgon Meducer您好:
碰到了一个极度郁闷的调试问题,用JlinkV7 调试一个SD卡的SPI物理层程序,使用的是zlg提供的SD操作的api函数。

发现一个问题极度郁闷的问题,初始化程序如果一下子执行完就没有会出现问题,主要是command response超时。

但是只要在函数中的特定位置中断一次,整个程序就可以正常运行。


http://cache.amobbs.com/bbs_upload782111/files_19/ourdev_489527.jpg
(原文件名:sd1.jpg)

主要问题出在了CMD1上面,只要在609行加入一个断点停一下然后执行,CMD1 就执行的没有问题,但是如果不停一下,CMD1执行就会返回command response 等待超时这种错误。需要说明的是609的i=0没有实际的意义,就是我为了加入断点随便写的一句。实验证明只要在执行cmd1之前Do之后放置一个断点就可以让cmd1正常执行并返回。需要说明的是,如果在do之前的SD_ActiveInit函数中加入断点,cmd1依然不能正确执行(这也就是说明不是cmd1之前需要等待一段时间之类的问题)

如果不在do之后,cmd1之前加入断点,就是把command response的timeout设置的时间再长也没有用。

我尝试着加入607行的延时程序,果然可以奏效,很高兴。cmd1不加入断点也可以正确返回了,继而SD_ActiveInit可以正确返回了。

但是更搞笑的问题的问题发生了,加入延时的方法有时候有用,有时候没用。(听起来很搞笑,但确实是真的,感觉快崩溃了,呵呵),但是无论如何,加入断点的方法一直是可行的。

需要说明的是,这个现象在1G的卡上没有出现,就在128M的卡上出现了。所以可能和SD卡也有关系。但是我使用的读卡器从不挑卡,所以我也不希望我的程序挑卡,关键是为什么加入断点就可以实在让人想不通。我看disasemble的程序感觉do循环中的程序一点问题都没有,为什么需要加入一个breakpoint才可以呢????这个和Jlink 调试的原理有关系么

感谢 美杜沙。

呵呵

下面是我的工程文件的所有内容,就是zlg提供的SD模板

点击此处下载 ourdev_489547.rar(文件大小:967K) (原文件名:7.8_uCOS_SD_SPI.rar)

aaa1982

watercat 发表于 2009-10-8 23:08:52

个人意见:

查查你SD卡的上电过程正确么?复位过程正确么?器件电源电路是怎么做的?SD卡又是怎么连到电源的?

记住:SD卡规范上,没有要求卡上BOD电路的存在

aaa1982 发表于 2009-10-9 11:41:33

watercat您好:

我仔细查了一下,在reset命令cmd0之前,确实有一个SD卡上电过程,但是时间足够。额外再增加cmd0之前的上电时间也没有效果。

看了一下sd spec

http://cache.amobbs.com/bbs_upload782111/files_19/ourdev_489639.JPG
(原文件名:1.JPG)



上面有一段这样的描述
‘Power up time’ is defined as voltage rising time from 0 volt to VDD min (refer to 6.6) and depends on application parameters such as the maximum number of SD Cards, the bus length and the characteristic of the power supply unit.

‘Supply ramp up time’ provides the time that the power is built up to the operating level (the bus master supply voltage) and the time to wait until the SD card can accept the first command,

The host shall supply power to the card so that the voltage is reached to Vdd_min within 250ms and start to supply at least 74 SD clocks to the SD card with keeping CMD line to high. In case of SPI mode, CS shall be held to high during 74 clock cycles.

After power up (including hot insertion, i.e. inserting a card when the bus is operating) the SD Card enters the idle state. In case of SD host, CMD0 is not necessary. In case of SPI host, CMD0 shall be the first command to send the card to SPI mode.


我发现了一个问题,zlg提供的程序在“Supply ramp up time”的时间内CS是置低的。明显和sd spec 提到的冲突。但是对于scandisk 1G的SD卡还是依然能够工作,是不是因为ScanDisk公司的产品不需要ramp up time的74个sd clock。


sd spec 上面对ramp up time 有这么一段叙述Initialization delay:
The maximum of 1 msec, 74 clock cycles and supply ramp up time。这句话是说等待1ms或者74个clock,以时间长的为准。也就说说如果等够1ms,就算不发送74个clock也可以。是这么理解么?

watercat 发表于 2009-10-9 11:48:31

我很奇怪一点,既然你认为你发现了一些问题,为什么不直接通过实验证实或证否,非要在论坛上先问清楚才成?

简单的给你个回答:

请确保你的硬件电路和软件程序,在任何步骤上都严格按照规范和手册的说明去做,若软硬件有不符合规范的地方,则除非你能够切实理解这样做的意义,否则请把它修改到符合规范的状态

aaa1982 发表于 2009-10-9 12:56:30

感谢这么快就回复:

“我很奇怪一点,既然你认为你发现了一些问题,为什么不直接通过实验证实或证否,非要在论坛上先问清楚才成? ”

你好,可能我没说清楚,我把zlg的程序改了以后(也就是cs=1的时候发送多于74个时钟信号),问题依然存在。(scandisk的1g的卡依然能用,128m的依然不行)。

我上面还有一个疑问是,74个时钟是不是必须的,还是只要等多于1ms的时间就可以了。也就是对于The maximum of 1 msec, 74

clock cycles and supply ramp up time这句话的理解问题。

又仔细看了一下zlg的程序,其实也不能说有错,基本过程如下

1)SD卡上电
2)cs=0
3)通过spi连续发送100个字节的dummy byte(0xff)
4)cs=1
5)通过spi 发送10个字节的0xff (dummy byte)
6)发送cmd0.

刚开始我认为他的程序有问题是因为看到了步骤2、3,觉得他在cs=0的时候发送clk和sd spec有冲突。后来仔细看了一下,应该是步骤4、5才是实现sd spec 里面提到的ramp up time在cs=1的时候发送多于74个时钟的语句。

不知道zlg写步骤2、3的代码干什么用。有人愿意一起讨论一下zlg提供的sd卡的代码么?个人感觉写的还挺好的。(虽然他们的人说公布的版本有很多小问题在里面)

到现在为止,完全按照sd spec的要求(我认为),128m就是不正常工作,返回错误command response error(已经不是返回超时错误了)。只要加上断点就可以工作。

期待高手指点。

aaa1982

强调一下,我就使用的zlg的开发板,硬件上面应该问题不大,而且对于1g的卡是完全没有问题的,并不说说这个软件程序不工作。

现在的问题是
1)为什么128m的不工作(和1g的哪里不一样)?
2)为什么加入一个断点他就工作了(但绝对不是等待时间不够长的问题)
3)对sd spec 一些语句的理解
4)对 zlg 提供的程序的理解。

感谢各位。

aaa1982 发表于 2009-10-9 15:02:56

基本确认了一下问题:

比较早期的SD卡在接受不同的命令的时候,需要一定的时间间隔,或者说需要的时间间隔比近期的卡长。

128m的的之所以不能正确返回command response,就是因为有的命令之间的间隔太短了。个别命令能正确返回command response的也是因为命令之间有别的程序语句从而延长了命令之间的间隔。

需要说明的是,1g的存储卡不存在这个问题。


对sd卡写数据的时候,sd卡会在data response之后有一个busy阶段,从而mcu知道写入数据还没有完成。但是sd spec 并没有说明command response之后多长时间不能再写下一个命令。

哪位能指点一下这个指标在SD spec的那里提过么?

我现在都是用一个

for(i=0;i<100;i++)来延长各个命令之间的时间,但是这么做总是感觉不是很稳妥,组好知道一个指标性的东西。


这是问题的一个方面。

还掺杂其他的一些问题:zlg提供的程序还在输入命令的时候变换了一下 spi 总线的速度。有几个命令是400kspi的命令,后面用1Mspi总线的命令,这个也造成了128m 的sd卡不能正确响应一些命令。同样对于1g卡没有影响。

不明白zlg为什么要切换spi总线的速度,经过试验证明,一直采用1Mbit/s的速度,两种卡都可以正常工作。只要把命令间隔弄长一点就可
以了。难道Sd spec上对于一些命令有什么特别的要求(比如总线速度要低于400k)???希望哪位用过出来指点一下,感谢

aaa1982

qlb1234 发表于 2009-10-9 18:59:37

有些说法在过去是正确的,但是在今天可能已经过时了。我看到很多地方都说初始化的时候必须很慢很慢地进行,但是我试验了两张金士顿(一张512MB,一张1GB)、一张佳能(16MB)和一张杂牌(1GB),在高于400MHz的时钟下,都能够很顺利地初始化。所以说很多东西不要迷信于别人的说法,多去试验才是实在的。

ycbx1569 发表于 2009-10-9 20:55:49

【6楼】 qlb1234 清蓝冰
积分:218
派别:
等级:------
来自:
有些说法在过去是正确的,但是在今天可能已经过时了。我看到很多地方都说初始化的时候必须很慢很慢地进行,但是我试验了两张金士顿(一张512MB,一张1GB)、一张佳能(16MB)和一张杂牌(1GB),在高于400MHz的时钟下,都能够很顺利地初始化。所以说很多东西不要迷信于别人的说法,多去试验才是实在的。
 
---------------------------------------
支持你的观点,试验后才能发现问题和学到>>

aaa1982 发表于 2009-10-9 21:51:58

"有些说法在过去是正确的,但是在今天可能已经过时了。我看到很多地方都说初始化的时候必须很慢很慢地进行"

其实所有的说法都不是很可靠,最好能在sd的白皮书上找到对应的指标或者参数,这样才最保险。上面应该给出的是最低的指标,也就是所有厂家都要保证的

指标。有些厂家可能会做得超过白皮书的指标,但是这不影响使用。

我一直没有找到相关于每个命令之间最小时间间隔的指标。不知道哪位看到过,劳驾告诉一声,谢谢。


在高于400MHz的时钟下

你肯定是400mhz么??

Gorgon_Meducer 发表于 2009-10-11 18:50:43

你注意一下,好像有一个指令需要在SS信号拉高以后送出额外的8个时钟,
你检查下这里。

还有,如果初始化1次不行,那么连续初始化2次看看,如果能够解决问题
说明是时序兼容问题。另外,上拉电阻的存在可能有一点点影响,但不是
主要问题。
页: [1]
查看完整版本: 极度郁闷的调试问题,请教Gorgon Meducer(必须经过一个断点才能正确执行下去,但不是需要