购买了20个128M SD卡,单片机可以读的了其中的10个,另外10个读不出来,读不出来卡初始化都是正常的。读不出来的基本上是在这段代码这里跳出或者停住,帮我看看这段代码什么地方需要改进。
uchar SD_Read_Sector(ulong addr , uchar *buffer)
{//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
uint i;
uchar retry,temp;
uchar cmd17[]={0x51,0x00,0x00,0x00,0x00,0xFF}; //CMD17的字节序列
addr <<= 9; //sector = sector * 512 将块地址(扇区地址)转为字节地址
cmd17[1] = ((addr & 0xFF000000) >> 24);
cmd17[2] = ((addr & 0x00FF0000) >> 16);
cmd17[3] = ((addr & 0x0000FF00) >> 8);
//cmd17[4] = ((addr & 0x000000FF) >> 0);//可以省去
//CLR_SD_CS; //打开片选
retry = 0;
do
{
temp = SD_Write_Com(cmd17); //写入CMD17
retry++;
if(retry > 250) //最大重试次数250
{
SD_CS=1;
return(1); //读块失败
}
}while(temp != 0);
while (SPI_RW(0XFF) != 0xfe); //一直读,当读到0xfe时,说明后面的是512字节的数据了
for(i=0;i<512;i++) //将数据写入到数据缓冲区中
{
buffer[i] = SPI_RW(0XFF);
}
SPI_RW(0XFE);
SPI_RW(0XFE); //读取两个字节的CRC校验码,不用关心它们
SD_CS=1; //SD卡关闭片选
SPI_RW(0xFF); //按照SD卡的操作时序在这里补8个时钟
SPI_MOSI=1; //没数据时SD_MI应保持为高电平
return 0; //返回0,说明读扇区成功
}
|