littlebot
Published on 2025-04-13 / 0 Visits
0

【源码】基于C语言的SPI Flash文件系统

项目简介

本项目是在SPI串行Flash存储器上构建虚拟磁盘和文件系统的解决方案。集成了ChaN氏制作的FatFs R0.12c,支持16Mbit到2Gbit的SPI串行Flash存储器,还具备自动设备参数检测、替代扇区功能以及预留区域等特性。

项目的主要特性和功能

  1. 支持16Mbit到2Gbit的SPI串行Flash存储器,兼容4k字节擦除操作。
  2. 可自动检测连接的SPI Flash设备参数。
  3. 实现替代扇区功能,减少因设备写入次数限制导致的文件损坏。
  4. 支持在Flash存储器起始地址处预留任意大小区域,适用于FPGA配置或引导代码。
  5. 能根据FatFs的配置(ffconf.h)优化代码量,以适应不同内存限制。

安装使用步骤

初始化Flash存储器

首次使用时,需在Flash存储器上创建磁盘区域(低级格式化)。磁盘区域大小可在1M字节到设备最大容量之间,以4k字节为单位指定。格式化过程会检查所有扇区,耗时较长。

创建FAT卷

使用FatFs的f_mkfs函数创建FAT卷。完成此步骤后,文件系统即可正常访问。

文件读写操作

使用f_openf_readf_write等函数进行文件读写操作。由于写入操作需要按扇区擦除,写入速度较慢,需注意避免异常终止。

代码示例

```C

include

include "fatfs/ff.h"

include "spidisk.h"

int main(void) { FATFS fs; / FatFs工作区 / FIL fil; / 文件对象 / FRESULT res; / API结果代码 / UINT bw; / 写入字节数 / BYTE work[_MAX_SS]; / 工作区 /

// SPI磁盘低级格式化
res = spidisk_format(0, 0);
if (res) {
    printf("[!] spidisk_format error %d\n\n", res);
    exit(-1);
}

// 创建FAT卷
res = f_mkfs("", FM_ANY, 0, work, sizeof work);
if (res) {
    printf("[!] f_mkfs error %d\n\n", res);
    exit(-1);
}

// 挂载文件系统
f_mount(&fs, "", 0);

// 打开文件并写入数据
res = f_open(&fil, "message.txt", FA_WRITE | FA_CREATE_ALWAYS);
if (res) {
    printf("[!] f_open error %d\n\n", res);
    exit(-1);
}

f_write(&fil, "Hello, World!\r\n", 15, &bw);
if (bw != 15) {
    printf("[!] f_write error\n\n");
    exit(-1);
}

// 关闭文件
f_close(&fil);

return 0;

} ```

移植说明

若需在其他SPI主控环境下使用,需修改spidisk.c中的spi_waitreadyspi_transaction函数,以适应不同的I/O访问方式。

许可证

本项目采用MIT许可证,详细信息请参阅项目源码中的许可证声明。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】