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/DAT3CMDVSSVCCCLKVSSDAT0DAT1DAT2
SPI模式    CSMOSIVSSVCCCLKVSSMISO NC  NC

      3.SD卡的5个寄存器:

名称宽度描述
CID128
卡标识寄存器
 
RCA16相对卡地址寄存器:本地系统中卡的地址,动态变化,在卡的初始化时确定。(SPI模式中没有)
CSD128卡描述数据寄存器:卡操作条件相关的信息数据。
SCR64SD配置寄存器:SD卡特定信息数据
OCR32操作条件寄存器

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.hFATFS 模块配置文件
ff.hFATFS 和应用模块公用的包含文件
ff.cFATFS 模块
diskio.hFATFS 和 disk I/O 模块公用的包含文件
interger.h数据类型定义
option可选的外部功能(比如支持中文等)


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

diskio.cFATFS 和 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函数,可以满足我们对文件的各种操作。

      

        

      

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

  • 34
    点赞
  • 268
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值