/* 检测是 SDHC 卡还是 SD 卡 */
i = 0;
while(SD_WriteCmd(SD_CMD58, 0, 0x01) != 0)
{
i++;
if(i > 100)
{
SD_TYPE = SD_TYPE_ERR;
break;
}
}
/* 读取 OCR */
for(i=0; i<4; i++)
{
buf = SPI2_WriteReadData(0xFF);
}
if(buf[0] & 0x40)
{
SD_TYPE = SD_TYPE_V2HC;
}
else
{
SD_TYPE = SD_TYPE_V2;
}
}
else //否则就是 SD V1.0 或者 MMC V3
{
SD_WriteCmd(SD_CMD55, 0x00, 0x01);
r1 = SD_WriteCmd(SD_CMD41, 0x00, 0x01);
if(r1 <= 1) //对 CMD41 有回应说明是 SD V1.0
{
SD_TYPE = SD_TYPE_V1; //是 V1.0 卡
i = 0;
do
{
if(i > 100)
{
return 0xFF;
}
SD_WriteCmd(SD_CMD55, 0x00, 0x01);
r1 = SD_WriteCmd(SD_CMD41, 0x00, 0x01);
}
while(r1 != 0);
}
else //没有回应说明是 MMC V3
{
SD_TYPE = SD_TYPE_MMC; //卡类型是 MMC 卡
i = 0;
while(SD_WriteCmd(SD_CMD1, 0, 0x01) != 0)
{
i++;
if(i > 100)
{
return 0xFF;
}
}
}
}
SD_CS_SET; //取消片选
SPI2_WriteReadData(0xFF);
return 0;
}
以上代码是对 MMC 卡的初始化。
|