6696|10

51

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SD卡复位成功,可是初始化收不到00,希望版主帮忙 [复制链接]

大致代码如下,用的是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) {}
}

 

 

 

下面附件是原理图,现在搞不清楚是硬件问题还是软件问题了。

SD卡接线原理图.png (41.12 KB, 下载次数: 3)

SD卡接线原理图.png

最新回复

请问楼主 sdhc卡需要修改哪些地方  我也遇到这个问题了  用的sdhc卡  初始化偶尔成功 经常不成功  详情 回复 发表于 2012-4-24 11:39
点赞 关注

回复
举报

51

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不知道 是不是DELAY_TIME 值的问题,急
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
刚看了一篇文章  
在初始化的时候,CLK的时钟最大不能超过400khz,请问这个是指发送位时的延时吗 ?
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

4
 
是SPI的时钟不能大于400kHz...
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 zhanghao26 的帖子

我用的单片机是 STC12C5A32S2  晶振22.1184 。
请问DELAY_TIME 的值多少可以?  搞晕掉了
 
 
 

回复

7228

帖子

192

TA的资源

五彩晶圆(高级)

6
 
SPI时钟问题么?? 解决了没
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼 常见泽1 的帖子

没哦  不知道怎么解决呢
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 6楼 常见泽1 的帖子

方便帮忙吗 ? 加下QQ 850645688
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

9
 
已经解决,SD卡与SDHC卡初始化 不一样
 
 
 

回复

36

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 9楼 _ForNow_ 的帖子

请问楼主现在是在写SD卡还是SDHC卡啊???
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

11
 
请问楼主 sdhc卡需要修改哪些地方  我也遇到这个问题了  用的sdhc卡  初始化偶尔成功 经常不成功
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表