STM32F407使用SPI读写SD TF卡(不能读取 会卡死)

问题描述:
使用spi的TF卡模块,卡为京东联名的32g的HC卡,使用核心板外接模块,发现前面的初始和卡的检验可以通过,但读取不到扇区数,也不能读取扇区0,读取会卡死。核对了软硬件都毫无头绪,同样的代码在另一块407的带sd卡槽的板子上是读写没问题的。

解决:
由于使用的核心板和拓展模块,所以之间使用了不短的杜邦线,所以我怀疑是干扰,而且显然前面400k以下的速率设置和校验是没问题的,所以我怀疑是后面的高速模式才有问题。本着频率越低,越能抗干扰的朴素科学观。修改<400k初始化化之后切换为高速模式,如下位置(倒数第五行的SD_SPI_SpeedHigh();//高速)

u8 SD_Initialize(void)
{
    u8 r1;      // 存放SD卡的返回值
    u16 retry;  // 用来进行超时计数
    u8 buf[4];  
	u16 i;

	SD_SPI_Init();		//初始化IO
 	SD_SPI_SpeedLow();	//设置到低速模式 
 	for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲 一个FF就是大于8个脉冲 这里大于80个脉冲了
	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;//其他错误
}

进入这个函数,修改慢一点,修改为1/4,之前是1/2(SPI_SPEED_2)。

//SD卡正常工作的时候,可以高速了
void SD_SPI_SpeedHigh(void)
{
 	SPI1_SetSpeed(SPI_SPEED_4);//设置到高速模式	
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
STM32F407是一款常用的嵌入式微控制器,具有较强的处理能力和丰富的外设资源,用于驱动TF可以通过SPI接口实现。 驱动TF首先需要对SPI接口进行配置。首先,需要使能SPI钟,并设置合适的分频系数。然后,配置SPI模式、数据位大小、数据传输顺序等参数。接下来,需要配置GPIO引脚,将其设置为SPI功能,并设置合适的速度。最后,使能SPI外设,使SPI接口开始工作。 在实际的操作中,可以通过读取和写入SPI的寄存器来进行数据传输。对于读取TF的数据,可以发送读命令和地址,然后等待TF的响应,并读取其返回的数据。对于写入TF的数据,可以发送写命令和地址,然后将数据发送给TF。 在TF驱动中,还需要处理TF的初始化和操作错误等问题。对于TF的初始化,可以发送初始化命令和参数,使TF进入正常工作状态。在数据传输过程中,还需要处理TF返回的状态信息,以判断是否发生了错误。如果出现错误,可以重新发送命令或进行相应的错误处理。 除了基本的读写操作,TF驱动还可以提供更高层次的文件系统接口,使用户可以方便地读取和写入TF上的文件。通过提供文件的打开、关闭、读写等函数,可以使用户能够像操作普通文件一样操作TF中的数据。 总之,STM32F407可以通过SPI接口驱动TF,需要配置SPI接口和GPIO引脚,使用SPI的寄存器进行数据传输,处理TF的初始化和错误等问题。通过提供文件系统接口,可以方便地操作TF上的文件。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值