SD卡用SPI方式读取识别总是第一次调用有问题,第二次正常。
SD卡用SPI方式读取识别总是第一次调用有问题(返回0x80),第二次正常(返回0x02)。啥问题?
搞过的大侠帮忙指点一下,谢谢。
#define SD
#include "CONFIG.H"
#define bpnSDCs P16
#define bpnCardIn P12
U8 sd_sendCmd0(void) {
U8 code crgbhCmd[]={64+0,0x00,0x00,0x00,0x00,0x95};
U8 bh,bhTemp;
//降低SPI时钟频率为CPU_CLK/128,约300KHz.
spi_speed(3);
bpnSDCs=1;
for(bh=10;bh!=0;bh--)
spi_rw(0xff);
bpnSDCs=0;
for(bh=0;bh<6;bh++)
spi_rw(crgbhCmd);
spi_rw(0xff);
for(bh=255;bh!=0;bh--) {
bhTemp=spi_rw(0xff);
if(0xff!=bhTemp)
break;
}
bpnSDCs=1;
spi_speed(0);
return(bhTemp);
}
U8 sd_sendCmd1(void) {
U8 code crgbhCmd[]={64+1,0x00,0x00,0x00,0x00,0xff};
U8 bh,bhTemp;
bpnSDCs=0;
for(bh=0;bh<6;bh++)
spi_rw(crgbhCmd);
spi_rw(0xff);
for(bh=255;bh!=0;bh--) {
bhTemp=spi_rw(0xff);
if(0xff!=bhTemp)
break;
}
bpnSDCs=1;
return(bhTemp);
}
U8 sd_sendCmd41(void) {
U8 code crgbhCmd[]={64+41,0x00,0x00,0x00,0x00,0xff};
U8 bh,bhTemp;
bpnSDCs=0;
for(bh=0;bh<6;bh++)
spi_rw(crgbhCmd);
spi_rw(0xff);
for(bh=255;bh!=0;bh--) {
bhTemp=spi_rw(0xff);
if(0xff!=bhTemp)
break;
}
bpnSDCs=1;
return(bhTemp);
}
U8 sd_sendCmd55(void) {
U8 code crgbhCmd[]={64+55,0x00,0x00,0x00,0x00,0xff};
U8 bh,bhTemp;
bpnSDCs=0;
for(bh=0;bh<6;bh++)
spi_rw(crgbhCmd);
spi_rw(0xff);
for(bh=255;bh!=0;bh--) {
bhTemp=spi_rw(0xff);
if(0xff!=bhTemp)
break;
}
bpnSDCs=1;
return(bhTemp);
}
//没有卡返回0xff
//不能正常初始化返回0x80
//MMC卡返回0x01
//SD卡返回0x02
//SDHC卡返回0x03
//SDXC卡返回0x04
U8 sd_init(void) {
U8 bh,bhData;
if(0!=bpnCardIn)
return(0xff);
for(bh=255;bh!=0;bh--) {
if(0x01==sd_sendCmd0())
break;
}
if(0!=bh) {
for(bh=255;bh!=0;bh--) {
bhData=sd_sendCmd55();
bhData+=sd_sendCmd41();
if(0==bhData)
return(0x02);
}
for(bh=255;bh!=0;bh--) {
if(0==sd_sendCmd1())
return(0x01);
}
}
return(0x80);
}
页:
[1]