要求:掌握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卡相关推荐

  1. STM32利用SPI读写SD卡的程序详解

    STM32利用SPI读写SD卡的一些程序详解 关于SD卡的基础知识这里不做过多陈述,如果有对这方面感兴趣的朋友可以直接百度一下,有很多讲SD卡的文章,这里主要是针对SD卡的读写程序实现做一些详细说明. ...

  2. SPI模式下MCU对SD卡的控制及操作命令

    一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...

  3. SPI读写SD卡速度有多快?

    SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据.但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速.实时数据存储时可能会有影响.但具体速度 ...

  4. 使用STM32在SPI模式下读写SD卡

    使用STM32在SPI模式下读写SD卡 代码分享 一.实验原理图 二.SD卡 三.实验操作 1.在stm32cubemx建立工程 2.根据上面的原理图连接硬件 3.keil编译和烧录 四.实验结果 总 ...

  5. 在STM32下完成对SD卡的数据读取

    目录 一.SD卡介绍 二.SPI协议 三.操作过程 1.初始化 2.线路连接 3.修改代码 四.编译运行 五.结果演示 ​ 六.参考文献 一.SD卡介绍 SD存储卡是一种基于半导体快闪记忆器的新一代记 ...

  6. SPI方式读写SD卡速度有多快?

    很久没有写公众号了,一方面忙,另一方面也不知道写些什么内容,大家如果有想了解的(前提是我也懂),可以后台发送给我. 今天主要来测试一下SPI读写SD卡的速度.SD卡是一个嵌入式中非常常用的外设,可以用 ...

  7. STM32开发板入门教程(十三) - SPI模式读写SD卡

    功能介绍 :使用SPI模式 读写SD卡block数据 可通过串口发送到PC机查看 SD卡是Secure Digital Card卡的简称,直译成汉语就是"安全数字卡",是由日本松下 ...

  8. STM32CubeMX+SPI+FATFS读写SD卡

    一.软件硬件说明 软件:STM32CubeMX V6.6.1 /KEIL5 V5.29 硬件:正点原子mini开发板,SD卡,通过SPI方式驱动SD卡,用的是SPI1接口 以上内容来源于正点原子min ...

  9. stm32 Fatfs 读写SD卡

    源:stm32 Fatfs 读写SD卡 转载于:https://www.cnblogs.com/LittleTiger/p/4864052.html

最新文章

  1. DateTime时间的比较问题
  2. 很多人喜欢露脚踝你觉得时尚吗?
  3. python压缩文件
  4. 情人节:找一个程序员当老公的10大好处
  5. ObjectDataSource 如何传递查询参数
  6. 关于PCM音频数据的相关转换算法
  7. H3CIE(WLAN)学习笔记(4)——PHY层协议
  8. SReng日志扫描动画教程
  9. 27岁转行学python_零基础想转行学python,过来人提醒大家几点
  10. java中调用cmd命令被阻塞无法返回和继续执行
  11. 数据结构----二叉树
  12. 虚拟化开源技术有哪些_您使用哪些开源虚拟化工具?
  13. LaTeX Subfigure 中间添加垂直线
  14. c语言编程文章排版,一种简单英文词典排版系统的实现 C语言编程
  15. 利用matlab的interp1()对矩阵进行插值
  16. 利用Redis原子计数器incr实现计数器及接口限流
  17. excel数字排序1后面是2而不是10
  18. 如何区分一个FrameWork是动态链接库还是静态库
  19. 【CodeQL从入门到精通系列】01-CodeQL简介
  20. Android上调用百度人脸识别接口

热门文章

  1. Python爬虫爬取智联招聘(进阶版)
  2. 对项目成本和进度的监控----挣值分析
  3. LibFuzzer学习(一):轻松找到心脏出血漏洞
  4. 华严数字体系--说说不可说
  5. i am freshman
  6. 地图裁剪器,可以将图片裁剪成瓦片数据,主要用途是将高清卫星图像裁剪成瓦片图,可以做离线地图的开发,基于墨卡托坐标
  7. 界面仅允许扫码枪录入禁止手工键盘输入
  8. c#黑白棋算法_黑白棋C#源代码
  9. 高德开放平台天气查询API
  10. Fiddler+Appium+Pycharm无限随机下载抖音视频