# eeprom-ft24c256 Драйвер последовательной EEPROM **FT24C256** и совместимого семейства 24Cxx по шине I²C. Ядро на C99: не включает заголовки периферии, не обращается к регистрам, не пользуется прерываниями. Обмен идёт через таблицу `FT24C256_Io`, которую заполняет порт платы. ``` приложение │ ft24c256.c нарезка записи по страницам, ожидание цикла записи, двухбайтовый адрес слова, счётчики ошибок │ FT24C256_Io write, write_read, delay_ms, set_write_protect │ порт платы I2C ``` ## Состав | Файл | Что делает | Зависимости | |---|---|---| | `ft24c256.h`, `ft24c256.c` | чтение и запись произвольных блоков, стирание, защита записи, опрос готовности | `stdint.h` | FT24C256 — 32768 байт (256 кбит), адрес слова двухбайтовый, страница записи 64 байта. Микросхема принимает до 64 байт за транзакцию, но только внутри страницы: при переходе через границу счётчик адреса заворачивается на начало той же страницы и затирает уже принятые байты. Поэтому `FT24C256_Write()` сама режет запрос по границам страниц — вызывающему коду об этом думать не надо. ## Что нужно от платформы ```c uint8_t write(void *ctx, uint8_t addr, const uint8_t *data, uint16_t size); uint8_t write_read(void *ctx, uint8_t addr, const uint8_t *tx, uint16_t tx_size, uint8_t *rx, uint16_t rx_size); /* с повторным стартом */ void delay_ms(void *ctx, uint32_t ms); ``` Адрес передаётся семибитным, без бита направления — сдвиг делает порт. `set_write_protect` необязателен: если вывод WP не разведён, поле оставляется нулём. ## Быстрый старт ```c FT24C256 eeprom; FT24C256_Io io = { .write = i2c_write, .write_read = i2c_write_read, .delay_ms = board_delay, .context = &board }; FT24C256_Config config; FT24C256_ConfigDefault(&config); /* 32 КБ, страница 64, адрес 0x50 */ FT24C256_Init(&eeprom, &io, &config); uint8_t settings[100]; FT24C256_Write(&eeprom, 0x0030, settings, sizeof settings); FT24C256_Read(&eeprom, 0x0030, settings, sizeof settings); ``` До восьми кристаллов на шине: адрес `0x50 + index`, `FT24C256_AddressOf()`. ## Проверено в проектах `KONOR_ds18b20`, `OpticalTester` — I2C1 на STM32F103C8T6.