แบบจำลอง SPI Flash C โดยพลการ ด้วยขอบเขตของการทดสอบชุดไดรเวอร์ SPI Flash จะเลียนแบบโมดูล SPI นี้จะกะพริบในระดับตรรกะ
โมเดลจำลองแฟลช SPI ในระดับลอจิก เป็นอินพุตเป็นแพ็คเก็ต SPI ที่ใช้ ในแอปพลิเคชั่นในโลกแห่งความเป็นจริงจะถูกส่งแพ็คเก็ต SPI นี้ไปยัง SPI Core แทน
| รุ่น | วันที่ | แหล่งที่มา | เปลี่ยนบันทึก |
|---|---|---|---|
| ล่าสุด | ล่าสุด zip | ||
| v0.1.0 | 2023-04-01 | v0.1.0.zip | ร่างแรก |
Unittest ให้รสชาติที่ดีวิธีการใช้แบบจำลอง
การโต้ตอบกับ SFM (SPI Flash Model) เป็นฟังก์ชั่นต่อไปนี้
เริ่มต้น SFM และเลือกแฟลชที่เลียนแบบ
int sfm_init ( t_sfm * self , char flashType []); ทิ้งหน่วยความจำแฟลชในค่า hex เพื่อคอนโซล การตั้งค่าเริ่มต้น/หยุด -1 จะพิมพ์เนื้อหาหน่วยความจำทั้งหมดเป็นคอนโซล
int sfm_dump ( t_sfm * self , int32_t start , int32_t stop );จัดเก็บบัฟเฟอร์ข้อมูลภายในแฟลชเป็นไฟล์ รูปแบบที่รองรับ:
0xff ในรูปแบบ ascii-hex int sfm_store ( t_sfm * self , char fileName []);กู้คืนบัฟเฟอร์ข้อมูลภายในแฟลชจากไฟล์ รูปแบบที่รองรับ:
0xff ในรูปแบบ ascii-hex int sfm_load ( t_sfm * self , char fileName []);เปรียบเทียบบัฟเฟอร์แฟลชภายใน SFM กับไฟล์ รูปแบบที่รองรับ:
0xff ในรูปแบบ ascii-hex int sfm_cmp ( t_sfm * self , char fileName []);เข้าถึงหน่วยความจำ SPI Flash คำขอและการตอบสนอง SPI ถูกวางไว้ในตัวแปรบัฟเฟอร์ SPI เดียวกัน
int sfm ( t_sfm * self , uint8_t * spi , uint32_t len ); ตัวอย่าง c ด้านล่างแสดงตัวอย่างน้อยที่สุดในการโต้ตอบกับ SFM ตัวแปร SPI แสดงถึงแพ็กเก็ตที่ส่งไปยัง SPI Flash
#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 );
}ตัวอย่างนี้รวบรวมและดำเนินการนำไปสู่การส่งออกต่อไปนี้:
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