智能车制作

标题: 关于SD [打印本页]

作者: changhao    时间: 2010-4-19 21:12
标题: 关于SD
这几天做了下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块以下数据 我想我是不是解决了这个问题
作者: changhao    时间: 2010-4-20 12:48
自己顶个。。
作者: zou317    时间: 2010-4-21 20:25
学习学习,我也想用SD卡··
作者: wuyu_juan    时间: 2010-5-1 22:19
用不来。。。。。。。。。
作者: zhangluhuixing    时间: 2010-5-4 12:06
很有用
作者: xiao鑫    时间: 2010-5-4 17:06
还不是很懂
作者: zhangluhuixing    时间: 2010-5-11 22:17
很有用
作者: zx5071909    时间: 2010-9-16 10:52
哥们能留个qq号或邮箱什么的吗?方便联系……我邮箱799381037@qq.com
询问有关sd卡的问题……
作者: 530544266    时间: 2011-1-7 09:26
用模拟的SPI我到用起了,写512个字节没问题,再多就没有试过了
作者: bamrain    时间: 2011-1-15 17:39
请楼上用一下单片机自带的spi。。。
作者: bamrain    时间: 2011-5-25 16:39
顶顶
作者: ngng1109    时间: 2011-6-22 20:18
楼主,你好!我用了你列出的程序,连续写快还是不行呀,能不能把你的程序给我一份参考下,谢谢!1013044004@qq.com




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2