用的程序是STM32 mini开发版的代码....
SD卡是金士顿4G Class4的SDHC卡
[mw_shl_code=c,true]u8 SD_Initialize(void)
{ [/mw_shl_code]
[mw_shl_code=c,true] ..//变量定义
[/mw_shl_code]
[mw_shl_code=c,true] SD_SPI_Init();
SD_SPI_SpeedLow();
//for(i=0;i<0xf00;i++);
for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);
retry=20;
do
{
r1=SD_SendCmd(CMD0,0,0x95);//程序在SD_SendCmd子函数这里出现问题,导致后面的if进不去!!!!!!!!!!!!!!!!!!!!!!!
}while((r1!=0X01) && retry--);
SD_Type=0;//???????¨
if(r1==0X01)
{
...//SD卡版本判断
}
SD_DisSelect();
SD_SPI_SpeedHigh();
if(SD_Type)return 0;
else if(r1)return r1;
return 0xaa;//?????í?ó
}[/mw_shl_code]
//SD_SendCmd子程序代码:
[mw_shl_code=c,true]u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc)
{
u8 r1;
u8 Retry=0;
SD_DisSelect();
if(SD_Select()){printf("CS=Fail\n");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);//程序在这里出现问题,始终为0xFF
}while((r1&0X80) && Retry--);
return r1;
}[/mw_shl_code]
|