|
发表于 2011-1-7 22:16:45
|
显示全部楼层
/*******************************************************************************
* Function Name : SD_Init
* Description : 初始化SD卡
* Input : None
* Output : None
* Return : u8
* 0:NO_ERR
* 1:TIME_OUT
* 99:NO_CARD
*******************************************************************************/
u8 SD_Init(void)
{
u16 i ;
// 用来循环计数
u8 r1 ;
// 存放SD卡的返回值
u16 retry ;
// 用来进行超时计数
u8 buff[6];
//如果没有检测到卡插入,直接退出,返回错误标志
// if(!SD_DET())
// {
// //return 99;
// return STA_NODISK ;
// // FatFS错误标志:没有插入磁盘
// }
//SD卡上电
//SD_PWR_ON();
// 纯延时,等待SD卡上电完成
// for(i=0;i<0xf00;i++);
//先产生>74个脉冲,让SD卡自己初始化完成
for(i=0;i<10;i++)
{
SPI_ReadWriteByte(0xFF);
}
//-----------------SD卡复位到idle开始-----------------
//循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态
//超时则直接退出
retry=0 ;
do
{
//发送CMD0,让SD卡进入IDLE状态
r1=SD_SendCommand(CMD0,0,0x95);
retry++;
}
while((r1!=0x01)&&(retry<200));
//跳出循环后,检查原因:初始化成功?or 重试超时?
if(retry==200)
{
return 1 ;
//超时返回1
}
//-----------------SD卡复位到idle结束-----------------
//获取卡片的SD版本信息
r1=SD_SendCommand_NoDeassert(8,0x1aa,0x87);
//如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化
if(r1==0x05)
{
//设置卡类型为SDV1.0,如果后面检测到为MMC卡,再修改为MMC
SD_Type=SD_TYPE_V1 ;
//如果是V1.0卡,CMD8指令后没有后续数据
//片选置高,结束本次命令
SD_CS_DISABLE();
//多发8个CLK,让SD结束后续操作
SPI_ReadWriteByte(0xFF);
//-----------------SD卡、MMC卡初始化开始-----------------
//发卡初始化指令CMD55+ACMD41
// 如果有应答,说明是SD卡,且初始化完成
// 没有回应,说明是MMC卡,额外进行相应初始化
retry=0 ;
do
{
//先发CMD55,应返回0x01;否则出错
r1=SD_SendCommand(CMD55,0,0);
if(r1!=0x01)
{
return r1 ;
}
//得到正确响应后,发ACMD41,应得到返回值0x00,否则重试200次
r1=SD_SendCommand(ACMD41,0,0);
retry++;
}
while((r1!=0x00)&&(retry<400));
// 判断是超时还是得到正确回应
// 若有回应:是SD卡;没有回应:是MMC卡
//----------MMC卡额外初始化操作开始------------
我用的KINGSTON的卡 前面几个写命令都正常SD_SendCommand(CMD0,0,0x95); SD_SendCommand_NoDeassert(8,0x1aa,0x87);
但到了这个SD_SendCommand(CMD55,0,0); 就不正常了. 用逻辑分析仪把数据采集了分析数据发现 CMD55的命令正常应该是输出55 但程序里面输出的是77 后面就跳出初始化了. 请高手解答 |
|