feat(eeprom-ft24c256): драйвер EEPROM 24Cxx по I2C
Перенесён из KONOR_ds18b20/lib/eeprom; в OpticalTester лежала такая же копия. Запись режется по границам страниц внутри библиотеки: микросхема принимает до 64 байт за транзакцию, но при переходе через границу страницы счётчик адреса заворачивается и затирает уже принятые байты. Вызывающему коду об этом думать не нужно.
This commit is contained in:
65
c/eeprom-ft24c256/README.md
Normal file
65
c/eeprom-ft24c256/README.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user