新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2020-11-30
- 在线时间
- 3 小时
|

楼主 |
发表于 2020-12-1 17:31:59
|
显示全部楼层
SD卡初始化函数如下:
//初始化SD卡
u8 Init_SDCard(void)
{
u8 r1; // 存放SD卡的返回值
u16 retry; // 用来进行超时计数
u8 buf[4];
u16 i;
Init_SPI();
SD_SPI_SpeedLow(); //设置到低速模式
delay_ms(1000); //SPI总线初始化延时一会再初始化SD卡
for(i=0; i<10; i++)SD_WriteByte(0XFF); //发送最少74个脉冲
retry=200;
do
{
r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态
}
while((r1!=0X01) && retry--);
UART_DebugPrintf(0,0,"Init_SDCard: CMD0 R1 = %d\n",r1);
Flag.SDCard=0;//默认无卡
if(r1==0X01)
{
if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0
{
for(i=0; i<4; i++)buf[i] = SD_ReadByte(); //Get trailing return value of R7 resp
if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V
{
retry=2000;
do
{
// SD_SendCmd(CMD55,0,0X01); //发送CMD55
// r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41
r1=SD_SendCmd(CMD1,0x40000000,0X01);//发送CMD1
}
while(r1&&retry--);
UART_DebugPrintf(0,0,"Init_SDCard: ACMD41 R1 = %d\n",r1);
if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始
{
for(i=0; i<4; i++)buf[i] = SD_ReadByte(); //得到OCR值
if(buf[0]&0x40)Flag.SDCard=SD_TYPE_V2HC; //检查CCS
else Flag.SDCard=SD_TYPE_V2;
}
}
}
else //SD V1.x/ MMC V3
{
// SD_SendCmd(CMD55,0,0X01); //发送CMD55
// r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41
r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1
if(r1<=1)
{
Flag.SDCard=SD_TYPE_V1;
retry=2000;
do //等待退出IDLE模式
{
// SD_SendCmd(CMD55,0,0X01); //发送CMD55
// r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41
r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1
}
while(r1&&retry--);
UART_DebugPrintf(0,0,"Init_SDCard: ACMD41 R1 = %d\n",r1);
}
else
{
Flag.SDCard=SD_TYPE_MMC;//MMC V3
retry=2000;
do //等待退出IDLE模式
{
r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1
}
while(r1&&retry--);
UART_DebugPrintf(0,0,"Init_SDCard: ACMD41 R1 = %d\n",r1);
}
if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)Flag.SDCard=SD_TYPE_ERR;//错误的卡
}
}
SD_DisSelect();//取消片选
SD_SPI_SpeedHigh();//SPI配置为高速模式
if (Flag.SDCard)
return UART_DebugPrintf(0,0,"Init_SDCard: SD Type = %d\n",Flag.SDCard);
else if(r1)
return UART_DebugPrintf(r1,0,"Init_SDCard: R1 Error! Ret = %d\n",r1);
return UART_DebugPrintf(0xaa,0,"Init_SDCard: Unknown Error");//其他错误
} |
|