基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取

文章内容
掌握 SD 卡协议原理,用 STM32F103 完成对 SD 卡的数据读取(FAT文件模式)。

目录

  • 1 SD 卡协议
    • 1.1 何为 SD 卡
    • 1.2 SD 卡总线
    • 1.3 SD 总线协议
      • 1.3.1 SD 总线---命令
      • 1.3.2 SD 总线---响应
    • 1.4 STM32 的 SDIO 功能
  • 2 基于 STM32F103 实现在 FATFS 模式下对 SD 卡的数据读取
    • 2.1 准备工具
    • 2.2 创建项目
    • 2.3 代码文件
    • 2.4 电路连接
    • 2.4 效果
  • 3 总结
  • 4 参考资料

1 SD 卡协议

1.1 何为 SD 卡

SD 卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD 卡进行读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口

  • SDIO 全称是安全数字输入/输出接口,多媒体卡(MMC)、SD 卡、SD I/O 卡都有 SDIO 接口。
  • STM32F10x 系列控制器有一个 SDIO 主机接口,它可以与 MMC 卡、SD 卡、SD I/O 卡以及CE-ATA 设备进行数据传输。MMC 卡可以说是 SD 卡的前身,现阶段已经用得很少。
  • SD I/O 卡本身不是用于存储的卡,它是指利用 SDIO 传输协议的一种外设。比如 Wi-Fi Card,它主要是提供 Wi-Fi 功能,有些 Wi-Fi 模块是使用串口或者 SPI 接口进行通信的,但 Wi-Fi SDIO Card 是使用 SDIO 接口进行通信的。并且一般设计 SD I/O 卡是可以插入到 SD 的插槽。
  • CE-ATA 是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第1张图片
    STM32F42x 系列控制器只支持 SD 卡规范版本 2.0,即只支持标准容量 SD 和高容量 SDHC 标准卡,不支持超大容量 SDXC 标准卡,所以可以支持的最高卡容量是 32GB。

1.2 SD 卡总线

SD 卡一般都支持 SDIO 和 SPI 这两种接口。
STM32F42x 系列控制器的 SDIO 是不支持 SPI 通信模式的,如果需要用到 SPI 通信只能使用 SPI 外设

具体的 SPI 通信方式可以参看我之前的博客:基于 SPI 协议用 0.96 寸 OLED 显示汉字及温湿度数据

  • SD 卡使用 9-pin 接口通信,其中 3 根电源线、1 根时钟线、1 根命令线和 4 根数据线。
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第2张图片
  • SDIO 的通信时序要简单许多,SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效。

1.3 SD 总线协议

SD 总线通信是基于 命令 和 数据 传输的

  • 通讯由一个起始位(“0”),由一个停止位(“1”)终止。SD 通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。
    SD 总线的基本交互是命令响应交互。
  • SD 数据是以块(Black)形式传输的,SDHC 卡数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。数据块需要 CRC 位来保证数据传输成功。CRC 位由 SD 卡系统硬件生成。STM32 控制器可以控制使用单线或 4 线传输。
    主机向 SD 卡写入数据块操作示意如下:
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第3张图片

1.3.1 SD 总线—命令

SD 命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与 SD 主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。

  • SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第4张图片

1.3.2 SD 总线—响应

响应由 SD 卡向主机发出,部分命令要求 SD 卡作出响应,这些响应多用于反馈 SD 卡的状态。

  • SDIO 总共有 7 个响应类型(代号:R1~R7),其中 SD 卡没有 R4、R5 类型响应。特定的命令对应有特定的响应类型,比如当主机发送 CMD3 命令时,可以得到响应 R6。与命令一样,SD 卡的响应也是通过 CMD 线连续传输的。根据响应内容大小可以分为短响应和长响应。短响应是 48bit 长度,只有 R2 类型是长响应,其长度为 136bit。

1.4 STM32 的 SDIO 功能

STM32 控制器有一个 SDIO,由两部分组成:SDIO 适配器AHB 接口
基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第5张图片

  • SDIO 适配器提供 SDIO 主机功能,可以提供 SD 时钟、发送命令和进行数据传输。
  • AHB 接口用于控制器访问 SDIO 适配器寄存器并且可以产生中断和 DMA 请求信号。

2 基于 STM32F103 实现在 FATFS 模式下对 SD 卡的数据读取

2.1 准备工具

  • STM32CubeMX

  • Keil 5

  • 串口传输助手

2.2 创建项目

打开 CubeMX,创建形工程,选择 STM32F103C8T6 芯片。

  • 配置SYS
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第6张图片

  • 配置 SPI1
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第7张图片

  • 配置 GPIO
    配置 PA4 引脚为 GPIO_Output,并命名为 SD_CS
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第8张图片

  • 配置 FATFS
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第9张图片

  • 配置串口 USART1
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第10张图片

  • 配置时钟
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第11张图片

  • 配置堆栈
    修改堆栈大小
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第12张图片

  • 生成工程
    为文件命名,选择 MDK-ARM,生成工程
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第13张图片

2.3 代码文件

工程文件里面需要进行移植修改等操作,
具体代码详见该博客的工程文件源码:STM32用cube配置FATFS模式下SPI读写SD卡

2.4 电路连接

STM32F103C8T6 SD卡
PA4 CS
PA5 SCK
PA6 MISO
PA7 MOSI

电路连接实物图如下:
基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第14张图片

2.4 效果

编译烧录后,打开串口调试助手,可以看到:
基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第15张图片

注意
SD 卡操作需要时间,得等一会,如果串口一直没有回应,可以试试以下操作:

  1. 可以将SD卡换成内存小点的 4G/8G
  2. 将最小核心板连接 5V,为其供给高电压
  3. 尽量减少连线,或者使用短线连接
  • 直接打开 U 盘,可见U 盘里存入了一个 HELLO.TXT 文件
    基于 STM32F103 在 FATFS 模式下对 SD 卡的数据读取_第16张图片

3 总结

在掌握 SD 卡协议的原理之后,实现对 SD 卡的数据读写的操作就比较容易了。但是这次项目效果不容易出来,我试了很多次,在尝试了更换高电压电源之后,才慢慢有了结果,这可能和 SD 卡内存大小或者工程代码有关系,还是要有耐心。

4 参考资料

STM32用cube配置FATFS模式下SPI读写SD卡

你可能感兴趣的:(stm32,stm32)