OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6706|回复: 6

SD卡初始化程序,求助原子哥,帮忙分析下

[复制链接]

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-3-28
在线时间
0 小时
发表于 2012-10-22 11:30:04 | 显示全部楼层 |阅读模式

谁能帮忙解释下SD卡不同版本初始化各有什么不同,还有下面红色的那条语句什么意思,SD卡spi通讯协议看了好久了还是搞不明白,谢谢了!
 //初始化SD卡
//返回值:0,正常.
//   其他,不正常.
u8 SD_Initialize(void)
{
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用来进行超时计数
    u8 buf[4]; 
 u16 i;

 SD_SPI_Init();  //初始化IO
  SD_SPI_SpeedLow(); //设置到低速模式
    //for(i=0;i<0xf00;i++);//纯延时,等待SD卡上电完成  
 for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲
 retry=20;
 do
 {
  r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
 }while((r1!=0X01) && retry--);
  SD_Type=0;//默认无卡
 if(r1==0X01)
 {
  if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0              ?????为什么发这条命令啊!!!!没找到CM8是什么命令
  {
   for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 resp
   if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V
   {
    retry=0XFFFE;
    do
    {
     SD_SendCmd(CMD55,0,0X01); //发送CMD55
     r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41
    }while(r1&&retry--);
    if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始
    {
     for(i=0;i<4;i++)buf=SD_SPI_ReadWriteByte(0XFF);//得到OCR值
     if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;    //检查CCS
     else SD_Type=SD_TYPE_V2;  
    }
   }
  }else//SD V1.x/ MMC V3
  {
   SD_SendCmd(CMD55,0,0X01);  //发送CMD55
   r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41
   if(r1<=1)
   {  
    SD_Type=SD_TYPE_V1;
    retry=0XFFFE;
    do //等待退出IDLE模式
    {
     SD_SendCmd(CMD55,0,0X01); //发送CMD55
     r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41
    }while(r1&&retry--);
   }else
   {
    SD_Type=SD_TYPE_MMC;//MMC V3
    retry=0XFFFE;
    do //等待退出IDLE模式
    {              
     r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1
    }while(r1&&retry--); 
   }
   if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)SD_Type=SD_TYPE_ERR;//错误的卡
  }
 }
 SD_DisSelect();//取消片选
 SD_SPI_SpeedHigh();//高速
 if(SD_Type)return 0;
 else if(r1)return r1;    
 return 0xaa;//其他错误
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2014-10-28
在线时间
8 小时
发表于 2014-11-25 14:04:31 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,为什么要发0x87?这是CRC,我想问1、从哪里知道cmd8的crc是0x87,cmd0的crc是0x95。
2、crc是指得是什么?
我搜了一下sd卡2.0协议没有0x87也没有0x95,还请原子哥讲一讲。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-22 14:48:23 | 显示全部楼层
看2.0版本的协议。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-22 14:50:15 | 显示全部楼层
协议在这里。

SD卡2.0协议.pdf

1.04 MB, 下载次数: 1504

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-10-22 15:00:58 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢啦
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-25 15:09:16 | 显示全部楼层
回复【5楼】墨染卿卿:
---------------------------------
抄来的。
没深究。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-3-13
在线时间
9 小时
发表于 2016-5-14 11:02:14 | 显示全部楼层
同问    原子哥,为什么要发0x87?这是CRC,我想问1、从哪里知道cmd8的crc是0x87,cmd0的crc是0x95   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 00:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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