搜索
bottom↓
回复: 7

SD卡复位失败,现在实在没有头绪了,只能在这里请教

[复制链接]

出0入0汤圆

发表于 2014-10-2 12:19:43 | 显示全部楼层 |阅读模式
本帖最后由 sungngai 于 2014-10-2 12:24 编辑

我刚升大二,由于大一学了点C语言和单片机基础,所以现在我想搞一个MP3,现在解码模块程序调好了,只剩下SD卡模块,可是SD卡总是复位失败。芯片用的是89C52,SD卡和程序如下,由于是新手,程序不够精简,我想各位帮我看看这SD卡驱动程序哪里有问题。先谢谢各位啦。
  1. #include <reg52.h>
  2. #include <vs1003.h>
  3. #include <SDcard.h>

  4. unsigned char is_init;                                         // 在初始化的时候设置此变量为1,同步数据传输(SPI)会放慢
  5. unsigned char bdata Data;
  6. sbit Data7=Data^7;
  7. sbit Data6=Data^6;
  8. sbit Data5=Data^5;
  9. sbit Data4=Data^4;
  10. sbit Data3=Data^3;
  11. sbit Data2=Data^2;
  12. sbit Data1=Data^1;
  13. sbit Data0=Data^0;
  14. void SD_spi_writeByte(unsigned char x)
  15. {
  16.      Data=x;
  17.      SD_SI=Data7;
  18.      SD_SCL=0;
  19.      if(is_init) delay(DELAY_TIME);
  20.          SD_SCL=1;
  21.      if(is_init) delay(DELAY_TIME);
  22.      SD_SI=Data6;
  23.      SD_SCL=0;
  24.      if(is_init) delay(DELAY_TIME);
  25.      SD_SCL=1;
  26.      if(is_init) delay(DELAY_TIME);
  27.      SD_SI=Data5;
  28.      SD_SCL=0;
  29.      if(is_init) delay(DELAY_TIME);
  30.      SD_SCL=1;
  31.      if(is_init) delay(DELAY_TIME);
  32.      SD_SI=Data4;
  33.      SD_SCL=0;
  34.      if(is_init) delay(DELAY_TIME);
  35.      SD_SCL=1;
  36.      if(is_init) delay(DELAY_TIME);
  37.      SD_SI=Data3;
  38.      SD_SCL=0;
  39.      if(is_init) delay(DELAY_TIME);
  40.      SD_SCL=1;
  41.      if(is_init) delay(DELAY_TIME);
  42.      SD_SI=Data2;
  43.      SD_SCL=0;
  44.      if(is_init) delay(DELAY_TIME);
  45.      SD_SCL=1;
  46.      if(is_init) delay(DELAY_TIME);
  47.      SD_SI=Data1;
  48.      SD_SCL=0;
  49.      if(is_init) delay(DELAY_TIME);
  50.      SD_SCL=1;
  51.      if(is_init) delay(DELAY_TIME);
  52.      SD_SI=Data0;
  53.      SD_SCL=0;
  54.      if(is_init) delay(DELAY_TIME);
  55.      SD_SCL=1;
  56.      if(is_init) delay(DELAY_TIME);
  57. }

  58. unsigned char SD_spi_readByte()                                  //SPI 读一个字节

  59. {
  60.      SD_SO=0xff;
  61.      SD_SCL=1;
  62.      if(is_init) delay(DELAY_TIME);
  63.      SD_SCL=0;
  64.      if(is_init) delay(DELAY_TIME);
  65.      Data7=SD_SO;                                                // 读取第7 位
  66.      SD_SCL=1;                                                   // 第1 个时钟上升沿
  67.      if(is_init) delay(DELAY_TIME);
  68.      SD_SCL=0;
  69.      if(is_init) delay(DELAY_TIME);
  70.      Data6=SD_SO;                                                // 读取第6 位
  71.      SD_SCL=1;                                                   // 第2 个时钟上升沿
  72.      if(is_init) delay(DELAY_TIME);
  73.      SD_SCL=0;
  74.      if(is_init) delay(DELAY_TIME);
  75.      Data5=SD_SO;                                                // 读取第5 位
  76.      SD_SCL=1;                                                   // 第3 个时钟上升沿
  77.      if(is_init) delay(DELAY_TIME);
  78.      SD_SCL=0;
  79.      if(is_init) delay(DELAY_TIME);
  80.      Data4=SD_SO;                                                // 读取第4 位
  81.      SD_SCL=1;                                                   // 第4 个时钟上升沿
  82.      if(is_init) delay(DELAY_TIME);
  83.      SD_SCL=0;
  84.      if(is_init) delay(DELAY_TIME);
  85.      Data3=SD_SO;                                                // 读取第3 位
  86.      SD_SCL=1;                                                   // 第5 个时钟上升沿
  87.      if(is_init) delay(DELAY_TIME);
  88.      SD_SCL=0;
  89.      if(is_init) delay(DELAY_TIME);
  90.      Data2=SD_SO;                                                // 读取第2 位
  91.      SD_SCL=1;                                                   // 第6 个时钟上升沿
  92.      if(is_init) delay(DELAY_TIME);
  93.      SD_SCL=0;
  94.      if(is_init) delay(DELAY_TIME);
  95.      Data1=SD_SO;                                                // 读取第1 位
  96.      SD_SCL=1;                                                   // 第7 个时钟上升沿
  97.      if(is_init) delay(DELAY_TIME);
  98.      SD_SCL=0;
  99.      if(is_init) delay(DELAY_TIME);
  100.      Data0=SD_SO;                                                // 读取第0 位
  101.      return (Data);
  102. }

  103. unsigned char SD_Write_Cmd(unsigned char *pcmd)
  104. {
  105.      unsigned char temp,time=0;
  106.      SD_CS=1;
  107.      SD_spi_writeByte(0xff);                                     //提高兼容性,如果没有这里,有些SD 卡可能不支持
  108.      SD_CS=0;
  109.      SD_spi_writeByte(pcmd[0]);
  110.          SD_spi_writeByte(pcmd[1]);
  111.      SD_spi_writeByte(pcmd[2]);
  112.      SD_spi_writeByte(pcmd[3]);
  113.      SD_spi_writeByte(pcmd[4]);
  114.      SD_spi_writeByte(pcmd[5]);
  115.      do
  116.      {
  117.           temp = SD_spi_readByte();                                                                  //一直读,直到读到的不是0xff 或超时                              
  118.           time++;
  119.      }while((temp==0xff)&&(time<TRY_TIME));
  120.      return(temp);
  121. }

  122. unsigned char SD_Reset()                                          //SD 卡复位,进入SPI 模式,使用CMd0(命令0)
  123. {
  124.      unsigned char time,temp,i;
  125.      unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};      //命令0 的字节序列
  126.      is_init=1;                                                   // 将is_init 置为1,此时模拟SPI 通信速速会变慢。
  127.      SD_CS=1;                                                     // 关闭片选
  128.      for(i=0;i<0x0f;i++)                                          //复位时,首先要发送最少74 个时钟信号
  129.      {
  130.            SD_spi_writeByte(0xff);                                //120 个时钟
  131.      }
  132.      SD_CS=0;                                                
  133.      time=0;           
  134.      do
  135.      {
  136.           temp=SD_Write_Cmd(pcmd);                                // 写入CMD0
  137.           time++;
  138.           if(time>=TRY_TIME)
  139.           {
  140.                SD_CS=1;                                           // 关闭片选
  141.                return(INIT_CMD0_ERROR);                           // CMD0 写入失败
  142.           }                                                                           
  143.             }while(temp!=0x01);
  144.      SD_CS=1;                                                     // 关闭片选
  145.      SD_spi_writeByte(0xff);                                      // 按照SD 卡的操作时序在这里补8 个时钟
  146.      return 0;                                                    // 返回0,说明复位操作成功
  147. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2014-10-2 12:40:42 | 显示全部楼层
电路啥样的?

出0入0汤圆

发表于 2014-10-2 13:04:22 | 显示全部楼层
建议使用12或者15系列单片机。

出0入0汤圆

发表于 2014-10-2 13:45:58 | 显示全部楼层
mark,学习一下

出0入0汤圆

发表于 2014-10-2 13:47:32 | 显示全部楼层
硬件有保证?

出0入0汤圆

 楼主| 发表于 2014-10-2 13:58:16 | 显示全部楼层

就是89C52最小系统+SD卡读写模块,最小系统是自己做的,调试过,用了半年没问题的。SD卡读写模块也是自己做的,后来为了排除硬件问题自己又买了一个SD卡读写模块。这是SD卡模块的原理图,SD_SO接P2^3,SD_SCL接P2^2,
SD_SI接P2^1,SD_CS接P2^0;、,用杜邦线连上最小系统的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-10-2 14:02:33 | 显示全部楼层

嗯嗯,应该没问题的,其实就是89C52最小系统+SD卡读写模块,最小系统是自己做的,调试过,用了半年没问题的。SD卡读写模块也是自己做的,后来为了排除硬件问题自己又去买了一个SD卡读写模块。现在就用买回来的SD读写模块用杜邦线接上最小系统,我觉得硬件上还是可靠的,我就想问问程序问题

出0入0汤圆

 楼主| 发表于 2014-10-2 14:05:44 | 显示全部楼层
登云钓月 发表于 2014-10-2 13:04
建议使用12或者15系列单片机。

嗯,其实我一开始就想用12来做的,可是做最小系统的时候有多出来的52芯片,而且我百度了一下89C52可以带得起来,所以就用这个来做了。其实我想问问程序有没有问题,就读,写,写命令和复位这四个函数
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 00:47

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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