智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 16415|回复: 25
打印 上一主题 下一主题

K60使用SDHC写SD卡的经验分享与疑问

  [复制链接]

1

主题

9

帖子

0

精华

高级会员

Rank: 4

积分
581
威望
396
贡献
123
兑换币
40
注册时间
2009-11-17
在线时间
31 小时
跳转到指定楼层
1#
发表于 2012-4-29 00:06:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      近来在论坛上有关于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:逻辑分析仪超级有用~


32

主题

646

帖子

0

精华

常驻嘉宾

Mechanical Engineering

Rank: 8Rank: 8

积分
4785

热心会员奖章优秀会员奖章在线王奖章活跃会员奖章

QQ
威望
2078
贡献
819
兑换币
378
注册时间
2011-11-14
在线时间
944 小时
2#
发表于 2012-4-29 00:30:04 | 只看该作者
好东西
回复 支持 反对

使用道具 举报

4

主题

103

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
威望
588
贡献
226
兑换币
0
注册时间
2012-3-15
在线时间
98 小时
毕业学校
电子科技大学成都学院
3#
发表于 2012-4-29 09:47:57 | 只看该作者
:lol:lol:lol:lol
回复 支持 反对

使用道具 举报

21

主题

242

帖子

0

精华

版主

Rank: 9Rank: 9Rank: 9

积分
21776

论坛元老奖章

威望
6392
贡献
14778
兑换币
90
注册时间
2010-12-4
在线时间
303 小时
4#
发表于 2012-4-29 18:23:59 | 只看该作者
  我想在10ms以内连续 写入48个扇区,不知打怎么办了{:soso_e129:}
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

高级会员

Rank: 4

积分
655
威望
372
贡献
135
兑换币
4
注册时间
2012-3-20
在线时间
74 小时
毕业学校
东华大学
5#
发表于 2012-4-29 19:20:39 | 只看该作者
时间是怎么得来的?
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

高级会员

Rank: 4

积分
581
威望
396
贡献
123
兑换币
40
注册时间
2009-11-17
在线时间
31 小时
6#
 楼主| 发表于 2012-4-29 19:37:04 | 只看该作者
此时风起 发表于 2012-4-29 19:20
时间是怎么得来的?

上面写了,用逻辑分析仪啊~
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

高级会员

Rank: 4

积分
691
威望
459
贡献
126
兑换币
12
注册时间
2011-2-28
在线时间
53 小时
7#
发表于 2012-5-1 11:57:15 | 只看该作者
之前被苏大的程序给。。。唉。。。伤心啊。
回复 支持 反对

使用道具 举报

10

主题

198

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
威望
914
贡献
384
兑换币
0
注册时间
2011-10-20
在线时间
114 小时
8#
发表于 2012-5-7 16:14:55 | 只看该作者
强人!!!
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
476
威望
299
贡献
85
兑换币
13
注册时间
2012-2-20
在线时间
46 小时
毕业学校
CQJTU
9#
发表于 2012-5-11 11:31:29 | 只看该作者
/* Reset ESDHC */
    SDHC_SYSCTL = SDHC_SYSCTL_RSTA_MASK | SDHC_SYSCTL_SDCLKFS(0x80);   
    while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA_MASK){};
    程序死在这里了 ,最有可能是什么原因呢 ,
回复 支持 反对

使用道具 举报

0

主题

102

帖子

0

精华

高级会员

Rank: 4

积分
818
威望
508
贡献
178
兑换币
0
注册时间
2012-3-6
在线时间
66 小时
10#
发表于 2012-5-23 15:58:11 | 只看该作者
现在多块读搞定了
多块写还是想楼主的一样 在找原因~~
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-25 14:35 , Processed in 0.112795 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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