单片机交流
直播中

张霞

7年用户 1024经验值
私信 关注
[问答]

FATFS文件系统的特点是什么?它是如何移植的?

SD卡具有哪几种操作模式?引脚功能是什么?
FATFS文件系统的特点是什么?它是如何移植的?


回帖(1)

潘琳

2021-9-23 11:27:45
最近看了32的sd卡和FATFS文件系统,现在就自己的理解总结一下。
  一、SD卡模块

  
   

  • 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文件系统

  

  •    FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。可以移植到 8051、 PIC、 AVR、 SH、Z80、 H8、 ARM 等系列单片机上而只需做简单的修改。它支持 FATl2、 FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
  • 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类型)
  
  https://blog.csdn.net/nulidehahafr/article/details/84146148?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
举报

更多回帖

发帖
×
20
完善资料,
赚取积分