STM32用cube配置FATFS模式下SPI读写SD卡
要求:掌握SD卡协议原理,用STM32F103 完成对SD卡的数据读取(FAT文件模式)
目录
- 一、SD卡与FATS
- 1、SD卡
- 2、FATFS文件系统
- 二、工程实现
- 1、编译运行
- 2、接线
- 3、初始化文件模式
- 4、烧录
- 5、实验结果
- 三、代码分析
- 四、实验感想
- 参考文献
一、SD卡与FATS
1、SD卡
(1)简介
SD 卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD卡进行读写通信操作一般有两种通信接口可选,一种是 SPI接口,另外一种就是 SDIO 接口。SDIO 全称是安全数字输入/输出接口,多媒体卡(MMC)、SD 卡、SD I/O 卡都有 SDIO 接口。SD I/O 卡本身不是用于存储的卡,它是指利用 SDIO 传输协议的一种外设。比如 Wi-Fi Card,它主要是提供 Wi-Fi功能,有些 Wi-Fi模块是使用串口或者 SPI接口进行通信的,但 Wi-Fi SDIO Card是使用 SDIO 接口进行通信的。
(2)操作模式
SD卡的操作模式:SD卡模式(SDIO)、SPI模式(默认为SD模式)。
其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。
SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根线。
CLK 时钟同步线
CMD 命令信号线,主机发出的命令以及从机对命令的响应都是通过这条线进行传输
DAT[3:0] 表示4条数据线,主机和从机的数据都是从这四条数据线上传输
(3)物理结构
一张 SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;电源检测单元 保证 SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;卡及接口控制单元 5个部分控制 SD卡的运行状态,它包括有 8个寄存器;接口驱动器控制 SD卡引脚的输入输出。
- SD卡功能框图如下
2、FATFS文件系统
FATFS是面向小型嵌入式系统的一种通用的FAT文件系统,它由ANSI C语言编写且完全独立于底层的I/O介质,因此它可以很容易的不加修改的移植到其他处理器当中,就可以利用文件系统的各种函数,对已格式化的SD卡的文件进行读写。
二、工程实现
因为能力有限,所以这次主要完成的是对于已经完成的工程的直接使用,并且在此基础上做出一点修改。 具体有关于工程的搭建,可以看这篇文章:
https://blog.csdn.net/qq_39758638/article/details/103573843
在这里放上工程的下载连接:
https://pan.baidu.com/s/1izzu14Zy2myHm2ZI4NFSGg
提取码:t11v
1、编译运行
打开下载的文件中的MDK-ARM文件夹,在其中可以找到工程文件,使用keil打开
编译运行,发现没有错误
2、接线
按下图方式接线
SD卡 | STM32 |
---|---|
CS | PA4 |
SCK | PA5 |
MISO | PA6 |
MISI | PA7 |
VCC | 5V |
GUN | GUN |
注意点:
- 供电需要是5V,最开始设置的供电是3.3V,但是实验没有成功,改成5V,才能够成功运行,所以可能是3.3V的供电不足
- 连接的杜邦线尽可能短,并且最好连线紧一点,就是这些细节很大程度上决定了你会不会成功
3、初始化文件模式
在正式开始烧录之前,要想初始化SD卡的,文件系统为FAT32
,然后点击开始
就可以完成
出现弹窗,然后点击确定
格式化成功
4、烧录
打开mcuisp文件,按照以下顺序进行烧录
- 搜索串口
- 选择刚才生成的hex文件
- 读取器件信息
- 开始编程
出现右侧的字样说明烧录成功
5、实验结果
打开串口调试助手,然后点击打开串口
如果右侧一直是mian的字样,尝试用手按紧接线试一试
发现串口收到了信息,显示SD卡初始化成功,挂载成功,打开成功,创建文件成功
使用读卡器读取SD卡,发现在文件夹中保存有一个文件HELLO.TXT
打开文件后,发现显示了一串字符,但是含有乱码
为了解决这个错误,对代码进行了修改,将main.c中的这两行注释掉
再次执行一遍以上的步骤,发现没有错误了
三、代码分析
主函数
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(" mian \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] +0;WriteBuffer[1] = WriteBuffer[1] +1;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 */
}
SD卡写入函数
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); //取消挂载}
四、实验感想
这次实验并不困难,但是很容易因为一些微小的操作不当导致出错。我在做实验时,也是重复了许多次,才终于成功,是一次宝贵的经验。
参考文献
https://blog.csdn.net/ZHONGCAI0901/article/details/113190393
STM32用cube配置FATFS模式下SPI读写SD卡相关推荐
- STM32利用SPI读写SD卡的程序详解
STM32利用SPI读写SD卡的一些程序详解 关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明. ...
- SPI模式下MCU对SD卡的控制及操作命令
一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...
- SPI读写SD卡速度有多快?
SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据.但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速.实时数据存储时可能会有影响.但具体速度 ...
- 使用STM32在SPI模式下读写SD卡
使用STM32在SPI模式下读写SD卡 代码分享 一.实验原理图 二.SD卡 三.实验操作 1.在stm32cubemx建立工程 2.根据上面的原理图连接硬件 3.keil编译和烧录 四.实验结果 总 ...
- 在STM32下完成对SD卡的数据读取
目录 一.SD卡介绍 二.SPI协议 三.操作过程 1.初始化 2.线路连接 3.修改代码 四.编译运行 五.结果演示 六.参考文献 一.SD卡介绍 SD存储卡是一种基于半导体快闪记忆器的新一代记 ...
- SPI方式读写SD卡速度有多快?
很久没有写公众号了,一方面忙,另一方面也不知道写些什么内容,大家如果有想了解的(前提是我也懂),可以后台发送给我. 今天主要来测试一下SPI读写SD卡的速度.SD卡是一个嵌入式中非常常用的外设,可以用 ...
- STM32开发板入门教程(十三) - SPI模式读写SD卡
功能介绍 :使用SPI模式 读写SD卡block数据 可通过串口发送到PC机查看 SD卡是Secure Digital Card卡的简称,直译成汉语就是"安全数字卡",是由日本松下 ...
- STM32CubeMX+SPI+FATFS读写SD卡
一.软件硬件说明 软件:STM32CubeMX V6.6.1 /KEIL5 V5.29 硬件:正点原子mini开发板,SD卡,通过SPI方式驱动SD卡,用的是SPI1接口 以上内容来源于正点原子min ...
- stm32 Fatfs 读写SD卡
源:stm32 Fatfs 读写SD卡 转载于:https://www.cnblogs.com/LittleTiger/p/4864052.html
最新文章
- DateTime时间的比较问题
- 很多人喜欢露脚踝你觉得时尚吗?
- python压缩文件
- 情人节:找一个程序员当老公的10大好处
- ObjectDataSource 如何传递查询参数
- 关于PCM音频数据的相关转换算法
- H3CIE(WLAN)学习笔记(4)——PHY层协议
- SReng日志扫描动画教程
- 27岁转行学python_零基础想转行学python,过来人提醒大家几点
- java中调用cmd命令被阻塞无法返回和继续执行
- 数据结构----二叉树
- 虚拟化开源技术有哪些_您使用哪些开源虚拟化工具?
- LaTeX Subfigure 中间添加垂直线
- c语言编程文章排版,一种简单英文词典排版系统的实现 C语言编程
- 利用matlab的interp1()对矩阵进行插值
- 利用Redis原子计数器incr实现计数器及接口限流
- excel数字排序1后面是2而不是10
- 如何区分一个FrameWork是动态链接库还是静态库
- 【CodeQL从入门到精通系列】01-CodeQL简介
- Android上调用百度人脸识别接口