Найти тему
Вокруг IT

Интерфейс I2C в вопросах и ответах

На канале уже были материалы о UART и SPI, теперь кратко расскажу про популярный интерфейс I2C.

Что это такое? I2C (Inter Integrated Circuit, произносится ай-ту-си) — последовательный асимметричный интерфейс для соединения низкоскоростных переферийных компонентов с микроконтроллерами. Его очень часто используются для сбора данных с датчиков.

В чём идея? Обычно есть одно ведующее устройство (master), несколько ведомых (slave) и два провода для передачи данных: линия тактирования SCL и линия данных SDA. Они подтянуты к линии питания +5 (как у Arduino) или +3.3 В (как у Raspberry) через резисторы 1-10 кОм.

-2

Обмен двусторонний, происходит только между ведущим и ведомыми (в отличие от SPI, где можно построить круговую схему передачи данных).

Как происходит обмен данными? Понятно, что при отсутствии передачи данных обе линии подтянуты к линии питания. Стартовым сигналом к передаче данных служит ситуация, когда SCL имеет высокое состояние, а SDA меняется с высокого на низкое. Сигнал "стоп" равнозначен тому, что так же при высоком SCL сигнал SDA меняется от низкого к высокому.

Сама же передача данных происходит при низком состоянии SCL. При этом после каждых 8 бит от передатчика приемник подтверждает передачу данных.

Как же адресовать данные? Обычно производитель записывает в приемник короткий id, который описывает его адрес. Обычно используется 7-битная адресация, отсюда и берется максимальное количество устройств: 2^7-1=127. Восьмой младший бит определяет направление пересылки данных: 0 от master к slave, 1 наоборот: от slave к master.

Есть ли этот интерфейс у Arduino и Raspberry? Да. У Arduino Uno за I2C отвечают аналоговые контакты A4 и A5. В Uno R3 можно использовать еще пару ближних к USB-контактов, те, что находятся сразу за пином AREF. На Arduino Mega для I2C предназначены пины 20 и 21. Подтягивающие резисторы в обоих случаях уже встроены.

Контакты интерфейса I2C на Arduino
Контакты интерфейса I2C на Arduino

На Raspberry Pi I2C интерфейс реализован на пинах GPIO2 и GPIO3.

Есть ли готовые библиотеки? Да, например, для программирования на Arduino используется библиотека Wire.h.

Какие плюсы и минусы? Преимущества: всего два провода для подключения множества устройств. Есть возможность "горячего" подключения и отключения устройств в процессе работы.

Недостатки следующие: сравнительно небольшая скорость передачи (сотни Кб/с), ограничение на емкость линии — 400 пФ, то линия передачи может быть не более нескольких метров.

Когда использовать? Когда есть множество датчиков, которые расположены рядом с микроконтроллером, не хочется использовать большое количество соединений и не нужны большие скорости обмена данными.

Если у вас остались вопросы — пишите в комментариях к этому посту.