求版主帮忙,复位成功,初始化收不到00.

2019-03-24 18:14发布

初来咋到,前两天把帖子贴嵌入式了!   大致代码如下,用的是Znfat的代码,复位成功了,初始化不行。请大家帮忙看看。比较急 #include "STC12C5A32S2.H"
#define DELAY_TIME 10
#define TRY_TIME 200
void SD_spi_write(unsigned char x)
{   
_dat=x; 
SD_SI=_dat7;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat6;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat5;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat4;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat3;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat2;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat1;
SD_SCL=0;
if(is_init) delay(DELAY_TIME);
SD_SCL=1;
if(is_init) delay(DELAY_TIME);

SD_SI=_dat0;
SD_SCL=0;
if(is_init) delay(DELAY_TIME); 
SD_SCL=1;
if(is_init) delay(DELAY_TIME);
}
读字节和这个函数刚好相反,字数有限就不贴了。
unsigned char SD_Write_Cmd(unsigned char *pcmd) //向SD卡写命令,pcmd是命令字节序列的首地址
{
unsigned char temp,time=0;

SD_CS=1;
SD_spi_write(0xff); //提高兼容性,如果没有这里,有些SD卡可能不支持  
SD_CS=0;

SD_spi_write(pcmd[0]);
SD_spi_write(pcmd[1]);
SD_spi_write(pcmd[2]);
SD_spi_write(pcmd[3]);
SD_spi_write(pcmd[4]);
SD_spi_write(pcmd[5]);

do

  temp = SD_spi_read();//一直读,直到读到的不是0xff或超时
   //senddata(temp);
  time++;
}while((temp==0xff)&&(time<TRY_TIME));

return(temp);
}
unsigned char SD_Init() //初始化,使用CMD1(命令1)

unsigned char time,temp;
unsigned char pcmd[] = {0x41,0x00,0x00,0x00,0x00,0xff}; //命令1的字节序列

SD_CS=0; //打开片选

time=0;
do
{
  temp=SD_Write_Cmd(pcmd);
  time++;
  if(time==TRY_TIME)
  {
   SD_CS=1; //关闭片选
   return(INIT_CMD1_ERROR);//CMD1写入失败
  }
}while(temp!=0);
  
is_init=0; //初始化完毕,将is_init设置为0,为了提高以后的数据传输速度
  
SD_CS=1;  //关闭片选

SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
return(0); //返回0,说明初始化操作成功
}
unsigned char SD_Reset()
{
unsigned char time,temp,i;
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};

is_init=1; //is_init置为1,让SPI速度慢下来

SD_CS=1;
for(i=0;i<0x0f;i++) //初始时,首先要发送最少74个时钟信号,这是必须的!!!
{
  SD_spi_write(0xff); //120个时钟
}

SD_CS=0;
time=0;
do
{
  temp=SD_Write_Cmd(pcmd);//写入CMD0
  time++;
  if(time==TRY_TIME)
  {
   return(INIT_CMD0_ERROR);//CMD0写入失败
  }
}while(temp!=0x01);

SD_CS=1;
SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟
return 0;//返回0,说明复位操作成功
}
void main()
{
   int i,j;
   i=1;
   serialinit();
   j=SD_Reset();//SD卡复位
   i=SD_Init(); //SD卡初始化
   senddata(j);
   //senddata(i);
while(1) {}
}       下面附件是原理图,现在搞不清楚是硬件问题还是软件问题了。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。