本帖最后由 xiezhaoxuan 于 2016-1-7 14:57 编辑
如题,用公司的STM32F105VC通过硬件SPI方式读写SD卡,发送CMD8命令总是返回0x09,断断续续找了好几天的原因没有找到,今天找了个教程里的程序,移植到这个板子上了,再发送CMD8,结果返回的是0x01,甚至都用示波器看了波形,一开始教程程序SPI时钟慢,以为是我程序里时钟的问题,把教程程序时钟调到278KHz左右发现人家得程序还是能初始化卡成功,实在没办法了,两个程序对比吧,最后对比到下面这段程序,恍然大悟啊,真正的恍然大悟啊
//发送一个命令,并返回相应的值
uint8_t Sd_SendCommand(uint8_t Cmd,uint32_t Arg,uint8_t Crc)
{
uint8_t Sd_Num2=0xff,Sd_Num3=0;
Sd_SendOneByte(Cmd);
Sd_SendOneByte((uint8_t)Arg>>24);
Sd_SendOneByte((uint8_t)Arg>>16);
Sd_SendOneByte((uint8_t)Arg>>8);
Sd_SendOneByte((uint8_t)Arg);
Sd_SendOneByte(Crc);
while(1)
{
Sd_Num2=Sd_SendOneByte(0xff);
if((Sd_Num2&0x80)!=0x80)
break;
if(++Sd_Num3>=10)
break;
}
return Sd_Num2;
}
Sd_SendOneByte((uint8_t)Arg>>24);
我实际是打算先将Arg右移24位再截成8位数据,但是这样写就废了,成了先将Arg截成8位数据再右移24位。。。。
改为下面这样,一次通过。。。Sd_SendOneByte(Cmd);
Sd_SendOneByte((uint8_t)(Arg>>24));
Sd_SendOneByte((uint8_t)(Arg>>16));
Sd_SendOneByte((uint8_t)(Arg>>8));
Sd_SendOneByte((uint8_t)Arg);
Sd_SendOneByte(Crc);
记住这个教训吧。。。。
|