智能车制作

标题: Micro SD卡写扇区操作 [打印本页]

作者: 一坨飞奔de喵    时间: 2013-3-28 19:09
标题: Micro SD卡写扇区操作
本帖最后由 一坨飞奔de喵 于 2013-3-28 19:17 编辑
  1. // 初始化SD卡到SPI模式

  2. unsigned char SD_Reset()
  3. {
  4. unsigned char retry,temp;
  5. unsigned char i;
  6. unsigned char CMD0[] = {0x40,0x00,0x00,0x00,0x00,0x95};

  7. SD_CS_SetVal();

  8. for (i=0;i<10;i++)
  9. SD_SPI_SendChar(0xFF); //发送至少74个时钟信号
  10. SD_CS_ClrVal();

  11. //向SD卡发送CMD0
  12. retry=0;
  13. do
  14. {
  15. //为了能够成功写入CMD0,在这里写200次
  16. for(i=0;i<5;i++)
  17. SD_SPI_SendChar(0xFF); //发送至少16个时钟信号
  18. temp=Write_Command_SD(CMD0);
  19. retry++;
  20. if(retry==200)
  21. { //超过200次
  22. return(0x01);//CMD0 Error!
  23. }
  24. }
  25. while(temp!=0x01); //回应01h,停止写入
  26. SD_CS_SetVal();
  27. SD_SPI_SendChar(0xFF);
  28. return 0;
  29. }

  30. unsigned char SD_Init()
  31. {
  32. unsigned char retry,temp;
  33. unsigned char CMD1[] = {0x41,0x00,0x00,0x00,0x00,0xFF};
  34. //发送CMD1到SD卡
  35. SD_CS_ClrVal();

  36. retry=0;
  37. do
  38. { //为了能成功写入CMD1,写100次
  39. temp=Write_Command_SD(CMD1);
  40. retry++;
  41. if(retry==100)
  42. { //超过100次
  43. return(0x02);//CMD1 Error!
  44. }
  45. }
  46. while(temp!=0x00);//回应00h停止写入

  47. SD_CS_SetVal(); //片选无效
  48. SD_SPI_SendChar(0xFF);
  49. return(0); //初始化成功
  50. }

  51. //-----------------------------------------------------------------------------------------------
  52. // 向SD卡中写入命令,并返回回应的第二个字节
  53. //-----------------------------------------------------------------------------------------------
  54. unsigned char Write_Command_SD(unsigned char *CMD)
  55. {
  56. unsigned char *temp=0;
  57. unsigned char retry=0;
  58. unsigned char i;

  59. //禁止SD卡片选
  60. SD_CS_SetVal();
  61. //发送8个时钟信号
  62. SD_SPI_SendChar(0xFF);
  63. //使能SD卡片选
  64. SD_CS_ClrVal();

  65. //向SD卡发送6字节命令
  66. for (i=0;i<6;i++)
  67. {
  68. SD_SPI_SendChar(*CMD++);
  69. }

  70. //获得16位的回应
  71. SD_SPI_RecvChar(temp); //read the first byte,ignore it.

  72. do
  73. { //读取后8位
  74. SD_SPI_RecvChar(temp);
  75. retry++;
  76. }
  77. while((*temp==0xFF)&&(retry<100));
  78. return(*temp);
  79. }

  80. //--------------------------------------------------------------------------------------------
  81. // 写512个字节到SD卡的某一个扇区中去 返回0说明写入成功
  82. //--------------------------------------------------------------------------------------------
  83. unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)
  84. {
  85. unsigned char tmp,retry;
  86. unsigned char *temp=0;
  87. unsigned int i;
  88. //命令24
  89. unsigned char CMD24[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
  90. addr = addr << 9; //addr = addr * 512

  91. CMD24[1] = (unsigned char)((addr & 0xFF000000) >>24 );
  92. CMD24[2] = (unsigned char)((addr & 0x00FF0000) >>16 );
  93. CMD24[3] = (unsigned char)((addr & 0x0000FF00) >>8 );

  94. SD_CS_ClrVal();
  95. //写命令24到SD卡中去
  96. retry=0;
  97. do
  98. { //为了可靠写入,写100次
  99. tmp=Write_Command_SD(CMD24);
  100. retry++;
  101. if(retry==100)
  102. {
  103. return(tmp); //send commamd Error!
  104. }
  105. }
  106. while(tmp!=0);

  107. //在写之前先产生100个时钟信号
  108. for (i=0;i<100;i++)
  109. {
  110. SD_SPI_RecvChar(temp);
  111. }

  112. //写入开始字节
  113. //SD_CS_ClrVal();
  114. SD_SPI_SendChar(0xFE);

  115. //现在可以写入512个字节
  116. for (i=0;i<512;i++)
  117. {
  118. SD_SPI_SendChar(Buffer[i]);
  119. }

  120. //CRC-Byte
  121. SD_SPI_SendChar(0xFF); //Dummy CRC
  122. SD_SPI_SendChar(0xFF); //CRC Code

  123. SD_SPI_RecvChar(temp); // read response
  124. if((*temp & 0x1F)!=0x05) // 写入的512个字节是未被接受
  125. {
  126. SD_CS_SetVal();
  127. return(0x03); //Error!
  128. }
  129. //等到SD卡不忙为止
  130. //因为数据被接受后,SD卡在向储存阵列中编程数据
  131. do
  132. {
  133. SD_SPI_RecvChar(temp);
  134. }
  135. while (*temp!=0xFF) ;

  136. //禁止SD卡
  137. SD_CS_SetVal();
  138. SD_SPI_SendChar(0xFF);
  139. return(0);//写入成功
  140. }
复制代码
根据网上的操作改的,用的是DSC系列的芯片,MC56F8013。
没有打算用文件系统,只想简单地把数据写入扇区,可是弄了一周了,完全没有反应。。。
PS:用的winhex查看的,数据一点儿也没有改变。。。
求助各位大神,小弟拜谢了。。。



补充内容 (2013-3-28 20:57):
SPI的配置在八楼,谢谢
作者: gy810986741    时间: 2013-3-28 19:09
用winhex看看又没有数据写进去,我很久之前写的,找个程序给你看看,128的
作者: 一坨飞奔de喵    时间: 2013-3-28 19:11
搞了这么多天,都没信心了,谁来帮帮我吧。。。谢谢了。。。
作者: 一坨飞奔de喵    时间: 2013-3-28 19:47
帮帮忙呗。。。帮忙顶个贴也行哈~谢谢各位了
作者: exiao    时间: 2013-3-28 20:04
不懂,帮顶
作者: 一坨飞奔de喵    时间: 2013-3-28 20:07
exiao 发表于 2013-3-28 20:04
不懂,帮顶

谢谢帮顶
作者: 颠覆理论    时间: 2013-3-28 20:38
好好,查查,看看是不是你的SPI底层配置错了
作者: cxn5127111    时间: 2013-3-28 20:40
不懂,顶顶
作者: 一坨飞奔de喵    时间: 2013-3-28 20:56
颠覆理论 发表于 2013-3-28 20:38
好好,查查,看看是不是你的SPI底层配置错了

[attach]42913[/attach]
谢谢提醒~我查了查,好像没有什么问题吧,这是我的配置,能帮我看看么?或者推荐一下怎么配置,谢谢啦

作者: 一坨飞奔de喵    时间: 2013-3-28 20:56
cxn5127111 发表于 2013-3-28 20:40
不懂,顶顶

谢谢帮顶
作者: 简单丹    时间: 2013-3-28 21:17
顶一下.....
作者: hbqyzpy    时间: 2013-3-28 21:48
帮顶
作者: huanyefeng0809    时间: 2013-3-28 23:17
同纠结于SD卡的...
作者: 颠覆理论    时间: 2013-3-29 08:31
一坨飞奔de喵 发表于 2013-3-28 20:56
谢谢提醒~我查了查,好像没有什么问题吧,这是我的配置,能帮我看看么?或者推荐一下怎么配置,谢谢啦
...

把这个地方的中断失能掉

作者: 斯馨妍子    时间: 2013-3-29 09:14
我之前用的FAT32文件系统调试的,可以存进去,比如一场图像15300kb,我就存取了15300/512=30次,这样没问题,采集摄像头数据时,隔一场存一次结果就出错了,存进去的是乱码
作者: 庞七七    时间: 2013-3-29 10:55
你的sd卡初始化成功了吗?就是写函数开始前的初始化。。肯定对吗?或者换一张卡。。我们的只有小于1G的才写成功。。。。
作者: 庞七七    时间: 2013-3-29 10:56
你一步一步调试 。。每一步的返回值都正确了才可以啊。。。
作者: 若要走    时间: 2013-3-29 16:26

作者: 若要走    时间: 2013-3-29 16:28
不一定是程序的问题,不妨先仔细检查一下硬件电路。
作者: sunzhaoxing2012    时间: 2013-3-30 19:34
我也出现了这个问题,给我的教训是你一定要分清逻辑扇区和物理扇区的区别,两者可能同一个扇区号,但大多数不是一个扇区
作者: 中国正义党    时间: 2013-3-30 19:42
搞了一个多星期,遂放弃了,同求,,,,帮顶
作者: 1228463834    时间: 2013-4-1 07:11
涨价啦
作者: redwolfxd    时间: 2013-4-2 23:10
SD卡果断是个蛋疼的货啊,各种问题都可能导致调不出来,我用的K60代fat跑的,前面用的两张卡都是用了一段时间不能用了,现在这张每次启动都要复位一下才能用,蛋疼。。。楼主的spi如果确定没问题的话,最好看看SD卡在初始化时返回的参数是否正确,慢慢纠结吧
作者: gy810986741    时间: 2013-4-9 16:53
一坨飞奔de喵 发表于 2013-3-28 19:11
搞了这么多天,都没信心了,谁来帮帮我吧。。。谢谢了。。。

解决了吗?
作者: 一坨飞奔de喵    时间: 2013-4-10 01:43
gy810986741 发表于 2013-4-9 16:53
解决了吗?

有时候能写,有时候不能写,不清楚咋回事
作者: gy810986741    时间: 2013-4-10 15:32
一坨飞奔de喵 发表于 2013-4-10 01:43
有时候能写,有时候不能写,不清楚咋回事

这么伤感。。。你查查SD卡的cmd指令,看看有没有问题
作者: 一坨飞奔de喵    时间: 2013-4-10 16:19
gy810986741 发表于 2013-4-10 15:32
这么伤感。。。你查查SD卡的cmd指令,看看有没有问题

初始化什么的都没有问题了,就是后面有一个地方的返回不对,连续写入扇区的时候会出错,后来我把最后的返回校验给关了,就写进去了,其他的还不是很懂。
作者: gy810986741    时间: 2013-4-10 16:44
一坨飞奔de喵 发表于 2013-4-10 16:19
初始化什么的都没有问题了,就是后面有一个地方的返回不对,连续写入扇区的时候会出错,后来我把最后的返 ...

连续写?你可以试试多扇区写入,省时间,貌似也不难
作者: 二硫碘化钾    时间: 2013-4-20 21:54
我也搞了很久,很纠结呀。
作者: gy810986741    时间: 2013-4-24 14:12
能否将你的这个程序发给我看看?
810986741@qq.com
作者: 无敌吹风机    时间: 2013-4-29 17:02
请问下我用SPI 读写SD卡 初始化CMD0发了总是没收到0x01 ,能替我看看吗

作者: 一坨飞奔de喵    时间: 2013-5-8 11:25
gy810986741 发表于 2013-4-24 14:12
能否将你的这个程序发给我看看?

已发送至邮箱,写得有点儿乱
作者: 一坨飞奔de喵    时间: 2013-5-8 11:38
无敌吹风机 发表于 2013-4-29 17:02
请问下我用SPI 读写SD卡 初始化CMD0发了总是没收到0x01 ,能替我看看吗

代码发过来看看撒
作者: xingyujie    时间: 2013-6-4 18:05
能把代码发给我看看吗?邮箱:1149989316@qq.com
最近也在用SPI配SD,在读函数里就跑死了。。。
作者: 一坨飞奔de喵    时间: 2013-6-4 22:12
xingyujie 发表于 2013-6-4 18:05
能把代码发给我看看吗?邮箱:
最近也在用SPI配SD,在读函数里就跑死了。。。

已发送
作者: xingyujie    时间: 2013-6-5 13:39
收到,谢谢
作者: 奇迹在明天    时间: 2013-7-13 14:03
一坨飞奔de喵 发表于 2013-6-4 22:12
已发送

我最近也再用,能把SD驱动程序发过来一份吗?感激不尽  邮箱1021208069@qq.com

作者: 一坨飞奔de喵    时间: 2013-7-13 16:28
奇迹在明天 发表于 2013-7-13 14:03
我最近也再用,能把SD驱动程序发过来一份吗?感激不尽  邮箱

已发送
作者: 奇迹在明天    时间: 2013-7-21 21:50
能否发一个SD卡的驱动程序,1021208069@qq.com
作者: 奇迹在明天    时间: 2013-7-21 21:52
xingyujie 发表于 2013-6-4 18:05
能把代码发给我看看吗?邮箱:
最近也在用SPI配SD,在读函数里就跑死了。。。

能否发一个SD卡的驱动程序,1021208069@qq.com

作者: 奇迹在明天    时间: 2013-8-5 13:59
huanyefeng0809 发表于 2013-3-28 23:17
同纠结于SD卡的...

能否发一个SD卡的驱动程序给我,感激不尽,1021208069@qq.com

作者: 奇迹在明天    时间: 2013-8-5 14:56
gy810986741 发表于 2013-4-9 16:53
解决了吗?

能否发一个SD卡的驱动程序,1021208069@qq.com


作者: 中华旺仔    时间: 2014-2-20 21:55
:lol楼主还在论坛吗?我们也想用SD卡,,能帮忙吗?SPI驱动的程序有吗??




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