SPI Flash Circular Buffer

FLASH源码 2025-08-12

SPI Flash Circular Buffer

c库将物理SPI闪烁转换为任意数量的逻辑圆形缓冲区。 SFCB和SPI核心之间的接口被实现为共享内存。

特征

  • 任意SPI闪存支持,可在编译时间通过-D选择
  • 单个SPI闪光灯中的任意数量的圆形缓冲液队列( CBID
  • 圆形缓冲区与SPI接口之间的相互作用已实现为共享内存
  • 文件系统( LittleFSpiffs )免费

发行

版本 日期 来源 更改日志
最新的 最新zip

操作方法

克隆

git clone --recursive https://gi*thu*b*.com/andkae/SPI-Flash-Circular-Buffer.git

建造

Makefile通过单元测试构建存储库:

$ make
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV ./test/sfcb_test.c -o ./test/sfcb_test.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV -DSFCB_PRINTF_EN ./spi_flash_cb.c -o ./test/sfcb.o
gcc -c -O -Wall -Wextra -Wconversion -I . -I ../ -DW25Q16JV  ./test/spi_flash_model/spi_flash_model.c -o ./test/spi_flash_model.o
gcc ./test/sfcb_test.o ./test/sfcb.o ./test/spi_flash_model.o -Wall -Wextra -I. -lm -o ./test/sfcb_test

图书馆部分本身可以建立:

gcc -c -O -Wall -Wextra -Wconversion -I . -DW25Q16JV -Werror ./spi_flash_cb.c -o ./test/sfcb.o

闪存W25Q16JV是通过Compile Switch -D选择的。

例子

测试

运行单元测试呼叫:

$ ./test/sfcb_test

API

init

初始化SFCB通用句柄并分配内存。

 int sfcb_init ( t_sfcb * self , void * cb , uint8_t cbLen , void * spi , uint16_t spiLen );

参数:

arg 描述
自己 SFCB存储元素
CB 圆形缓冲列队内存
cblen 最大限度。 CB队列的数量
spi SFCB / SPI核心交换缓冲区
斯皮伦 字节中的SPI缓冲尺寸

返回:

退出代码

新队列

在SPI Flash中创建一个新的逻辑独立的圆形缓冲区队列。

 int sfcb_new_cb ( t_sfcb * self , uint32_t magicNum , uint16_t elemSizeByte , uint16_t numElems , uint8_t * cbID );

参数:

arg 描述
自己 SFCB存储元素
魔术 魔术数字,在同一SPI闪光灯上的每个队列都必须是唯一的
Elemsizebyte 有效载荷大小,字节,标头/页脚原因
数字 队列中所需元素的数量最少,舍入到下一个整个部门
CBID 分配给此队列的ID ,所有其他请求所需的

返回:

退出代码

忙碌的

检查SFCB是否正在处理另一个请求。

 int sfcb_busy ( t_sfcb * self );

参数:

arg 描述
自己 SFCB存储元素

返回:

退出代码

错误

在最后一个请求中以错误结束。

 int sfcb_isero ( t_sfcb * self );

参数:

arg 描述
自己 SFCB存储元素

返回:

退出代码

建造

从SPI Flash获取所有队列信息。致电SFCB_ADD以更新所有管理信息后所需。

 int sfcb_mkcb ( t_sfcb * self );

参数:

arg 描述
自己 SFCB存储元素

返回:

退出代码

添加(附加)

将字节附加到当前选定的圆形缓冲器队列元件上。

 int sfcb_add ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len );

参数:

arg 描述
自己 SFCB存储元素
CBID 圆形缓冲液相互作用
*数据 指针写数据
*数据中的字节数

返回:

退出代码

添加完成

在圆形缓冲区队列元件中,如果不是所有可用的字节,请写下页脚页脚用于检测元素的完整写作。一般建议是每次完成队列元素写作时都会致电sfcb_add_done

 int sfcb_add_done ( t_sfcb * self , uint8_t cbID );

参数:

arg 描述
自己 SFCB存储元素
CBID 圆形缓冲液相互作用

返回:

退出代码

获得有效载荷偏移

获取当前的书面字节数以排队元素。启用多阶段数据对象写入循环缓冲元素。

 uint16_t sfcb_get_pl_wrcnt ( t_sfcb * self , uint8_t cbID );

参数:

arg 描述
自己 SFCB存储元素
CBID 圆形缓冲液相互作用

返回:

编写队列元素的字节数。

最后

阅读最后一个书面的队列元素。

 int sfcb_get_last ( t_sfcb * self , uint8_t cbID , void * data , uint16_t len , uint32_t * elemID );

参数:

arg 描述
自己 SFCB存储元素
CBID 圆形缓冲液相互作用
*数据 指针读取数据
*数据中的字节数
*Elemid 队列元素号

返回:

退出代码

Flash Raw Read

从Flash读取的原始数据。

 int sfcb_flash_read ( t_sfcb * self , uint32_t adr , void * data , uint16_t len );

参数:

arg 描述
自己 SFCB存储元素
ADR SPI闪存地址
*数据 指针读取数据
*数据中的字节数

返回:

退出代码

工人

服务循环缓冲层请求以及SPI数据包处理。此功能应在基于时间的问题中调用。 SPI数据包传输应使用基于ISR的数据流。

 void sfcb_worker ( t_sfcb * self );

参数:

arg 描述
自己 SFCB存储元素

返回:

没有任何。

SPI数据包大小

sfcb_worker创建了字节中的SPI数据包大小。

 uint16_t sfcb_spi_len ( t_sfcb * self );

参数:

arg 描述
自己 SFCB存储元素

返回:

SPI数据包的字节数。

闪光大小

获取SFCB编译的Flash类型总尺寸。

 uint32_t sfcb_flash_size ( void );

返回:

大小为字节。

最高队列元素编号

获得最高元素的圆形缓冲液队列CBID

 uint32_t sfcb_idmax ( t_sfcb * self , uint8_t cbID );

参数:

arg 描述
自己 SFCB存储元素
CBID 圆形缓冲液相互作用

返回:

最高元素号。

返回:退出代码

价值 描述
sfcb_ok 公认
sfcb_e_no_flash 未选择闪存类型,使用-D
sfcb_e_mem sfcb_init中分配的记忆不足
sfcb_e_flash_full 闪存容量超过了
sfcb_e_wkr_bsy sfcb_worker很忙,等等
sfcb_e_no_cb_q 圆形缓冲列cbID不存在
sfcb_e_wkr_req 循环缓冲区管理数据未为请求准备,运行sfcb_mkcb
sfcb_e_cb_q_mty 队列中没有有效的条目

内存组织

SFCB支持任意数量的圆形缓冲液队列。每个圆形缓冲区始于最低的自由SPI闪存地址。闪存体系结构需要一个专用的数据清除 - 所谓的sector擦除。通过这种限制,必须至少分配两个部门。否则,第一个书面元素的覆盖将导致完整的循环缓冲列表覆盖,而无需保留任何以前的条目。每个新的条目都标有增量最高的32位IDNUMMagicNumMagicNum确保检测到占据的圆形缓冲液队列元件。

240个字节有效载荷和32个元素(=两个扇区)的模范内存组织显示以下图:


参考

  • W25Q16JV
  • 西门子开源宣言
下载源码

通过命令行克隆项目:

git clone https://github.com/andkae/SPI-Flash-Circular-Buffer.git