标题: 单片机驱动SD卡初始化失败,一直卡在CMD0写入失败 求解 [打印本页]

作者: cheney03    时间: 2020-11-3 17:08
标题: 单片机驱动SD卡初始化失败,一直卡在CMD0写入失败 求解
本帖最后由 cheney03 于 2020-11-4 11:11 编辑

最近在调试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卡读写 程序.docx

16.9 KB, 下载次数: 13


作者: cheney03    时间: 2020-11-4 16:56
没人回答么,自己顶以下
作者: cheney03    时间: 2020-11-5 13:45
写入CMD0,返回值是FF,收不到回应0x01,是什么原因呢,哪位大神有成功驱动过SD卡的帮忙指导一下
作者: meijieboxi    时间: 2021-5-10 11:40
sd卡cmd0写入失败的问题解决了吗
作者: 丽江春水    时间: 2023-3-2 14:31
cheney03 发表于 2020-11-5 13:45
写入CMD0,返回值是FF,收不到回应0x01,是什么原因呢,哪位大神有成功驱动过SD卡的帮忙指导一下

我的回复也是0xff,更换硬件线路和mcu频率都无效果,
作者: 丽江春水    时间: 2023-3-2 14:33
unsigned char pcmd[] = {0x40,0x00,0x00,0x00,0x00,0x95};
我在别的程序中看到CMD0不是这样的,
MCU_write_SD_command(0x00,0x00000000,0x95);//发送命令0将MMC置于SPI模式
作者: 天ノ忆    时间: 2023-3-2 14:52
直接上示波器或者逻辑分析仪抓波形,比你在这问快得多
作者: xiaoyao166ny    时间: 2024-5-5 21:41
我 cmd0 可以过  但是 cmd1  sd卡是过不了的   那是mmc卡 的代码  刚找到原因
作者: 外号米虫    时间: 2024-5-6 08:52
有没有发现你的延时程序 int  time    整型数据  只有8位    256最大   哪来的1000 。想要1000的延时  只能做嵌套循环实现1000 。用C来写延时程序不是很准。最好还是上指令集吧,算周期的时间是最准确的。实在不行,那就只能单独编译延时程序,模跑一下,看时间咯。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1