Files
Andrey Kruchinkin 11bf8b6c11 feat(eeprom-ft24c256): драйвер EEPROM 24Cxx по I2C
Перенесён из KONOR_ds18b20/lib/eeprom; в OpticalTester лежала такая же копия.

Запись режется по границам страниц внутри библиотеки: микросхема
принимает до 64 байт за транзакцию, но при переходе через границу
страницы счётчик адреса заворачивается и затирает уже принятые байты.
Вызывающему коду об этом думать не нужно.
2026-08-23 01:15:12 +03:00
..

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() сама режет запрос по границам страниц — вызывающему коду об этом думать не надо.

Что нужно от платформы

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 не разведён, поле оставляется нулём.

Быстрый старт

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.