现手上有一项目要用到SD卡,写了个程序,2G以上的SD卡使用正常,能正常读取SD上的数据。但是换到4G以上的SD卡时就不正常了,
在坛子上看了很多人的例子,包括bozai的程序,知道4G以上使用的是SD2.0协议,而4G以下的使用SD1.0协议,但是我认为两者的区别仅限于读写的时候1.0是以字节为单位,而2.0以block(也就是512B)为单位,其他地方相同。
比如,要读取绝对地址为0x200开始的512字节,如果是1.0协议的话,读的时候就用0x200做为地址;而如果是2.0协议的话,就用0x200/0x200=1为地址,但是我用1做为地址读的时候,总返回结果0x20,报告地址错误。
我想请问一个各位,这是什么回事?是不是在初始化的时候还需要注意点什么,是我没考虑到的。
以下是测试用的源码:
BYTE SD_InitializeCard(void)
{
BYTE stat;
DWORD Count;
BYTE CARD_TYPE;
Count = 0;
PORTGbits.RG9 = 0;
Delay8Tcy();
// index 0: GO_IDLE_STATE command
stat = SD_CardCommand(0, 0,0x95);
// repeat until get 0x01 (In Idle State) answer.
while( (stat != 1) )
{
stat = SD_CardCommand(0, 0,0x95);
Count++;
if ( Count > 8000)
{
return 1; //failed
}
}
Delay_Us(100);
stat = SD_CardCommand(8, 0x1aa, 0x87);
if(stat==5) CARD_TYPE=1; //sd1.0
// index 1: SEND_OP_COMMAND, card initializing
// repeat until get 0x00 (In Idle State bit cleared).
while ( (stat != 0) && (Count<200) )
{
Delay_Us(1);
stat = SD_CardCommand(55, 0,0);
Delay_Us(1);
stat = SD_CardCommand(41, 0,0);
Count++;
}
BYTE i;
while((stat=SD_CardCommand(58, 0,0))!=0x00) ; /*read OCR*/
for(i=0;i<4;i++)buffer=SPI_read(0xff);
if(buffer[0]&(1<<6))
address_mode = BLOCK_MODE;
else
address_mode = BYTE_MODE;
PORTGbits.RG9 = 1;
return 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>