m09-02 теория 7 мин

I2C: две линии и адреса

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 не работает?

Обе линии — открытый сток: устройства могут только прижимать линию к земле, поднимать её должен резистор. Без подтяжки линия остаётся в неопределённом состоянии.

Пройти тест 5 заданий
0 из 102 · 0%
Источники
  1. Спецификация I²C-bus (NXP UM10204) на i2c-bus.org
    спецификация I²C
  2. SparkFun: I2C
    подключение и адреса