makesoft 发表于 2014-7-5 19:10:54

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]
查看完整版本: SD卡用SPI方式读取识别总是第一次调用有问题,第二次正常。