高级会员
- 积分
- 581
- 威望
- 396
- 贡献
- 123
- 兑换币
- 40
- 注册时间
- 2009-11-17
- 在线时间
- 31 小时
|
近来在论坛上有关于K60的SDHC的帖子,有人留言询问,我就直接写出来大家看一看吧。
不算题外话的题外话:我最初用的是codewarrior10.1,但是过慢的编译调试速度和BUG的存在然我毅然转投IAR了,但是后来发布的codewarrior10.2确实是做了非常大的改动,网上有人说可以算成一款新软件也不为过~用起来确实太方便了,eclipse果然强大,但是它的速度我实在无法忍受(难道我的电脑太慢了?),所以坚持使用了IAR。
言归正传,IAR6.3+J-Link+K60+SDHC(4bits)写SD卡。最开始使用的是苏州大学那本书的配套代码,他的代码用的是CPU传送方式,即在写入传输命令后,使用for循环把定量的数据写入传输FIFO。SDHC单块写入没有问题,但多块操作时不成功,我开始逐行分析他的代码,最后发现在多块写入时程序既没有设置自动CMD12功能,也没有人为方式发送CMD12,因此在多块写入时SD卡不会收到停止传输指令。于是我设置了自动CMD12位,程序不好用,改成最后人为方式发送CMD12,还是不好用,用断点调试发现程序死在所有数据发送结束后的等待命令执行成功的中断里。百般尝试后依旧没能调试出来,这时正好赶上CodeWarrior10.2更新,遂想到了CW的PE~于是改投CW试验。
CodeWarrior10.2,使用处理器专家(PE)建立工程,调用SDHC的bean,按照帮助文件的历程建立SDHC的代码,它的代码在传送数据时使用的是ADMA2,不知道的话看看参考手册SDHC部分就知道了。ADMA2传送数据,并自动CMD12,程序运行正常,单块多块均好用,于是再次剖析代码,对比苏大的代码,发现除了ADMA的设置和自动CMD12以外,PE是一直输出SDHC的SCLK,而苏大设置的是只在需要时钟时SCLK才有时钟输出,修改苏大的代码为一直输出SCLK,还是不好用~最后的我只能把PE的代码移植到了IAR中(不小的工程啊)……
这里先说一下写入时间的问题,写入时间=数据传送时间+SD卡忙的等待时间;单块(一个扇区)的写时间取决于SCLK频率和SD卡,如果是25MHz的时钟,4位模式写入一个扇区的数据传送时间是512*2/25=40.96uS,但是数据传送后会有一个SD卡的busy时间,据说这个时间是取决于SD卡的制造商的,据说东芝的卡busy时间最短(不知真假啊),但是我实验的结果是:有一个山寨的1G卡(上面写的是SAMSUNG)只有6mS,而另一个8G正品sandisk的class4的SDHC卡却要10mS。也就是说单块写入一个扇区正常8ms算正常。这也是为什么要用多块写入命令了,因为多块写入只有在最后一块发送完毕后才会产生SD卡的busy等待,从而加快了速度~
但是使用了PE的代码依然还有问题,我需要一次连续写入140块(140*512bytes),但是第一块发送完后,SD卡必然会产生一个busy时间,但是很短,然后再发送其余的139块,最后一个10几ms的busy时间(这是那张8G卡的结果,那张山寨卡会随机插入N多ms级的busy等待)。但最诡异的是明明所有数据都发送到了SD卡(用逻辑分析仪全程监视的SD总线),但是查看SD的数据时却发现只有很小的概率所有数据都存进SD卡了,大部分时候都是只有前30块写入了,后面没写入~这是至今我也没调通的地方~
PS:我按照苏大书上的QQ联系了他们,反映了SDHC多块写函数有问题,没想到几天后他真给我留言说会检查代码并尽快给我答复,但是至今再无音讯了~
希望对给我留言的那位有帮助,也希望对其他人有帮助,如果有什么我理解不对的地方,希望大家指正。
最后再次PS:逻辑分析仪超级有用~
|
|