#include #include #define NPAGES 4 typedef enum { ST_INVALID, ST_ERASED, ST_VALID } state_t; typedef struct { uint8_t data; state_t st; } page_t; static page_t blk[NPAGES]; static void dump(void) { printf(" "); for (int i = 0; i < NPAGES; i++) { const char *s = (blk[i].st == ST_INVALID) ? "INV" : (blk[i].st == ST_ERASED) ? "ERS" : "VAL"; printf("[%s %02X] ", s, blk[i].data); } printf("\n"); } static void do_erase(void) { printf("ERASE block\n"); for (int i = 0; i < NPAGES; i++) { blk[i].data = 0xFF; blk[i].st = ST_ERASED; } dump(); } static void do_program(int pg, uint8_t val) { printf("PROGRAM page %d <- %02X\n", pg, val); if (pg < 0 || pg >= NPAGES || blk[pg].st != ST_ERASED) { printf(" ERROR: page not erasable\n"); return; } blk[pg].data = val; blk[pg].st = ST_VALID; dump(); } static void do_read(int pg) { printf("READ page %d\n", pg); if (pg < 0 || pg >= NPAGES || blk[pg].st != ST_VALID) { printf(" (not valid)\n"); return; } printf(" data = %02X\n", blk[pg].data); } int main(void) { for (int i = 0; i < NPAGES; i++) { blk[i].data = 0x00; blk[i].st = ST_INVALID; } printf("INIT\n"); dump(); do_erase(); do_program(0, 0xA5); do_program(0, 0x5A); do_program(2, 0x3C); do_read(0); do_read(1); do_erase(); return 0; }