TI中文支持网
TI专业的中文技术问题搜集分享网站

【求助】MSP430F5529移植FATfs读写TF卡的问题

我使用的是TI的开发板MSP-EXP430F5529LP,软件是CCS5.4。

在初始化金士顿Micro SDHC 8G CLASS4的卡时,发送CMD0得到相应,再发送CMD8也得到响应。但是当我发送CMD55+ACMD41时,第一次CMD55返回0x01,第二次CMD55却返回了0xff,导致初始化失败,请问我该如何解决这个问题?

我的代码如下,请大神帮帮我,谢谢!

u8 SD_Init(void)
{u8 r1;// 存放SD卡的返回值u16 retry;  // 用来进行超时计数u8 buff[6];
	SPIx_Init(); 
	P4OUT|=BIT0;
	//P5OUT|=BIT5;if(SD_Idle_Sta()) return 1;//超时返回1 设置到idle 模式失败//-----------------SD卡复位到idle结束-----------------//获取卡片的SD版本信息P4OUT&=~BIT0;//P5OUT&=~BIT5;
	r1 = SD_SendCommand_NoDeassert(8, 0x1aa,0x87);//如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化if(r1 == 0x05){//设置卡类型为SDV1.0,如果后面检测到为MMC卡,再修改为MMCSD_Type = SD_TYPE_V1;//如果是V1.0卡,CMD8指令后没有后续数据//片选置高,结束本次命令P4OUT|=BIT0;//P5OUT|=BIT5;//多发8个CLK,让SD结束后续操作SPIx_ReadWriteByte(0xFF);//-----------------SD卡、MMC卡初始化开始-----------------//发卡初始化指令CMD55+ACMD41// 如果有应答,说明是SD卡,且初始化完成// 没有回应,说明是MMC卡,额外进行相应初始化retry = 0;do{	//do	//{	//	r1 = SD_SendCommand(CMD1, 0, 0);	//}while(r1!=0x00);//先发CMD55,应返回0x01;否则出错r1 = SD_SendCommand(CMD55, 0, 0);if(r1 == 0XFF)return r1;//只要不是0xff,就接着发送//得到正确响应后,发ACMD41,应得到返回值0x00,否则重试200次r1 = SD_SendCommand(ACMD41, 0, 0);retry++;}while((r1!=0x00) && (retry<400));// 判断是超时还是得到正确回应// 若有回应:是SD卡;没有回应:是MMC卡//----------MMC卡额外初始化操作开始------------if(retry==400){retry = 0;//发送MMC卡初始化命令(没有测试)do{r1 = SD_SendCommand(1,0,0);retry++;}while((r1!=0x00)&& (retry<400));if(retry==400)return 1;//MMC卡初始化超时//写入卡类型SD_Type = SD_TYPE_MMC;}//----------MMC卡额外初始化操作结束------------
		SPIx_ReadWriteByte(0xFF);//禁止CRC校验
		r1 = SD_SendCommand(CMD59, 0, 0x95);if(r1 != 0x00)return r1;  //命令错误,返回r1//设置Sector Sizer1 = SD_SendCommand(CMD16, 512, 0x95);if(r1 != 0x00)return r1;//命令错误,返回r1//-----------------SD卡、MMC卡初始化结束-----------------}//SD卡为V1.0版本的初始化结束//下面是V2.0卡的初始化//其中需要读取OCR数据,判断是SD2.0还是SD2.0HC卡else if(r1 == 0x01){//V2.0的卡,CMD8命令后会传回4字节的数据,要跳过再结束本命令buff[0] = SPIx_ReadWriteByte(0xFF);  //should be 0x00buff[1] = SPIx_ReadWriteByte(0xFF);  //should be 0x00buff[2] = SPIx_ReadWriteByte(0xFF);  //should be 0x01buff[3] = SPIx_ReadWriteByte(0xFF);  //should be 0xAAP4OUT|=BIT0;//P5OUT|=BIT5;SPIx_ReadWriteByte(0xFF);//the next 8 clocks//判断该卡是否支持2.7V-3.6V的电压范围//if(buff[2]==0x01 && buff[3]==0xAA) //不判断,让其支持的卡更多{retry = 0;//发卡初始化指令CMD55+ACMD41		do		{			/*do{r1 = SD_SendCommand(1,0,0);retry++;}while((r1!=0x00)&& (retry<400));*/			r1 = SD_SendCommand(CMD55, 0, 0);			if(r1!=0x01)return r1;			r1 = SD_SendCommand(ACMD41, 0x40000000, 0);if(retry>200)return r1;  //超时则返回r1状态}while(r1!=0);//初始化指令发送完成,接下来获取OCR信息//-----------鉴别SD2.0卡版本开始-----------r1 = SD_SendCommand_NoDeassert(CMD58, 0, 0);if(r1!=0x00)
			{	P4OUT|=BIT0;//释放SD片选信号	//P5OUT|=BIT5;//释放SD片选信号
				return r1;  //如果命令没有返回正确应答,直接退出,返回应答	 
			}//读OCR指令发出后,紧接着是4字节的OCR信息buff[0] = SPIx_ReadWriteByte(0xFF);buff[1] = SPIx_ReadWriteByte(0xFF);buff[2] = SPIx_ReadWriteByte(0xFF);buff[3] = SPIx_ReadWriteByte(0xFF);//OCR接收完成,片选置高P4OUT|=BIT0;//P5OUT|=BIT5;SPIx_ReadWriteByte(0xFF);//检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC//如果CCS=1:SDHCCCS=0:SD2.0if(buff[0]&0x40)SD_Type = SD_TYPE_V2HC;//检查CCSelse SD_Type = SD_TYPE_V2;//-----------鉴别SD2.0卡版本结束-----------}}return r1;
}	 								
Andy He:

回复 Stephen Zhou:

您好,

如要验证, 用好的TF就可以正常了, 是吗?

Thanks

灰小子:

回复 Stephen Zhou:

感谢分享经验

lf w1:

你好,我现在也在弄读写TF卡,用的是MSP430F5342,程序和上面的看起来差不多,我发CMD0、CMD55、ACMD41返回值没错;不过发CMD8时,V1.x的卡返回0xFF,V2.0的卡返回0x01;2.0的卡前几个命令没错,但发到CMD58时出错了,返回0xFF。我还有一个F149的开发板,SD卡能读写,但SDHC卡也一样,也是在CMD58那返回0xFF,请问我该怎么解决,求指教!

赞(0)
未经允许不得转载:TI中文支持网 » 【求助】MSP430F5529移植FATfs读写TF卡的问题
分享到: 更多 (0)