SPI Flash Circular Buffer
c库将物理SPI闪烁转换为任意数量的逻辑圆形缓冲区。 SFCB和SPI核心之间的接口被实现为共享内存。
特征
- 任意SPI闪存支持,可在编译时间通过
-D选择 - 单个SPI闪光灯中的任意数量的圆形缓冲液队列( CBID )
- 圆形缓冲区与SPI接口之间的相互作用已实现为共享内存
- 文件系统( LittleF , Spiffs )免费
发行
| 版本 | 日期 | 来源 | 更改日志 |
|---|---|---|---|
| 最新的 | 最新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位IDNUM和MagicNum 。 MagicNum确保检测到占据的圆形缓冲液队列元件。
240个字节有效载荷和32个元素(=两个扇区)的模范内存组织显示以下图:
参考
- W25Q16JV
- 西门子开源宣言
