Modelo arbitrario de SPI Flash C. Con el alcance de una prueba de unidad de controlador Flash SPI emula este módulo SPI flashes en el nivel lógico.
El modelo emula un flash SPI a nivel lógico. Ya que la entrada se utilizan los paquetes SPI utilizados. En una aplicación del mundo real se enviaría este paquete SPI al núcleo físico SPI.
| Versión | Fecha | Fuente | Registro de cambio |
|---|---|---|---|
| el último | último.zip | ||
| V0.1.0 | 2023-04-01 | V0.1.0.zip | borrador inicial |
El Unittest da un buen sabor a usar el modelo.
Para interactuar con el SFM (modelo SPI Flash) son las siguientes funciones disponibles.
Inicializa el SFM y selecciona el flash emulado.
int sfm_init ( t_sfm * self , char flashType []); Doblita la memoria flash en los valores hexadecimales a la consola. La configuración de Start/Stop -1 imprimirá contenido de memoria completa en la consola.
int sfm_dump ( t_sfm * self , int32_t start , int32_t stop );Almacena el búfer de datos internos del modelo flash como archivo. Formatos compatibles:
0xff en formato ASCII-HEX int sfm_store ( t_sfm * self , char fileName []);Restaurar Buffer de datos internos del modelo Flash desde el archivo. Formatos compatibles:
0xff en formato ASCII-HEX int sfm_load ( t_sfm * self , char fileName []);Compara el búfer flash interno SFM con el archivo. Formatos compatibles:
0xff en formato ASCII-HEX int sfm_cmp ( t_sfm * self , char fileName []);Acceda a la memoria flash SPI. La solicitud y la respuesta SPI se colocan en la misma variable de búfer SPI.
int sfm ( t_sfm * self , uint8_t * spi , uint32_t len ); El fragmento c a continuación muestra un ejemplo mínimo para interactuar con el SFM . La variable SPI representa el paquete enviado al flash SPI.
#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 );
}Este ejemplo compilado y ejecutado conduce a la siguiente salida:
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