这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 单片机驱动SD卡失败,哪位朋友有这方面的经验?

共1条 1/1 1 跳转至

单片机驱动SD卡失败,哪位朋友有这方面的经验?

工程师
2020-11-05 22:12:26     打赏

最近在调试SD卡时,初始化时一直卡在CMD0写入失败  。SD卡从128M/256M/512/1G/2G都试过,SD卡读写模块也试了几个,不知道什么原因。还有一个问题,在初始化时速度不能高于400KHz,这个速度怎么计算?

哪位朋友有这方面的经验? 还望多指点!谢谢!


下面是我的延时函数和复位初始化过程。

单片机型号:STC89C52RC,晶振:11.0592MHz

void delay(unsigned int time)  //time取1000
{
while(time--);
}



******************************************************************
- 功能描述:复位SD卡,用到CMD0,使用SD卡切换到SPI模式
- 隶属模块:SD/SDHC模块
- 函数属性:内部
- 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD0_ERROR (sdx.h中有定义)
******************************************************************/

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个时钟
Beep=0;
return 0;//返回0,说明复位操作成功
}
/******************************************************************
- 功能描述:初始化SD卡,使用CMD1
- 隶属模块:SD/SDHC模块
- 函数属性:内部
- 参数说明:无
- 返回说明:调用成功,返回0x00,否则返回INIT_CMD1_ERROR (sd.h中有定义)
******************************************************************/

unsigned char SD_Init()        
{  
unsigned char time,temp;
unsigned char pcmd[] = {0x41,0x40,0x00,0x00,0x00,0xff};//第2个字节为0x40  HCS置位,说明主机支持高容量卡

SD_CS=0;

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

SD_CS=1;  //关闭SD卡的片选

SD_spi_write(0xff); //按照SD卡的操作时序在这里补8个时钟

Beep=0;
return(0); //返回0,说明初始化操作成功
}




关键词: SD卡     TF卡    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]