【嵌入式20】STM32F103完成对SD卡的数据读取详细操作_stm32f103 sd卡

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2、上电延时(>74个CLK);

3、复位卡(CMD0),进入IDLE状态;

4、发送CMD8,检查是否支持2.0协议;

5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等);

6、取消片选,发多8个CLK,结束初始化

这样我们就完成了对SD卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。

6、SD卡读取与写入(SPI模式)

1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;

以上就是一个典型的读取SD卡数据过程,SD卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下:

1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;

以上就是一个典型的写SD卡过程。

三、实验操作

1、硬件准备

SD卡模块及SD卡
在这里插入图片描述
内部结构:
在这里插入图片描述

部分说明
控制接口共 6 个引脚(GND、VCC、MISO、MOSI、SCK、CS),GND 为地,VCC 为供 电电源,MISO、MOSI、SCK 为 SPI 总线,CS 为片选信号脚
3.3V 稳压电路LDO 稳压输出的 3.3V 为电平转换芯片、Micro SD 卡供电
电平转换电路往 Micro SD 卡方向的信号转换成 3.3V,MicroSD 卡往控制接口方向的 MISO 信号也转换成了 3.3V,一般 AVR 单片机系统都能读取该信号
Micro SD 卡座是自弹式卡座,方便卡的插拔
定位孔4 个 M2 螺丝定位孔,孔径为 2.2mm,使模块便于安装定位,实现模块间组合

2、连线

stm32SD卡模块
PA4SDCS
PA5SCK
PA7MOSI
PA6MISO
VCCVCC
GNDGND

在这里插入图片描述

3、HAL库配置

因为STM32要连接SD卡模块,所以我们要进行相应配置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之后导出即可。

4、代码分析

完整工程代码如下(hal库版本)
链接:https://pan.baidu.com/s/1YxLpaIM6HMQ4d_9yh4M4ww
提取码:276d

针对main主函数进行分析

int main(void)
{
  /\* USER CODE BEGIN 1 \*/
  /\* USER CODE END 1 \*/
  /\* MCU Configuration---------------------------------------------------\*/
  /\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
  HAL\_Init();
  /\* USER CODE BEGIN Init \*/
  /\* USER CODE END Init \*/
  /\* Configure the system clock \*/
  SystemClock\_Config();
  /\* USER CODE BEGIN SysInit \*/
  /\* USER CODE END SysInit \*/
  /\* Initialize all configured peripherals \*/
  MX\_GPIO\_Init();
  MX\_SPI1\_Init();
  MX\_FATFS\_Init();
  MX\_USART1\_UART\_Init();
  /\* USER CODE BEGIN 2 \*/
	HAL\_UART\_Receive\_IT(&huart1,&aRxBuffer1,1); 	//enable uart 
	printf(" main \r\n");
	Get\_SDCard\_Capacity();	//得到使用内存并选择格式化
  /\* USER CODE END 2 \*/
  /\* Infinite loop \*/
  /\* USER CODE BEGIN WHILE \*/
  while (1)
  {
		WritetoSD(WriteBuffer,sizeof(WriteBuffer));		
		HAL\_Delay(500);
		WriteBuffer[0] = WriteBuffer[0] +10;
		WriteBuffer[1] = WriteBuffer[1] +10;
		write_cnt ++;
		while(write_cnt > 10)
		{	
			printf(" while \r\n");
			HAL\_Delay(500);
		}		
    /\* USER CODE END WHILE \*/
    /\* USER CODE BEGIN 3 \*/
  }
  /\* USER CODE END 3 \*/
}


说明:
在这里插入图片描述
在这里插入图片描述
这里我们看下write_cnt初始定义的值,计算写入次数循环要求。
(在main.c文件头部)
从0开始,write_cnt=0,因此要写入超过11次,之后不再写入内容。在这里插入图片描述
写入函数WritetoSD

void WritetoSD(BYTE write_buff[],uint8\_t bufSize)
{
	FATFS fs;
	FIL file;
	uint8\_t res=0;
	UINT Bw;	
	res = SD\_init();		//SD卡初始化
	if(res == 1)
	{
		printf("SD卡初始化失败! \r\n");		
	}
	else
	{
		printf("SD卡初始化成功! \r\n");		
	}
	res=f\_mount(&fs,"0:",1);		//挂载
// if(test\_sd == 0) //用于测试格式化
	if(res == FR_NO_FILESYSTEM)		//没有文件系统,格式化
	{
// test\_sd =1; //用于测试格式化
		printf("没有文件系统! \r\n");		
		res = f\_mkfs("", 0, 0);		//格式化sd卡
		if(res == FR_OK)
		{
			printf("格式化成功! \r\n");		
			res = f\_mount(NULL,"0:",1); 		//格式化后先取消挂载
			res = f\_mount(&fs,"0:",1);			//重新挂载 
			if(res == FR_OK)
			{
				printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");
			}	
		}
		else
		{
			printf("格式化失败! \r\n");		
		}
	}
	else if(res == FR_OK)
	{
		printf("挂载成功! \r\n");		
	}
	else
	{
		printf("挂载失败! \r\n");
	}	
	res = f\_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);
	if((res & FR_DENIED) == FR_DENIED)
	{
		printf("卡存储已满,写入失败!\r\n");		
	}
	f\_lseek(&file, f\_size(&file));//确保写词写入不会覆盖之前的数据
	if(res == FR_OK)
	{
		printf("打开成功/创建文件成功! \r\n");		
		res = f\_write(&file,write_buff,bufSize,&Bw);		//写数据到SD卡
		if(res == FR_OK)
		{
			printf("文件写入成功! \r\n");			
		}
		else
		{
			printf("文件写入失败! \r\n");
		}		
	}
	else
	{
		printf("打开文件失败!\r\n");
	}	
	f\_close(&file);						//关闭文件 
	f\_mount(NULL,"0:",1);		 //取消挂载
}

从写入函数中,我们可以知道,针对SD卡文件的每个步骤,我们都进行了相应的字段输出,来具体判断究竟进行到了什么地步。

5、实验结果分析

最开始,要么初始化失败,要么没反应,要么初始化成功之后没反应,各种情况吧。
在这里插入图片描述
之后改变了接线电压,SD卡模块接5v,STM32也接了5v,还是失败。
然后重新接线,换成了新的杜邦线,然后就成功了,只能说这个实验很玄学
在这里插入图片描述

就很秃然
在这里插入图片描述
然后打开sd卡确实看到了hello文本文件写入了内容。
这里有两个情况
我最开始在SD卡下建立了hello.txt文件(里面最开始写了数字1),因为担心初始化不成功,然后SD卡写入成功后,SD卡内容是这样的:

在这里插入图片描述
之后,我把hello.txt文件删了,看看SD卡能不能自己建立一个txt文本文件:
在这里插入图片描述
果然是成功的,而且内容是一样的。

但是左侧出现了乱码情况,因此对主函数进行修改
在这里插入图片描述
再烧录一次试试
在这里插入图片描述
有序写入,说明是成功的。

然后分析一下串口收到的内容:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以证明,确实写入次数超过11次后,会不断返回while值,而txt文本里有11行内容,之后也不会再写入了。

四、SD卡累计写入及速率分析

1、题目要求

在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。

2、硬件准备

闪迪16GB的SD卡(下图介绍了市面产品的读写测试数据)
在这里插入图片描述
SD卡模块
资料下载:https://pan.baidu.com/s/1WJZ3NpnaxqubPRC3XNLy1Q 提取码:6bsu
单片机采用STM32F103C8T6最小核心板

在这里插入图片描述
接线
在这里插入图片描述

3、实验操作

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

验操作

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
[外链图片转存中…(img-E03M241o-1715708638361)]
[外链图片转存中…(img-R2lDD2Y7-1715708638362)]

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值