最近在调试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,说明初始化操作成功
}