在线时间225 小时
UID3299800
注册时间2016-7-21
NXP金币0
TA的每日心情 | 开心 2021-8-2 08:37 |
---|
签到天数: 591 天 连续签到: 1 天 [LV.9]以坛为家II
金牌会员
 
- 积分
- 2682
- 最后登录
- 2021-11-29
|
通过SPI读SD卡时发SD_CMD55+SD_ACMD41命令。SD_CMD55第一次返回1,SD_ACMD41返回1,发第二次时SD_CMD55返回0,
初始化失败退出,初始化部分代码如下,求指点这是什么原因
INT8U SD_Init(void)
{
INT16U i;
INT16U u16Cnt;
INT8U u8Sta;
INT8U u8Buf[4];
INT8U u8Buffer[512];
sd_type = 0x00;
SPI_LowSpeed();
// 取消片选
sd_Disable_Select();
// 等待SD稳定
MyDelay(100);
// 至少发送74个时钟,
for(u16Cnt = 0; u16Cnt < 11; u16Cnt++)
{
sd_ReadWriteByte(0xff);
}
u16Cnt = 200;
do
{
u8Sta = sd_send_cmd(SD_CMD0, 0, 0x95);
u16Cnt--;
} while((u8Sta != 0x01) &&(u16Cnt));
if(u16Cnt == 0)
{
sd_Disable_Select();
//SD卡复位失败
return 1;
}
u8Sta = sd_send_cmds(SD_CMD8, 0x1AA, 0x87);
if(u8Sta == 0x01)
{
for(i = 0; i < 4; i++)
{
u8Buf = sd_ReadWriteByte(0xff);
}
if((u8Buf[2] == 0x01)&&(u8Buf[3] == 0xAA))
{
//支持2.7V到3.6V电压
u16Cnt = 0xffff;
do
{
u8Sta = sd_send_cmds(SD_CMD55, 0, 0xff);
if(u8Sta != 0x01)
{
return 1;//在此处退出,u8Sta返回的值为0
}
u8Sta = sd_send_cmds(SD_ACMD41, 0x40000000, 0xff);
}while(u8Sta && u16Cnt);
u8Sta = sd_send_cmds(SD_CMD58, 0, 0);
if(u8Sta != 0x00)
{
sd_Disable_Select();
return 1;
}
for(i = 0; i < 4; i++)
{
u8Buf = sd_ReadWriteByte(0xff);
}
sd_Disable_Select();
if(u8Buf[0] & 0x40)
{
//card is V2.0 SDHC
sd_type = SD_TYPE_V2HC;
}
else
{
//card is V2.0
sd_type = SD_TYPE_V2;
}
while(sd_send_cmds(SD_CMD16, 512, 0xff) != 0);
SPI_HighSpeed();
sd_send_cmds(SD_CMD9, 0, 0xff);
}
else
{
sd_Disable_Select();
return 1;
}
}
else
{
sd_type = SD_TYPE_V1;
sd_send_cmds(SD_CMD55, 0, 0xff);
u8Sta = sd_send_cmds(SD_ACMD41, 0, 0xff);
if(u8Sta <= 1)
{
//card is V1.0
sd_type = SD_TYPE_V1;
u16Cnt = 0xffff;
do
{
sd_send_cmds(SD_CMD55, 0, 0xff);
u8Sta = sd_send_cmds(SD_ACMD41, 0, 0xff);
u16Cnt--;
}while(u8Sta && u16Cnt);
}
else
{
//card is MMC
sd_type = SD_TYPE_MMC;
u16Cnt = 0xffff;
do
{
u8Sta = sd_send_cmds(SD_CMD1, 0, 0xff);
u16Cnt--;
}while(u8Sta && u16Cnt);
}
if((u16Cnt==0) || (sd_send_cmds(SD_CMD16, 512, 0xff) !=0 ))
{
sd_type = SD_TYPE_ERR;
sd_Disable_Select();
//设置块长度失败
return 1;
}
SPI_HighSpeed();
}
if(SD_ReadSingleSectors(u8Buffer, 0))
{
//读扇区失败
return 1;
}
if((u8Buffer[0] == 0xeb) || (u8Buffer[0] == 0xe9))
{
u32gLogicSector = 0;
}
else
{
//物理扇区转换为逻辑扇区,因为文件系统操作是从逻辑扇区操作的
u32gLogicSector = u8Buffer[454] + u8Buffer[455] * 0x100 + u8Buffer[456] * 0x10000 + u8Buffer[457] * 0x1000000;
}
sd_Disable_Select();
return 0;
}
|
|