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

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

66 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.