在线时间14 小时
UID3235530
注册时间2016-1-8
NXP金币0
该用户从未签到
注册会员

- 积分
- 80
- 最后登录
- 2019-9-30
|

楼主 |
发表于 2016-1-22 10:52:29
|
显示全部楼层
这上面的是可以正常进行的,
但是SD init老是失败,返回255
//初始化SD卡
uint8_t SD_Initialize(void)
{
uint8_t r1; // 存放SD卡的返回值
uint16_t retry; // 用来进行超时计数
uint8_t buf[4];
uint16_t i;
SD_SPI_Init(); //初始化IO
SD_SPI_SpeedLow(); //设置到低速模式
for(i=0; i<10; i++)
SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲
retry = 20;
do
{
r1 = SD_SendCmd(CMD0, 0, 0x95);//进入IDLE状态
}while((r1 != 0X01) && retry--);
SD_Type = 0;//默认无卡
if(r1 == 0X01)
{
if(SD_SendCmd(CMD8, 0x1AA, 0x87) == 1)//SD V2.0
{
for(i = 0;i < 4; i++)
buf[i] = SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 resp
if(buf[2] == 0X01&&buf[3] == 0XAA)//卡是否支持2.7~3.6V
{
retry=0XFFFE;
do
{
SD_SendCmd(CMD55, 0, 0X01); //发送CMD55
r1 = SD_SendCmd(CMD41, 0x40000000, 0X01);//发送CMD41
}while(r1&&retry--);
if(retry&&SD_SendCmd(CMD58, 0, 0X01) == 0)//鉴别SD2.0卡版本开始
{
for(i=0; i<4; i++)
buf[i]=SD_SPI_ReadWriteByte(0XFF);//得到OCR值
if(buf[0]&0x40)
SD_Type = SD_TYPE_V2HC; //检查CCS
else
SD_Type = SD_TYPE_V2;
}
}
}
else//SD V1.x/ MMC V3
{
SD_SendCmd(CMD55, 0, 0X01); //发送CMD55
r1=SD_SendCmd(CMD41, 0, 0X01); //发送CMD41
if(r1 <= 1)
{
SD_Type = SD_TYPE_V1;
retry = 0XFFFE;
do //等待退出IDLE模式
{
SD_SendCmd(CMD55, 0, 0X01); //发送CMD55
r1 = SD_SendCmd(CMD41, 0, 0X01);//发送CMD41
}while(r1&&retry--);
}
else//MMC卡不支持CMD55+CMD41识别
{
SD_Type = SD_TYPE_MMC;//MMC V3
retry = 0XFFFE;
do //等待退出IDLE模式
{
r1 = SD_SendCmd(CMD1, 0, 0X01);//发送CMD1
}while(r1&&retry--);
}
if(retry==0 || SD_SendCmd(CMD16, 512, 0X01) != 0)
SD_Type = SD_TYPE_ERR;//错误的卡
}
}
SD_DisSelect();//取消片选
SD_SPI_SpeedHigh();//高速
if(SD_Type)
return 0;
else if(r1)
return r1;
return 0xaa;//其他错误
} |
|