找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2905|回复: 8
收起左侧

单片机驱动SD卡初始化失败,一直卡在CMD0写入失败 求解

[复制链接]
回帖奖励 25 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:743654 发表于 2020-11-3 17:08 | 显示全部楼层 |阅读模式
本帖最后由 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, 下载次数: 8

回复

使用道具 举报

ID:743654 发表于 2020-11-4 16:56 | 显示全部楼层
没人回答么,自己顶以下
回复

使用道具 举报

ID:743654 发表于 2020-11-5 13:45 | 显示全部楼层
写入CMD0,返回值是FF,收不到回应0x01,是什么原因呢,哪位大神有成功驱动过SD卡的帮忙指导一下
回复

使用道具 举报

ID:487909 发表于 2021-5-10 11:40 | 显示全部楼层
sd卡cmd0写入失败的问题解决了吗
回复

使用道具 举报

ID:1039438 发表于 2023-3-2 14:31 | 显示全部楼层
cheney03 发表于 2020-11-5 13:45
写入CMD0,返回值是FF,收不到回应0x01,是什么原因呢,哪位大神有成功驱动过SD卡的帮忙指导一下

我的回复也是0xff,更换硬件线路和mcu频率都无效果,
回复

使用道具 举报

ID:1039438 发表于 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模式
回复

使用道具 举报

ID:139866 发表于 2023-3-2 14:52 | 显示全部楼层
直接上示波器或者逻辑分析仪抓波形,比你在这问快得多
回复

使用道具 举报

ID:79094 发表于 2024-5-5 21:41 | 显示全部楼层
我 cmd0 可以过  但是 cmd1  sd卡是过不了的   那是mmc卡 的代码  刚找到原因
回复

使用道具 举报

ID:878800 发表于 2024-5-6 08:52 | 显示全部楼层
有没有发现你的延时程序 int  time    整型数据  只有8位    256最大   哪来的1000 。想要1000的延时  只能做嵌套循环实现1000 。用C来写延时程序不是很准。最好还是上指令集吧,算周期的时间是最准确的。实在不行,那就只能单独编译延时程序,模跑一下,看时间咯。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表