SFUD作用
SFUD 是一款开源的串行 SPI Flash 通用驱动库。由于现有市面的串行 Flash 种类居多,各个 Flash 的规格及命令存在差异, SFUD 就是为了解决这些 Flash 的差异现状而设计,让我们的产品能够支持不同品牌及规格的 Flash,提高了涉及到 Flash 功能的软件的可重用性及可扩展性,同时也可以规避 Flash 缺货或停产给产品所带来的风险。使用SFUD用户只用配置好最底层的SPI(QSPI)相关的接口配置和收发函数就行了,其余的例如写使能之类的操作固件内根据flash芯片的参数就自动进行了使能,所以使用SFUD是非常方便的;简化软件流程,降低开发难度。现在只需要配置好 SPI 通信,即可畅快的开始玩串行 Flash 了;
关于SFUD的使用方法和移植步骤参考:SFUD: 一款使用 JEDEC SFDP 标准的串行 (SPI) Flash 通用驱动库
官方的文档和Demo已经说明的很详细了。
我的H743移植工程:
CSDN
移植步骤:
移植步骤主要分为两步:
1)将固件源码添加到工程中;
2)修改sfud_port.c文件,该文件是底层接口文件,我们根据手册和固件内的Demo补充完该文件就行了,该文件主要是与flash相连的spi的接口初始化和spi收发数据的底层接口;
在手册上也有相关说明:
固件如何获取到FLASH参数
固件获取flash参数主要是通过如下三种方法,其中SFDP和本地参数表这两种获取方式的选择可以在sfud_cfg.h的SFUD_USING_SFDP和SFUD_USING_FLASH_INFO_TABLE两个宏定义来开启或关闭,他们的使用是会占用内存空间的,在使用时选择其中一种就行。
(1)SFDP
对于支持SFDP的FLASH,其参数已经写在了芯片指定位置,固件将参数自动读取出来就能使用;
- 什么是 SFDP :它是 JEDEC (固态技术协会)制定的串行 Flash 功能的参数表标准,最新版 V1.6B (点击这里查看)。该标准规定了,每个 Flash 中会存在一个参数表,该表中会存放 Flash 容量、写粒度、擦除命令、地址模式等 Flash 规格参数。目前,除了部分厂家旧款 Flash 型号会不支持该标准,其他绝大多数新出厂的 Flash 均已支持 SFDP 标准。所以该库在初始化时会优先读取 SFDP 表参数。
(2) 从本地参数表获取参数信息
如果该 Flash 不支持 SFDP 标准,SFUD 会查询配置文件 ( /sfud/inc/sfud_flash_def.h )SFUD_FLASH_CHIP_TABLE宏定义 中提供的 Flash 参数信息表 中是否支持该款 Flash。如果不支持,则可以在配置文件中手动添加该款 Flash 的参数信息,获取到了 Flash 的规格参数后,就可以实现对 Flash 的全部操作。
如果使用的是本地参数信息表查找的方式进行查找,它查找的逻辑不是根据 在sfud_cfg.h的SFUD_FLASH_DEVICE_TABLE宏定义中输入的name与本地信息表对比进行匹配的,而是依据从flash获取到的参数来进行匹配的,例如:
初始化成功,说明器件查表是根据器件厂商信息和器件信息来进行匹配的。
(3) 既不使用 SFDP ,也不使用 Flash 参数信息表
为了进一步降低代码量,SFUD_USING_SFDP
与 SFUD_USING_FLASH_INFO_TABLE
也可以 都不定义 。
此时,只要在定义 Flash 设备时,指定好 Flash 参数,之后再调用 sfud_device_init
对该设备进行初始化。参考如下代码:
sfud_flash sfud_norflash0 = {
.name = "norflash0",
.spi.name = "SPI1",
.chip = { "W25Q64FV", SFUD_MF_ID_WINBOND, 0x40, 0x17, 8L * 1024L * 1024L, SFUD_WM_PAGE_256B, 4096, 0x20 } };
......
sfud_device_init(&sfud_norflash0);
......