I2C — шина на двух проводах, к которой можно повесить до 127 устройств. Придумана для дешёвых датчиков и микросхем: минимум пинов, минимум проводов.
Линии: SDA (данные) и SCL (такт). Обе — открытый сток с подтяжками к питанию (обычно 4.7 кОм, при длинной шине меньше). Ведущий (master) задаёт такт, ведомый (slave) отвечает.
Адресация: у каждого устройства 7-битный адрес, заданный производителем или перемычками (0x3C для OLED, 0x76 для BME280, 0x68 для DS3231). Конфликт адресов — частая проблема: два одинаковых датчика на одной шине требуют мультиплексора.
Скорости: 100 кГц (standard), 400 кГц (fast), 1 МГц (fast plus), 3.4 МГц (high speed). На практике 100–400 кГц.
Обмен: старт → адрес + бит чтения/записи → ACK → данные → ACK → стоп. При ошибке ведомый не подтверждает (NACK), и это видно логическим анализатором.
Плюсы: два провода на любое количество устройств, встроенная адресация, есть готовые драйверы почти под всё.
Минусы: медленно, чувствительно к ёмкости шины (длинные провода — плохо), подтяжки жрут ток, «залипание» шины останавливает всё.
Тонкость: некоторые устройства (PCA9685, датчики) держат SDA в нуле после сбоя. Лечится «клокингом» — ведущий выдаёт до 9 тактов, пока ведомый не отпустит линию.
Резисторы подтяжки: 4.7 кОм — универсально, 2.2 кОм — для длинной шины или высокой скорости, 10 кОм — для экономии.
I2C — самый частый способ подключить датчик или экран, и большинство проблем связано с подтяжками и адресами.
Подключи любой I2C-датчик и запусти сканер адресов (i2c_scanner в Arduino). Найденный адрес сверь с даташитом.
Проверь себя
Почему без подтягивающих резисторов I2C не работает?
Обе линии — открытый сток: устройства могут только прижимать линию к земле, поднимать её должен резистор. Без подтяжки линия остаётся в неопределённом состоянии.
-
Спецификация I²C-bus (NXP UM10204) на i2c-bus.org
спецификация I²C
-
SparkFun: I2C
подключение и адреса