想了1天,实在想不明白,帮忙看下

[复制链接]
 楼主| chenyu988 发表于 2012-9-15 00:00 | 显示全部楼层 |阅读模式
SD发送一个命令函数如下:
u8 SD_SendCommand(u8 cmd, u32 arg,u8 crc)
{
  unsigned char r1;
  unsigned int Retry = 0;
  SD_CS_DISABLE();
  SPI_ReadWriteByte(0xff);
  SD_CS_ENABLE();//片选端置低,选中SD卡
  
  /* 发送命令序列 */
  SPI_ReadWriteByte(cmd | 0x40);                     
  SPI_ReadWriteByte((u8)(arg >> 24));//参数[31..24]
  SPI_ReadWriteByte((u8)(arg >> 16));//参数[23..16]
  SPI_ReadWriteByte((u8)(arg >> 8));//参数[15..8]
  SPI_ReadWriteByte((u8)arg);    //参数[7..0]
  SPI_ReadWriteByte(crc);
   
  //等待响应,或超时退出
  while((r1 = SPI_ReadWriteByte(0xFF))==0xFF)
  {
    Retry++;
    if(Retry > 800)break;   
   }   
  //关闭片选
  SD_CS_DISABLE();
  //在总线上额外增加8个时钟,让SD卡完成剩下的工作
  SPI_ReadWriteByte(0xFF);
  //返回状态值
  return r1;
}
其中
  while((r1 = SPI_ReadWriteByte(0xFF))==0xFF)
  {
    Retry++;
    if(Retry > 800)break;   
   }
意思是不是(r1 = SPI_ReadWriteByte(0xFF))==0xFF成立 retry++,直到retry>800,break,此时r1的值为0xff。
  return r1;此时r1不是0xff吗?

(r1 = SPI_ReadWriteByte(0xFF))==0xFF不成立不就直接执行 SD_CS_DISABLE();了吗?此时r1的值是什么呢?
efen 发表于 2012-9-15 01:13 | 显示全部楼层
retry++ ,是加入超时机制,防止CPU在这死等
znmcu 发表于 2012-9-15 07:40 | 显示全部楼层
可以去看我的视频教程,sd卡专辑
 楼主| chenyu988 发表于 2012-9-15 09:43 | 显示全部楼层
2# efen
不就判断一次吗  怎么一直等待?
ningling_21 发表于 2012-9-15 20:15 | 显示全部楼层
(r1 = SPI_ReadWriteByte(0xFF))==0xFF不成立不就直接执行 SD_CS_DISABLE();了吗?此时r1的值是什么呢?

就是从SPI总线上读取到的数据...
原野之狼 发表于 2012-9-15 20:29 | 显示全部楼层
等于0xff时  返回0xff
不等于时  返回读取到的值
 楼主| chenyu988 发表于 2012-9-15 22:08 | 显示全部楼层
看了一下初始化的时序图, 如果读取到0xff,则命令没有写入成功,读取到的不是0xff(即写入命令对应的应答值)则写入命令成功。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

1107

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部