请求指导,在原子哥sd卡初始化 SD_Initialize(void) 程序中 ,发送CMD0复位时
do
{
r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
}
while((r1!=0X01) && retry--);
这里为什么要 判断是不是接收到了0x01呢 ?看了很多pdf没找到说cmd0之后,要应答0x01的啊!!!
还有这个 SD_SendCmd(CMD0,0,0x95)函数进去后
u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc)
{
u8 r1;
u8 Retry=0;
SD_DisSelect();//取消上次片选
if(SD_Select())return 0XFF;//片选失效
//发送
SD_SPI_ReadWriteByte(cmd | 0x40);//分别写入命令 cmd0的命令是40,其余是依次加1
SD_SPI_ReadWriteByte(arg >> 24);
SD_SPI_ReadWriteByte(arg >> 16);
SD_SPI_ReadWriteByte(arg >> 8);
SD_SPI_ReadWriteByte(arg);
SD_SPI_ReadWriteByte(crc);
if(cmd==CMD12)SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading
//等待响应,或超时退出
Retry=0X1F;
do
{
r1=SD_SPI_ReadWriteByte(0xFF);
}while((r1&0X80) && Retry--); //当r1不为0x80时,退出循环
//返回状态值
return r1;
}
上面加粗加黑的代码,这里为什么有((r1&0X80) 这个东西呢,难道发送完crc之后,r1应该是0x80,?等过一会变成0x01么!?
实在看不懂,求指导啊!
|