Освоил чтение и запись во внешнюю EEPROM память

Засунул на макетку микросхему AT24C16 (см. рис. 1).

Она подключается к микроконтроллеру по интерфейсу I2C. Объем памяти — 16 кбит, т.е. 2 килобайта. Это в 2 раза больше, чем встроенный EEPROM на Arduino nano.

Имею сказать, что адресация памяти внутри этой микросхемы нифига не интуитивна. Поскольку там 2048 байт, для их адресации надо 11 бит, т.е. два байта. Я думал, что сначала в эту микруху отправляется 2-байтовый адрес, а она в ответ пришлёт байт, расположенный по этому адресу. А 3 «адресных» ноги на корпусе позволяют задать любой I2C адрес из диапазона 0x50-0x57.

Фигвам. Недостающие старшие 3 бита адреса контрабандой стырены с выводов 1-2-3 микросхемы. То есть эти самые выводы ни к чему не подключены и ни на что не влияют. Вместо этого микросхема отзывается на ВСЕ адреса из диапазона 0x50-0x57. Соответственно, по каждому из этих I2C адресов доступно 256 байт EEPROM памяти. То есть логически эта микросхема выглядит как 8 штук 256-байтных микросхем, сидящих на адресах 0x50-0x57 (с 8-битной внутренней адресацией внутри каждой «микросхемы», естественно). Огонь вообще.

Я очень удивился.

Но в результате разобрался. Сначала «на коленке» написал свою версию кода для чтения-записи, чтобы убедиться, что я логику правильно понял. А потом наткнулся на вполне пристойную реализацию программного интерфейса к этой микросхеме: https://programmersought.com/article/598311367038/

Возьму эту реализацию за основу и сделаю для неё интерфейсный класс-обёртку, который будет скрывать всю эту удивительную логику адресации, а заодно будет оптимизировать запись данных.

Рис. 1

Добавить комментарий