智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4690|回复: 11
打印 上一主题 下一主题

[资源] 关于SD

[复制链接]

5

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2526
威望
413
贡献
1707
兑换币
0
注册时间
2009-8-22
在线时间
203 小时
跳转到指定楼层
1#
发表于 2010-4-19 21:12:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这几天做了下SD模块 遇到些问题 百思不得其解
我用的硬件是花12块钱从淘宝上买的SD板子 lm1117给3.3V的电平 程序是从网上下的WHUT_WJ的程序 没怎么改就用了
总线一直设的是80M spi初始化前是312.5Khz 初始化之后是40Mhz 写一块数据是没问题的 用时500us 可以接受 但是在连续写数据块的时候 问题就来了 没有办法连续的写进去 也就是说 若连续的调用写一块数据的函数 是不能将数据连续的写入的 数据是断断续续的 每4块能写进去一块
没有办法 我在其中加入延时 用示波器观察 发现当延时是20多MS的时候 连续写数据才是正常的 这样的话没有什么意义
今天偶然发现 我每写入一块之前 都进行初始化 却可以实现连续的写入数据 我觉得可能是初始化中的一些函数的作用 果然,我在写单块数据的函数中加入了一些初始化中的代码,依然可以实现连续写入块 用示波器观察发现这样写一块的时间是820US 不多说了 上程序
这是初始化函数:完全来自whut_wj
  1. unsigned char SD_MMC_SPI_Init(void)
  2. {
  3. unsigned int i;
  4. unsigned char response;

  5. /* initialize SPI with lowest frequency */
  6. SD_MMC_Low_Speed();

  7. /* card needs 74 cycles minimum to start up */
  8. for( i = 0; i < 10; ++i)
  9. {
  10. /* wait 8 clock cycles */
  11. SD_MMC_ReadWrite_Byte(0x00);
  12. }

  13. /* address card */
  14. SD_MMC_SPI_SELECT();

  15. /* reset card */

  16. for( i = 0; ; ++i)
  17. {
  18. response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 );
  19. if( response == 0x01 )
  20. break;

  21. if(i == 0x1ff)
  22. {
  23. SD_MMC_SPI_DESELECT();
  24. return 1;
  25. }
  26. }

  27. /* wait for card to get ready */
  28. for(i = 0; ; ++i)
  29. {
  30. response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);
  31. if(!(response & (1 << R1_IDLE_STATE)))
  32. break;

  33. if(i == 0x7fff)
  34. {
  35. SD_MMC_SPI_DESELECT();
  36. return 1;
  37. }
  38. }

  39. /* set block size to 512 bytes */
  40. if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512))
  41. {
  42. SD_MMC_SPI_DESELECT();
  43. return 1;
  44. }

  45. /* deaddress card */
  46. SD_MMC_SPI_DESELECT();

  47. /* switch to highest SPI frequency possible */
  48. SD_MMC_High_Speed();

  49. return 0;
  50. }
复制代码

这是我改写后的写单块函数 也来自WHUT_WJ:
  1. unsigned char SD_MMC_Write_Single_Block(unsigned long sector, unsigned char * buffer)
  2. {
  3. unsigned char Response;
  4. unsigned int i;
  5. unsigned int retry=0;

  6. //&ETH;&acute;&Atilde;ü&Aacute;&icirc; send write command
  7. Response = SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, sector<<9);
  8. if(Response != 0x00)
  9. return 3; //

  10. SD_MMC_SPI_SELECT();

  11. SD_MMC_ReadWrite_Byte(0xff);
  12. SD_MMC_ReadWrite_Byte(0xff);
  13. SD_MMC_ReadWrite_Byte(0xff);

  14. //·&cent;&iquest;&ordf;&Ecirc;&frac14;·&ucirc; start byte 0xfe
  15. SD_MMC_ReadWrite_Byte(0xFE);

  16. //&Euml;&Iacute;512×&Ouml;&frac12;&Uacute;&Ecirc;&yacute;&frac34;&Yacute; send 512 bytes data
  17. for(i=0; i<512; i++) //512
  18. {
  19. SD_MMC_ReadWrite_Byte(*buffer++);
  20. }

  21. SD_MMC_ReadWrite_Byte(0xff); //dummy crc
  22. SD_MMC_ReadWrite_Byte(0xff); //dummy crc

  23. Response = SD_MMC_ReadWrite_Byte(0xff);

  24. //&micro;&Egrave;&acute;&yacute;&Ecirc;&Ccedil;·&ntilde;&sup3;&Eacute;&sup1;&brvbar; judge if it successful
  25. if( (Response&0x1f) != 0x05)
  26. {
  27. SD_MMC_SPI_DESELECT();
  28. return 2; //Response
  29. }
  30. //&micro;&Egrave;&acute;&yacute;&sup2;&Ugrave;×÷&Iacute;ê wait no busy
  31. while(SD_MMC_ReadWrite_Byte(0xff) != 0x00)
  32. {
  33. if(retry++ > 0xfffe)
  34. {
  35. SD_MMC_SPI_DESELECT();
  36. return 1;
  37. }
  38. }
  39. SD_MMC_SPI_DESELECT();
  40. SD_MMC_ReadWrite_Byte(0xff);// extra 8 CLK
  41. // SD_MMC_SPI_SELECT(); 一下为改写 以上为WJ原程序
  42. for( i = 0; ; ++i)
  43. {
  44. Response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 );
  45. if( Response == 0x01 )
  46. break;

  47. if(i == 0x1ff)
  48. {
  49. SD_MMC_SPI_DESELECT();
  50. return 1;
  51. }
  52. }
  53. for(i = 0; ; ++i)
  54. {
  55. Response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0);
  56. if(!(Response & (1 << R1_IDLE_STATE)))
  57. break;

  58. if(i == 0x7fff)
  59. {
  60. SD_MMC_SPI_DESELECT();
  61. return 1;
  62. }
  63. }
  64. return 0;
  65. }
复制代码

为什么加入后面的冗余代码后 就可以实现快速的连续写块呢?希望大家能给我一个答案,谢谢
另外 在上大的第三届报告和网友CFANFRANK的帖子中说过20MS只可能写10块以下数据 我想我是不是解决了这个问题

5

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2526
威望
413
贡献
1707
兑换币
0
注册时间
2009-8-22
在线时间
203 小时
2#
 楼主| 发表于 2010-4-20 12:48:48 | 只看该作者
自己顶个。。
回复 支持 反对

使用道具 举报

1

主题

127

帖子

0

精华

高级会员

Rank: 4

积分
607
威望
424
贡献
117
兑换币
0
注册时间
2010-3-6
在线时间
33 小时
3#
发表于 2010-4-21 20:25:20 | 只看该作者
学习学习,我也想用SD卡··
回复 支持 反对

使用道具 举报

2

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
351
QQ
威望
282
贡献
53
兑换币
18
注册时间
2010-1-20
在线时间
8 小时
4#
发表于 2010-5-1 22:19:57 | 只看该作者
用不来。。。。。。。。。
回复 支持 反对

使用道具 举报

6

主题

713

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1498
威望
991
贡献
467
兑换币
30
注册时间
2010-4-13
在线时间
20 小时
5#
发表于 2010-5-4 12:06:40 | 只看该作者
很有用
回复 支持 反对

使用道具 举报

2

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
QQ
威望
270
贡献
25
兑换币
0
注册时间
2010-3-31
在线时间
6 小时
6#
发表于 2010-5-4 17:06:24 | 只看该作者
还不是很懂
回复 支持 反对

使用道具 举报

6

主题

713

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1498
威望
991
贡献
467
兑换币
30
注册时间
2010-4-13
在线时间
20 小时
7#
发表于 2010-5-11 22:17:53 | 只看该作者
很有用
回复 支持 反对

使用道具 举报

1

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
QQ
威望
347
贡献
41
兑换币
18
注册时间
2010-1-3
在线时间
22 小时
8#
发表于 2010-9-16 10:52:00 | 只看该作者
哥们能留个qq号或邮箱什么的吗?方便联系……我邮箱799381037@qq.com
询问有关sd卡的问题……
回复 支持 反对

使用道具 举报

4

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
威望
218
贡献
49
兑换币
8
注册时间
2010-10-19
在线时间
6 小时
9#
发表于 2011-1-7 09:26:47 | 只看该作者
用模拟的SPI我到用起了,写512个字节没问题,再多就没有试过了
回复 支持 反对

使用道具 举报

1

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
301
QQ
威望
261
贡献
22
兑换币
0
注册时间
2010-9-3
在线时间
9 小时
10#
发表于 2011-1-15 17:39:56 | 只看该作者
请楼上用一下单片机自带的spi。。。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 23:18 , Processed in 0.059216 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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