spi_flash_model

FLASH源码 2025-08-12

  • Spi-Flash模型
    • 特征
      • 极限
    • 发行
    • 模仿闪光灯
    • 如何使用
      • API
        • init
        • 倾倒
        • 店铺
        • 加载
        • 比较
        • SFM(SPI Flash型号)
      • 例子
    • 参考

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  // EXIT codes, malloc
#include   // f.e. printf
#include  // 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
下载源码

通过命令行克隆项目:

git clone https://github.com/akaeba/spi_flash_model.git