Modèle arbitraire SPI Flash C. Avec la portée d'un test d'unité SPI Flash Driver émule ce module SPI clignote au niveau logique.
Le modèle émule un flash SPI au niveau logique. Comme entrée sont les paquets SPI utilisés. Dans une application du monde réel, serait à la place ce paquet SPI au noyau SPI physiquement.
| Version | Date | Source | Modifier le journal |
|---|---|---|---|
| dernier | dernier.zip | ||
| v0.1.0 | 2023-04-01 | v0.1.0.zip | projet initial |
L'unité donne une bonne saveur à utiliser le modèle.
Pour interagir avec le SFM (modèle SPI Flash) sont les fonctions suivantes disponibles.
Initialise le SFM et sélectionne le flash émulé.
int sfm_init ( t_sfm * self , char flashType []); Déverse la mémoire flash en valeurs hexadécimales à la console. Le réglage de start / stop -1 imprimera le contenu de mémoire entier sur la console.
int sfm_dump ( t_sfm * self , int32_t start , int32_t stop );Store Flash Modèle Tampon de données internes en tant que fichier. Formats pris en charge:
0xff au format ASCII-HEX int sfm_store ( t_sfm * self , char fileName []);Restaurer le tampon de données interne du modèle Flash à partir du fichier. Formats pris en charge:
0xff au format ASCII-HEX int sfm_load ( t_sfm * self , char fileName []);Compare le tampon flash interne SFM avec le fichier. Formats pris en charge:
0xff au format ASCII-HEX int sfm_cmp ( t_sfm * self , char fileName []);Accédez à la mémoire Flash SPI. La demande et la réponse SPI sont placées dans la même variable de tampon SPI.
int sfm ( t_sfm * self , uint8_t * spi , uint32_t len ); L'extrait c ci-dessous montre un exemple minimal pour interagir avec le SFM . La variable SPI représente le paquet envoyé au 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 );
}Cet exemple compilé et exécuté conduit à la sortie suivante:
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