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

2020-01-22 12:07发布

本帖最后由 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. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
turf456
1楼-- · 2020-01-22 16:52
电路啥样的?
登云钓月
2楼-- · 2020-01-22 21:15
 精彩回答 2  元偷偷看……
dsp56789
3楼-- · 2020-01-23 00:33
mark,学习一下
MR_ZJY
4楼-- · 2020-01-23 01:09
硬件有保证?
sungngai
5楼-- · 2020-01-23 06:58
turf456 发表于 2014-10-2 12:40
电路啥样的?

就是89C52最小系统+SD卡读写模块,最小系统是自己做的,调试过,用了半年没问题的。SD卡读写模块也是自己做的,后来为了排除硬件问题自己又买了一个SD卡读写模块。这是SD卡模块的原理图,SD_SO接P2^3,SD_SCL接P2^2,
SD_SI接P2^1,SD_CS接P2^0;、,用杜邦线连上最小系统的
sungngai
6楼-- · 2020-01-23 09:20
MR_ZJY 发表于 2014-10-2 13:47
硬件有保证?

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

一周热门 更多>