初级会员

- 积分
- 195
- 金钱
- 195
- 注册时间
- 2012-10-24
- 在线时间
- 0 小时
|
//向SD卡发送一个命令
//输入: u8 cmd 命令
// u32 arg 命令参数
// u8 crc crc校验值
//返回值:SD卡返回的响应
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);//分别写入命令
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--);
//返回状态值
return r1;
}
//获取SD卡的CID信息,包括制造商信息
//输入: u8 *cid_data(存放CID的内存,至少16Byte)
//返回值:0:NO_ERR
// 1:错误
u8 SD_GetCID(u8 *cid_data)
{
u8 r1;
//发CMD10命令,读CID
r1=SD_SendCmd(CMD10,0,0x01);
if(r1==0x00)
{
r1=SD_RecvData(cid_data,16);//接收16个字节的数据
}
SD_DisSelect();//取消片选
if(r1)return 1;
else return 0;
}
以上2个函数,是原子SD卡实验里面的,第一个 SD_SendCmd 是发送指令的,第二个 SD_GetCID 是获取CID的
我对于 SD_SendCmd 这个函数不太理解,对应第二条函数中的 r1=SD_SendCmd(CMD10,0,0x01);来讲
发送的指令是CMD10,参数是0,CRC是01,那么在 SD_SendCmd 这个函数中的返回值是sd卡的响应。
SD卡的R1响应结构是 0 0 X X X 1
起始位 传输位 命令索引 卡状态 CRC7 结束位
首先,我不清楚响应的 命令索引,卡状态是什么意思,也许是 CMD10发送的命令参数之类的。
从R1的响应来看无论如何,R1的结束位是1,那么说,如果命令索引,卡状态和CRC7都是0的话,R1的值也是0x01,不可能是0x00
有了这个结论之后,再来看上面的SD_SendCmd 这个函数,可知这个函数的返回值就是R1的值,是不会为0的;
那么在 SD_GetCID 这个函数当中,为什么要 if(r1==0x00) 了才进入接收数据的函数呢? 还有 if(r1)return 1; 这个是返回错误的,既然R1不会为0,那么SD_GetCID 这个函数不就始终返回1,是错误的了?
主要还是R1响应弄的不太明白,请各位抽点时间看看,帮忙解决这个问题,谢谢了
|
|