小弟现在使用C8051f380单片机连接一个SD卡。按照之前查阅的很多资料对SD进行初始化都失败了,现在特地向各位求教(SD卡的型号是金士顿的Class 10 UHS-I SDHC/SDXC 8GB的卡)。
在初始化SD卡的过程中,首先发送80个脉冲,然后发送指令CMD0,这时读到能够0x01的返回值。但是接下来发送CMD55+CMD41的ACMD41指令完成SD卡初始化,在这一步怎么也无法得到正确的返回值0x00,求教各位大神这是为什么?会和SD卡的型号有关系吗?但是它不是MMC卡,应该不使用CMD1来初始化啊,而且我也用CMD1尝试过初始化,没成功...
在此附上初始化函数和指令发送函数。
初始化函数:
uchar reset()
{
uchar i,retry,r1;
r1=0;
retry = 0;
CS=1; //CS置高发送多于74个时钟
do
{
for(i=0;i<10;i++) spiwrite(0xff); //80个时钟,发送CMD0
r1=sendcommand(0,0);
retry++;
if(retry>0xfe)
{ return -1;
}
} while(r1!=0x01);
while(r1!=0x00) //发送CMD55+ACMD41
{
r1=sendcommand(55,0);
r1=sendcommand(41,0);
}
// sendcommand(59,0);
// sendcommand(16,512);
return 0;
}
命令发送函数:
uchar sendcommand(uchar cmd, ulong arg)
{
uchar r1;
CS=1;
spiwrite(0xff);
CS=0;
spiwrite(cmd|0x40);
spiwrite(arg>>24);
spiwrite(arg>>16);
spiwrite(arg>>8);
spiwrite(arg);
spiwrite(0x95);
spiwrite(0xff);
while((r1=spiwrite(0xff))==0xff)
if(retry++>8) break;
CS=1;
return r1;
}
求各位大神帮助啊!感激不尽!
|