立创梁山派--移植开源的SFUD和FATFS实现SPI-FLASH文件系统

本文主要是在sfud的基础上进行fatfs文件系统的移植,并不对sfud的移植再进行过多的讲解了哦,所以如果想了解sfud的移植过程,请参考我的另外一篇文章传送门

正文开始咯

  • 首先我们需要先准备资料准备好,这里对于fatfs的移植,我参考的是野火的教程。所以我在文章末尾也会给出相关的教程链接。
    我们需要的东西有:一份实现了sfud库的裸机代码,这个可以从我上篇文章的文末连接中获取,这里我也将代码的链接贴出:传送门, 还有一份fatfs源码,这个为了和野火的教程保持移植,这里用的是跟野火教程版本一致的fatfs源码,这里的源码可以在文末的链接开源代码链接中获取。
  • 开始移植
    打开fatfs代码
    在这里插入图片描述
    我们将其添加到我们的工程中
    在这里插入图片描述
    添加文件路径#在这里插入图片描述

对于fatfs的介绍,野火的教程中都有详细的介绍,这里就不再赘述了。其实它的移植是比较简单的,只需要修改diskio.c文件中的相关接口函数和ffconf.h配置文件。

  • 打开diskio.c文件
    首先包含我们需要的头文件,定义我们要操作的flash
#include "bsp_spi.h"
#include "sfud.h"
const sfud_flash *flash1;

#define W25Q64 0xEF16 //根据板载的spiflash来修改 

/* 为每个设备定义一个物理编号 */
#define ATA			    0     // 预留SD卡使用
#define SPI_FLASH		1     // 外部SPI Flash

对需要修改的函数进行说明

//获取状态函数
DSTATUS disk_status(BYTE pdrv /* 物理编号 */
)
{
   

    DSTATUS status = STA_NOINIT;
    switch (pdrv)
    {
   
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH:
        /* SPI Flash状态检测:读取SPI Flash 设备ID */
        if (W25Q64 == spi4_flash_readID())
        {
   
            /* 设备ID读取结果正确 */

            status &= ~STA_NOINIT;
        }
        else
        {
   
            /* 设备ID读取结果错误 */
            status = STA_NOINIT;
            ;
        }
        break;

    default:
        status = STA_NOINIT;
    }
    return status;
}

初始化函数

DSTATUS disk_initialize(BYTE pdrv /* 物理编号 */
)
{
   
    uint16_t i;
    DSTATUS status = STA_NOINIT;
    switch (pdrv)
    {
   
    case ATA: /* SD CARD */
        break;

    case SPI_FLASH: /* SPI Flash */
        sfud_init();
        flash1 = sfud_get_device_table() + 0; //对应到设备表的第一个
        // printf("%0x\n", spi4_flash_readID());//如果不清楚设备id的话,可以在这里打印一下
        status = disk_status(SPI_FLASH); //获取设备状态
        break;
    default:
        status = STA_NOINIT;
    }
    return status;
}

读取函数

DRESULT disk_read(BYTE pdrv,    /* 设备物理编号(0..) */
                  BYTE *buff
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值