打印
[技术问答]

SFUD是啥 ? 如何移植?

[复制链接]
636|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzbf|  楼主 | 2022-12-12 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eltonchang2001 于 2022-12-14 14:30 编辑

SFUD是个啥?

SFUD–串行Flash万能驱动库
官方链接: https://www.oschina.net/p/SFUD?hmsr=aladdin1e1.

SFUD 是什么
SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。
主要特点:面向对象(同时支持多个 Flash 对象)、可灵活裁剪、扩展性强、支持 4 字节地址
资源占用
标准占用:RAM:0.2KB ROM:5.5KB
最小占用:RAM:0.1KB ROM:3.6KB
设计思路:这里要首先跟大家介绍一个标准: SFDP ,它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看)。该标准规定了,每个 Flash 中会存在一个参数表,该表中会存放 Flash 容量、写粗粒度、擦除命令、地址模式等 Flash 规格参数。目前,除了部分厂家旧款 Flash 型号会不支持该标准,其他绝大多数新出厂的 Flash 均已支持 SFDP 标准。所以该库在初始化时会优先读取 SFDP 表参数,如果该 Flash 不支持 SFDP,则查询配置文件 ( /sfud/inc/sfud_flash_def.h ) 中提供的 Flash 参数信息表 中是否支持该款 Flash。如果不支持,则可以在配置文件中添加该款 Flash 的参数信息。获取到了 Flash 的规格参数后,就可以实现对 Flash 的全部操作。

目前支持的FLASH类型列表

总结一下:SFUD就是一个SPI-FLASH的底层驱动,只要是遵循 JEDEC (固态技术协会)的芯片都是可以适配的,目前我理解的好处就是如果更换了硬件,只要是这个表里面的,就不需要改代码!!!

好了讲讲移植吧
  • 先把源文件放入工程中
    Github链接: https://github.com/armink/SFUD.
    先去下载库,然后放入自己的工程中(先不动),基本上就是这个样子的
  • 接着就是修改头文件了
    基本上不需要修改什么,先把配置文件改一下
  • #ifndef _SFUD_CFG_H_
    #define _SFUD_CFG_H_

    #define SFUD_DEBUG_MODE                //使能SFUD的打印日志

    #define SFUD_USING_SFDP                //使能SFDP:JEDEC标准(JESD216)标准接口        注意:关闭后只会查询该库在 /sfud/inc/sfud_flash_def.h 中提供的 Flash 信息表。\
                                                            这样虽然会降低软件的适配性,但减少代码量。
                                                                   
    #define SFUD_USING_FLASH_INFO_TABLE        //是否使用该库自带的 Flash 参数信息表注意:关闭后该库只驱动支持 SFDP 规范的 Flash,也会适当的降低部分代码量。\
                                                                            另外 2.3.2 及 2.3.3 这两个宏定义至少定义一种,也可以两种方式都选择

    //支持多路外设
    enum {
            SFUD_W25Q_DEVICE_INDEX = 0,
    };


    //把实际使用的硬件和外设接口对应配置好
    #define SFUD_FLASH_DEVICE_TABLE                                                \
    {                                                                              \
            [SFUD_W25Q_DEVICE_INDEX] = {.name = "W25Q64JV", .spi.name = "SPI3"},       \
    }

    #endif /* _SFUD_CFG_H_ */

这里的.name = “W25Q64JV” 就是自己取的名字,方便**的,我最开始以为是要和SFUD_FLASH_CHIP_TABLE的表里对应呢,原来根本没关系的,谁编写。

这就移植好了,来看看打印日志


使用特权

评论回复

相关帖子

沙发
yangxiaor520| | 2022-12-12 19:50 | 只看该作者
这个有什么优势?

使用特权

评论回复
板凳
daichaodai| | 2022-12-13 19:21 | 只看该作者
SPI外设驱动还是得改吧?

使用特权

评论回复
地板
Stahan| | 2023-1-3 14:45 | 只看该作者
这个有什么优势?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

124

主题

5236

帖子

3

粉丝