keil编写的SPI初始化SD卡;失败无response的原因。如下程序SD 初始化SD卡始终无回应,请高手指点 10
/*--------------SPIwrite----------------------*/voidspi_w(uncharspi_wdata){unchari;fo...
/*--------------SPI write----------------------*/
void spi_w(unchar spi_wdata)
{unchar i;
for(i=0;i<8;i++)
{spi_wdata<<=1;//data<<i
skl=0;
us_delay(3);
skl=1;
mosi=CY;
}
skl=0;
mosi=1;//release bus
}
/*-----------------SPI READ----------------------*/
unchar spi_r(void)
{unchar spi_rdata=0;
unchar i;
miso=1;// MCU INPUT
for(i=0;i<8;i++)
{spi_rdata<<=1;
skl=0;
us_delay(3);
skl=1;
spi_rdata|=miso;
}
miso=1;
return spi_rdata;
}
/*-----------------READ RESPOND-----------------*/
unchar sd_response()
{ unchar i,response;
for(i=0;i<10;i++)
{response=spi_r();
if(response==0x00)
break;
if(response==0x01)
break;
}
return response;
}
/*----------------WRITE SD CMD---------------------*/
void sd_cmd(unchar cmd,unlong sector,unchar crc )
{unchar sec[4];
sec[0]= sector;//block 1
sec[1]=sector>>8;//移位
sec[2]=sector>>16;
sec[3]=sector>>24;
spi_w(cmd|0x40);
spi_w(sec[3]);
spi_w(sec[2]);
spi_w(sec[1]);
spi_w(sec[0]);
spi_w(crc);
}
/*--------------SD INITAL-----------------------*/
//初始化
bit sd_init(void)
{unint delay=0;
unchar i;
unchar response=0x01;//
cs=1;
for(i=0;i<10;i++)//上电后80个时钟信号
spi_w(0xff);//SD 卡复位
cs=0;
sd_cmd(0x00,0,0x95);//CMD0 CRC=0X95
i=0;
while(sd_response()!=0x01)//等待回应=0x01
{spi_w(0xff);i++;if(i>=100) return 0;}
//100 times
cs=1;
spi_w(0xff);//8 个空时钟信号
i=0;
cs=0;
sd_cmd(0x01,0,0xff);//无需CRC验证
while(sd_response()!=0x00)
{spi_w(0xff);i++;if(i>=100) return 0;}
cs=1;
spi_w(0xff);//8 syclk
return 1;//success
} 展开
void spi_w(unchar spi_wdata)
{unchar i;
for(i=0;i<8;i++)
{spi_wdata<<=1;//data<<i
skl=0;
us_delay(3);
skl=1;
mosi=CY;
}
skl=0;
mosi=1;//release bus
}
/*-----------------SPI READ----------------------*/
unchar spi_r(void)
{unchar spi_rdata=0;
unchar i;
miso=1;// MCU INPUT
for(i=0;i<8;i++)
{spi_rdata<<=1;
skl=0;
us_delay(3);
skl=1;
spi_rdata|=miso;
}
miso=1;
return spi_rdata;
}
/*-----------------READ RESPOND-----------------*/
unchar sd_response()
{ unchar i,response;
for(i=0;i<10;i++)
{response=spi_r();
if(response==0x00)
break;
if(response==0x01)
break;
}
return response;
}
/*----------------WRITE SD CMD---------------------*/
void sd_cmd(unchar cmd,unlong sector,unchar crc )
{unchar sec[4];
sec[0]= sector;//block 1
sec[1]=sector>>8;//移位
sec[2]=sector>>16;
sec[3]=sector>>24;
spi_w(cmd|0x40);
spi_w(sec[3]);
spi_w(sec[2]);
spi_w(sec[1]);
spi_w(sec[0]);
spi_w(crc);
}
/*--------------SD INITAL-----------------------*/
//初始化
bit sd_init(void)
{unint delay=0;
unchar i;
unchar response=0x01;//
cs=1;
for(i=0;i<10;i++)//上电后80个时钟信号
spi_w(0xff);//SD 卡复位
cs=0;
sd_cmd(0x00,0,0x95);//CMD0 CRC=0X95
i=0;
while(sd_response()!=0x01)//等待回应=0x01
{spi_w(0xff);i++;if(i>=100) return 0;}
//100 times
cs=1;
spi_w(0xff);//8 个空时钟信号
i=0;
cs=0;
sd_cmd(0x01,0,0xff);//无需CRC验证
while(sd_response()!=0x00)
{spi_w(0xff);i++;if(i>=100) return 0;}
cs=1;
spi_w(0xff);//8 syclk
return 1;//success
} 展开
1个回答
展开全部
没看你的程序。
不过建议你:
1. 先核查一遍硬件电路,确认接线正确,确认电源工作范围满足要求。
2. 用示波器检查一下SPI四根线的信号情况,确认时钟正常、MO正常、片选正常,看看SD卡是否正确回信号。
3. 初始化之前确认SD卡上电序列是否正确。我看你的程序中缺少。
不过建议你:
1. 先核查一遍硬件电路,确认接线正确,确认电源工作范围满足要求。
2. 用示波器检查一下SPI四根线的信号情况,确认时钟正常、MO正常、片选正常,看看SD卡是否正确回信号。
3. 初始化之前确认SD卡上电序列是否正确。我看你的程序中缺少。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
迪凯特科技(北京)有限公司_
2025-01-03 广告
2025-01-03 广告
单片机串口通信数据丢失的原因可能如下:1. 按键通过串口发送对应命令,第一次按按键串口发送的指令正确且能把数据正确的显示出来,在第二次按按键串口发送的指令出现丢失的状况,可能是因为串口通信的波特率设置不正确。2. 如果单片机和外部设备的波特...
点击进入详情页
本回答由迪凯特科技(北京)有限公司_提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |