STM32——SD卡和FATFS文件系统

最近看了32的sd卡和FATFS文件系统,现在就自己的理解总结一下。

一、SD卡模块

  1. SD 卡:安全数码卡, 它是在 MMC 的基础上发展而来, 是一种基于半导体快闪记忆器的新一代记忆设备。按容量分类,可以将SD 卡分为 3 类: SD 卡、 SDHC 卡、 SDXC 卡。SD卡(SDSC):0~2G    SDHC卡:2~32G  SDXC卡:32G~2T。
  2. SD 卡一般支持 2 种操作模式:
  •   SD 卡模式(通过 SDIO 通信):允许 4 线的高速数据传输,只能使用 3.3V 的 IO 电平,所以, MCU 一定要能够支持 3.3V 的 IO 端口输出。
  •  SPI 模式:同 SD 卡模式相比就是丧失了速度,在 SPI 模式下, CS/MOSI/MISO/CLK 都需要加 10~100K 左右的上拉电阻。

SD卡引脚功能表:

针脚       1    2   3    4   5   6    7   8    9
SD卡模式 CD/DAT3 CMD VSS VCC CLK VSS DAT0 DAT1 DAT2
SPI模式     CS MOSI VSS VCC CLK VSS MISO  NC   NC

      3.SD卡的5个寄存器:

名称 宽度 描述
CID 128
卡标识寄存器
 
RCA 16 相对卡地址寄存器:本地系统中卡的地址,动态变化,在卡的初始化时确定。(SPI模式中没有)
CSD 128 卡描述数据寄存器:卡操作条件相关的信息数据。
SCR 64 SD配置寄存器:SD卡特定信息数据
OCR 32 操作条件寄存器

4.SD卡初始化过程(知道 SD 卡的类型V1、 V2、 V2HC 或者 MMC):

  • 初始化与 SD 卡连接的硬件条件(MCU 的 SPI 配置, IO 口配置);
  • 上电延时(>74 个 CLK)(因为 SD 卡内部有个供电电压上升时间,大概为 64 个 CLK,剩下的 10 个 CLK 用于 SD 卡同步,之后才能开始 CMD0 的操作);
  • 复位卡(CMD0),进入 IDLE 状态;
  • 发送 CMD8,检查是否支持 2.0 协议;
  • 根据不同协议检查 SD 卡(命令包括: CMD55、 CMD41、 CMD58 和 CMD1 等);
  • 取消片选,发多 8 个 CLK(提供 SD 卡额外的时钟,完成某些操作),结束初始化;

5、SD卡读取数据(CMD17):

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

6、SD卡写数据(CMD24):

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

7、硬件设计:(mini板)

  • SD卡通过4根信号线与STM32连接, SD卡的片选(SD_CS)连接PA3,SD卡的SPI接口,连接在STM32的SPI1上面。
  • 要注意的是SPI1被3个外设共用了: SD卡、 W25Q64和NRF24L01,在使用SD卡的时候,必须禁止其他外设的片选,以防干扰。
     

二、FATFS文件系统

  1.    FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。可以移植到 8051、 PIC、 AVR、 SH、Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
  2. FATFS 的特点有:
  •  Windows 兼容的 FAT 文件系统(支持 FAT12/FAT16/FAT32)
  •  与平台无关,移植简单
  •  代码量少、效率高
  •  多种配置选项

          支持多卷(物理驱动器或分区,最多 10 个卷)

          多个 ANSI/OEM 代码页包括 DBCS

          支持长文件名、 ANSI/OEM 或 Unicode

           支持 RTOS

           支持多种扇区大小

           只读、最小化的 API 和 I/O 缓冲区等
    3.与平台无关的是:

ffconf.h FATFS 模块配置文件
ff.h FATFS 和应用模块公用的包含文件
ff.c FATFS 模块
diskio.h FATFS 和 disk I/O 模块公用的包含文件
interger.h 数据类型定义
option 可选的外部功能(比如支持中文等)


     与平台相关的代码(需要用户提供)是:

diskio.c FATFS 和 disk I/O 模块接口层文件

       FATFS 模块在移植的时候,我们一般只需要修改 2 个文件,即 ffconf.h 和 diskio.c。

   4. diskio.c和diskio.h是硬件层,需要根据存储介质来修改
        ff.c和ff.h是FATFS的文件系统层和文件系统的API层

   5 .移植步骤:  1、数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定                                     义好数据类型。
                              2、配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。
                              3、函数编写:打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数

   6.FATFS给用户提供了大量的API函数,可以满足我们对文件的各种操作。

      STM32——SD卡和FATFS文件系统_第1张图片

      STM32——SD卡和FATFS文件系统_第2张图片  

      STM32——SD卡和FATFS文件系统_第3张图片

  7.几个重要结构体:
        文件对象结构体(FIL类型):存放文件的相关信息,打开关闭读写文件等操作时需要使用其指针
        目录对象结构体(DIR类型):存放目录的相关信息,对目录操作时需要其指针
        文件状态结构体(FILINFO类型):存放文件的大小属性文件名等信息
        文件系统对象结构体(FATFS类型)

你可能感兴趣的:(stm32)