Spi-Flash模型
任意SPI Flash C模型。随着SPI闪存驱动器单元测试的范围,该模块在逻辑级别上闪烁。
特征
该模型在逻辑级别上模拟了SPI闪光灯。由于输入是使用的SPI数据包。在现实世界中,将将此SPI数据包发送到物理上的SPI核心。
极限
- 没有时间行为
- 用WIP民意调查常数模拟
发行
| 版本 | 日期 | 来源 | 更改日志 |
|---|---|---|---|
| 最新的 | 最新zip | ||
| V0.1.0 | 2023-04-01 | v0.1.0.zip | 初稿 |
模仿闪光灯
- W25Q16JV
如何使用
Untiment提供了如何使用模型的良好风味。
API
可用以下功能与SFM (SPI闪存模型)进行交互。
init
初始化SFM并选择模拟闪光灯。
int sfm_init ( t_sfm * self , char flashType []);
倾倒
将闪存以十六进制值转储到控制台上。启动/停止-1的设置将打印整个内存内容以控制主机。
int sfm_dump ( t_sfm * self , int32_t start , int32_t stop );
店铺
将Flash模型内部数据缓冲区作为文件存储。支持格式:
- .dif:以ASCII-HEX格式为空闪光
0xff的区别
int sfm_store ( t_sfm * self , char fileName []);
加载
从文件还原闪存模型内部数据缓冲区。支持格式:
- .dif:以ASCII-HEX格式为空闪光
0xff的区别
int sfm_load ( t_sfm * self , char fileName []);
比较
将SFM内部闪存缓冲区与文件进行比较。支持格式:
- .dif:以ASCII-HEX格式为空闪光
0xff的区别
int sfm_cmp ( t_sfm * self , char fileName []);
SFM
访问SPI闪存。 SPI请求和响应放置在同一SPI缓冲区变量中。
int sfm ( t_sfm * self , uint8_t * spi , uint32_t len );
例子
下面的c片段显示了一个与SFM相互作用的最小示例。变量SPI表示发送到SPI闪存的数据包。
spi_flash_model.h" // function prototypes
int main ()
{
/* variables */
uint8_t spi[10]; // spi packet to interact with sfm
t_sfm spiFlash; // handle to SPI Flash
/* define used flash model */
sfm_init (&spiFlash, "W25Q16JV");
/* write enable */
spi[0] = 0x06; // W25Q16JV: write enable instruction
sfm (&spiFlash, spi, 1); // access flash model
/* write page */
spi[0] = 0x02; // W25Q16JV: write page instruction
spi[1] = 0x00; // address high byte
spi[2] = 0x00; // address middle byte
spi[3] = 0x00; // address low byte
spi[4] = 0x01; // data
spi[5] = 0x23;
spi[6] = 0x45;
spi[7] = 0x67;
spi[8] = 0x89;
spi[9] = 0xAB;
sfm (&spiFlash, spi, 10); // access flash model
// poll for WIP
for ( uint8_t i = 0; i < SFM_WIP_RETRY_IDLE; i++ ) {
spiLen = 2;
spi[0] = 0x05;
sfm(&spiFlash, spi, spiLen); // read state reg, needed for WIP poll
}
/* dump current flash content to check write */
sfm_dump (&spiFlash, 0x0, 0x10);
/* normal end */
exit(0);
}\”>
#include <stdlib.h> // EXIT codes, malloc #include <stdio.h> // f.e. printf #include <stdint.h> // defines fixed data types: int8_t... #include \" spi_flash_model .h\" // function prototypes int main () { /* variables */ uint8_t spi [ 10 ]; // spi packet to interact with sfm t_sfm spiFlash ; // handle to SPI Flash /* define used flash model */ sfm_init ( & spiFlash , \"W25Q16JV\" ); /* write enable */ spi [ 0 ] = 0x06 ; // W25Q16JV: write enable instruction sfm ( & spiFlash , spi , 1 ); // access flash model /* write page */ spi [ 0 ] = 0x02 ; // W25Q16JV: write page instruction spi [ 1 ] = 0x00 ; // address high byte spi [ 2 ] = 0x00 ; // address middle byte spi [ 3 ] = 0x00 ; // address low byte spi [ 4 ] = 0x01 ; // data spi [ 5 ] = 0x23 ; spi [ 6 ] = 0x45 ; spi [ 7 ] = 0x67 ; spi [ 8 ] = 0x89 ; spi [ 9 ] = 0xAB ; sfm ( & spiFlash , spi , 10 ); // access flash model // poll for WIP for ( uint8_t i = 0 ; i < SFM_WIP_RETRY_IDLE ; i ++ ) { spiLen = 2 ; spi [ 0 ] = 0x05 ; sfm ( & spiFlash , spi , spiLen ); // read state reg, needed for WIP poll } /* dump current flash content to check write */ sfm_dump ( & spiFlash , 0x0 , 0x10 ); /* normal end */ exit ( 0 ); }
本示例编译并执行的导致以下输出:
spi_flash_model .o
gcc -c -O main.c -o main.o
gcc spi_flash_model .o main.o -lm -o main
./main
00: 01 23 45 67 89 ab ff ff ff ff ff ff ff ff ff ff
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff\”>
gcc -c -O spi_flash_model .c -o spi_flash_model .o gcc -c -O main.c -o main.o gcc spi_flash_model .o main.o -lm -o main ./main 00: 01 23 45 67 89 ab ff ff ff ff ff ff ff ff ff ff 10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
参考
- W25Q16JV
