打印

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

[复制链接]
1421|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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
不就判断一次吗  怎么一直等待?

使用特权

评论回复
5
ningling_21| | 2012-9-15 20:15 | 只看该作者
(r1 = SPI_ReadWriteByte(0xFF))==0xFF不成立不就直接执行 SD_CS_DISABLE();了吗?此时r1的值是什么呢?

就是从SPI总线上读取到的数据...

使用特权

评论回复
6
原野之狼| | 2012-9-15 20:29 | 只看该作者
等于0xff时  返回0xff
不等于时  返回读取到的值

使用特权

评论回复
7
chenyu988|  楼主 | 2012-9-15 22:08 | 只看该作者
看了一下初始化的时序图, 如果读取到0xff,则命令没有写入成功,读取到的不是0xff(即写入命令对应的应答值)则写入命令成功。

使用特权

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

本版积分规则

47

主题

1108

帖子

14

粉丝