代码如下:
U8 SD_Init(void)
{
U8 temp,i,buf[4]={0};
U16 time;
spi_hi_speed(0);
spi_ss (1); //??±?????
for(i=0;i<0x0A;i++) //?????±???×????·???×???74???±????????????±???????????
{
spi_send(0xff); //120???±??
}
time=0;
do
{
temp=SD_SendCommand(CMD0,0,0x95);//????CMD0 ????SD?¨
time++;
if(time>=2000)
return 1;
} while(temp!=0x01);
temp=SD_SendCommand_NoDeassert(CMD8,0x1aa,0x87);
if(temp==0x05) //V1.0°?±?
{
CardType=SD_TYPE_V1;
spi_ss (1); //??±?????
spi_send(0xff);
time=0;
do
{
temp=SD_SendCommand(CMD55,0,0);
if(temp!=0x01)
return temp;
temp=SD_SendCommand(ACMD41,0,0);
time++;
} while((temp)&&(time<200));
if(time>=200)
{
time=0;
do
{
temp=SD_SendCommand(CMD1,0,0); //????CMD1 ?¤??SD?¨
time++;
if(time>=200)
{
return 2;
}
} while(temp);
CardType=SD_TYPE_MMC;
}
spi_hi_speed(1);
spi_send(0xff);
temp = SD_SendCommand(CMD59,0,0x01);
if(temp)
{
return temp; //?ü???í?ó??·???r1
}
temp=SD_SendCommand(CMD16,512,0xff);
if(temp)
{
//?ü???í?ó??·???r1
return temp ;
}
}
else if(temp==0x01) //V2.x?¨
{
buf[0]=spi_send(0xff);
buf[1]=spi_send(0xff);
buf[2]=spi_send(0xff);
buf[3]=spi_send(0xff);
spi_ss (1); //??±?????
spi_send(0xff);
if((buf[2]==0x01)&&(buf[3]==0xaa))
{
time=0;
do
{
temp=SD_SendCommand(CMD55,0,0);
if(temp!=0x01)
return temp;
temp=SD_SendCommand(ACMD41,0x40000000,0);
if(time>=200)
return 3;
} while(temp);
temp=SD_SendCommand_NoDeassert(CMD58,0,0);
if(temp)
return temp;
buf[0]=spi_send(0xff);
buf[1]=spi_send(0xff);
buf[2]=spi_send(0xff);
buf[3]=spi_send(0xff);
spi_ss (1); //??±?????
spi_send(0xff); //°???SD?¨????×÷?±?ò????????8???±??
if(buf[0]&0x40)
CardType=SD_TYPE_V2HC;
else
CardType=SD_TYPE_V2;
spi_hi_speed(1);
temp = SD_SendCommand(CMD59,0,0x01);
if(temp)
return temp;
temp = SD_SendCommand(CMD16,512,0xff);
if(temp)
return temp;
return 0;
}
}
return temp;
}
这里,16G/32G的sd卡CMD8命令返回0xc1,没有处理分支,请接触过的高手帮忙(最好能提供源代码)。 |