打印
[MSP430]

430和sd卡通信 spi模式

[复制链接]
957|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qschk|  楼主 | 2015-8-5 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SD的初始化过程中,在送出CMD55后,回复的是0x01对的。但在送出ACMD41后,回复的确不是0x00.请帮我看看我的程序有什么问题吧,谢谢!
初始化程序如下:
//================================================================================================
//实现功能:初始化SD卡(参考SD卡初始化时序)
//================================================================================================
unsigned char SdInit(void)
{
        unsigned char i,time=0;
        unsigned char response=0x00;
      
        //send CMD0,如果response=0x01则SD卡成功转到SPI模式
        do
        {
         P1OUT |=0x80;            //SD_CS=1;
         for(i=0;i<=9;i++)       //复位时最少写入74个时钟周期
             SdWrite(0xff);
         P1OUT &=0x7f;           //SD_CS=0;        复位后CS拉低
        
         SdCommand(0x00,0,0x95); //Send Command 0 to put MMC in SPI mode
         response=SdResponse();
         
         time++;
        }
        while((response!=0x01)&&(time<100));   //等待命令CMD0的响应
        if(time==100)return 0;   //100次仍然不能得到命令CMD0的响应,超时退出

        
        //SD卡在进入SPI模式后,激活命令为Cmd55,ACmd41
         do {
            SdCommand(0x37,0,0xff);
            response=SdResponse();
            if (response!=0x01)
            {
              lcd_pos(4,0);
              Disp_HZ("55失败",3);
              return 0;
            }
            SdCommand(0x29,0,0xff);
            response=SdResponse();
              } while (response!=0x00);
        //最后CS拉高
        P1OUT |=0x80;            //SD_CS=1;
        SdWrite(0xff);           //补偿8个时钟
        return 1;                //初始化成功,返回成功信号1
}

相关帖子

沙发
zw852159448| | 2016-8-11 13:24 | 只看该作者
给你一个调试成功的代码
Uint8 SD_Init(void)
{
    Uint8 time=0;
    temp = 0;
    Uint8 Rev_Data[4]={0};
    Uint8 pcmd8[] = {0x48,0x00,0x00,0x01,0xAA,0x87};  //CMD8
    Uint8 pcmd55[] = {0x77,0x00,0x00,0x00,0x00,0x00};  //CMD55
    Uint8 pcmd41[] = {0x69,0x40,0x00,0x00,0x00,0x00};  //CMD41
    Uint8 pcmd58[] = {0x7A,0x00,0x00,0x00,0x00,0x00};  //CMD58
   
  
    P9OUT &= ~BIT0;   //打开片选
     temp = SD_WriteCmd(pcmd8);  //读取卡片版本
     if(temp==0x05)
     {
       SD_Type =SDV1;
          //设置卡类型为SD V1.0,如果是V1.0卡,CM8指令后没有后续数据
       P9OUT |= BIT0;
       SD_ReadWriteByte(0xff); //多发8时钟
       P9OUT &= ~BIT0;
       do
       {
       temp = SD_WriteCmd(pcmd55);
       if(temp!=0x01) return temp;
       temp = SD_WriteCmd(pcmd41);
       time++;
       }while((temp!= 0x00)&& (time<200));
       P9OUT |= BIT0;
     }// if(temp==0x05)
     else if(temp == 0x01)
     {
          //V2.0卡,CM8命令后会传回4字节的数据,要跳过再结束本命令
          Rev_Data[0] = SD_ReadWriteByte(0xff);  //返回0x00
          Rev_Data[1] = SD_ReadWriteByte(0xff);  //返回0x00
          Rev_Data[2] = SD_ReadWriteByte(0xff);  //返回0x01
          Rev_Data[3] = SD_ReadWriteByte(0xff);  //返回0xAA
           
          P9OUT |= BIT0;
          SD_ReadWriteByte(0xff); //多发8时钟
          P9OUT &= ~BIT0;
        do
         {
          temp = SD_WriteCmd(pcmd55);
          if(temp!=0x01) return temp;
          temp = SD_WriteCmd(pcmd41);
          time++;
          if(time>250) return temp;
          }while(temp!= 0x00);
         
    //初始化指令发送完成,接下来获取OCR信息
    /*------鉴别SD2.0卡版本--------------*/
      
         temp=SD_WriteCmd(pcmd58);
         if(temp != 0x00)return temp;
       //读OCR指令发出后,紧接着是4字节的OCR信息
          Rev_Data[0] = SD_ReadWriteByte(0xff);  
          Rev_Data[1] = SD_ReadWriteByte(0xff);  
          Rev_Data[2] = SD_ReadWriteByte(0xff);  
          Rev_Data[3] = SD_ReadWriteByte(0xff);
          P9OUT |= BIT0;
          SD_ReadWriteByte(0xff);
          if(Rev_Data[0] & 0x40) SD_Type = SDHC;
           else SD_Type =SDV2;
     }// else if(temp == 0x01)
   
       UCB2BR0 = 0x01;  //SD为高速
       UCB2BR1 = 0x00;               
    return 1;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝