/****************************************
*函数名称:SD_Initialize
*输 入:无
*输 出:0 -成功
其他 -失败
*功 能:SD 卡初始化
******************************************/
UINT8 SD_Initialize(VOID)
{
UINT8 r1; // 存放 SD 卡的返回值
UINT16 retry; // 用来进行超时计数
UINT8 buf[4];
UINT32 i;
/* 初始化 IO */
SD_SPI_Init();
/* 设置到低速模式 */
SD_SPI_SpeedLow();
for(i=0;i<10;i++)
{
/* 发送最少 74 个时钟 */
SD_SPI_ReadWriteByte(0XFF);
}
retry=20;
do
{
/* 进入 IDLE 状态 */
r1=SD_SendCmd(CMD0,0,0x95);
}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);
}
/* 卡是否支持 2.7~3.6V */
if(buf[2]==0X01&&buf[3]==0XAA)
{
retry=0XFFFE;
do
{
/* 发送 CMD55 */
SD_SendCmd(CMD55,0,0X01);
/* 发送 CMD41 */
r1=SD_SendCmd(CMD41,0x40000000,0X01);
}while(r1&&retry--);
/* 鉴别 SD2.0 卡版本开始 */
if(retry&&SD_SendCmd(CMD58,0,0X01)==0)
{
for(i=0;i<4;i++)
{
/* 得到 OCR 值 */
buf[i]=SD_SPI_ReadWriteByte(0XFF);
}
/* 检查 CCS */
if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;
else SD_Type=SD_TYPE_V2;
}
}
}
else//SD V1.x/ MMC V3
{
/* 发送 CMD55 */
SD_SendCmd(CMD55,0,0X01);
/* 发送 CMD41 */
r1=SD_SendCmd(CMD41,0,0X01);
if(r1<=1)
{
SD_Type=SD_TYPE_V1;
retry=0XFFFE;
do //等待退出 IDLE 模式
{
/* 发送 CMD55 */
SD_SendCmd(CMD55,0,0X01);
/* 发送 CMD41 */
r1=SD_SendCmd(CMD41,0,0X01);
}while(r1&&retry--);
}
else//MMC 卡不支持 CMD55+CMD41 识别
{
/* MMC V3 */
SD_Type=SD_TYPE_MMC;
retry=0XFFFE;
/* 等待退出 IDLE 模式 */
do
{
/* 发送 CMD1 */
r1=SD_SendCmd(CMD1,0,0X01);
}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;
if(r1) return r1;
/* 其他错误 */
return 0xAA;
}
|