I2C
I2C (англ. Inter-Integrated Circuit) — последовательная двунаправленная шина для связи между интегральными микросхемами. Была изобретена в 1980 году компанией Philips Semiconductors (ныне — NXP Semiconductors), а первая официальная спецификация была выпущена в 1982 году[3]. Она позволяет одному или нескольким ведущим контроллерам (master) обмениваться данными с многочисленными ведомыми устройствами (slave) по двум проводам — линии данных SDA и линии тактового сигнала SCL[4].
Что важно знать
| I2C | |
|---|---|
| англ. Inter-Integrated Circuit | |
| Область использования | Электроника, Встраиваемые системы, Цифровые интерфейсы |
| Дата появления | 1980[1][2] |
| Место появления | Нидерланды |
| Автор понятия | Philips Semiconductors |
Определение
I2C — это:
- двухпроводной интерфейс, использующий открытые стоки (open-drain) и внешние подтягивающие резисторы;
- синхронный протокол с тактированием, формируемым ведущим устройством;
- мульти-мастерная шина с механизмом арбитража и синхронизации;
- протокол, допускающий адресацию 7- и 10-битными адресами (10-битное адресное пространство добавлено в спецификации 1992 года), а также специальные зарезервированные адреса.
Назначение шины включает:
- обмен данными между микроконтроллерами и периферией (датчики, EEPROM, дисплеи) при минимальном числе выводов;
- интеграцию компонентов во встраиваемых системах и устройствах IoT;
- упрощённое трассирование печатных плат за счёт всего двух сигнальных линий[5].
История и версии спецификации
Шина I2C была разработана компанией Philips Semiconductors (ныне NXP Semiconductors) в начале 1980-х годов с целью упрощения соединений между процессором и периферийными микросхемами в телевизорах. Хотя сама технология была изобретена в 1980 году, первая официальная спецификация, сделавшая шину общедоступной, была выпущена в 1982 году. Она определила стандартный режим (Standard-mode) со скоростью 100 кбит/с и 7-битную адресацию[6].
С момента своего создания спецификация I2C неоднократно обновлялась для удовлетворения растущих требований к скорости и функциональности[7]:
- 1992 (Версия 1): Добавлен «быстрый режим» (Fast-mode) со скоростью 400 кбит/с и расширенное 10-битное адресное пространство.
- 1998 (Версия 2.0): Введён «высокоскоростной режим» (High-speed mode, Hs-mode) до 3,4 Мбит/с, сохранивший обратную совместимость с более медленными устройствами[6].
- 2007 (Версия 3): Добавлен режим Fast-mode Plus (Fm+) со скоростью до 1 Мбит/с[7].
- 2012 (Версия 4): Представлен однонаправленный «сверхбыстрый режим» (Ultra-fast mode, UFm) со скоростью до 5 Мбит/с[8].
- 2014 (Версия 6): Обновлены и пересчитаны графики для определения номиналов подтягивающих резисторов в зависимости от ёмкости шины и напряжения[9].
- 2021 (Версия 7): Проведено обновление терминологии: термины master/slave (ведущий/ведомый) были заменены на controller/target (контроллер/цель) для соответствия современным отраслевым стандартам и спецификации MIPI I3C[7].
Структурные элементы протокола I2C
В соответствии со спецификацией 2021 года, терминология master/slave (ведущий/ведомый) была заменена на controller/target (контроллер/цель).
- SDA (англ. Serial Data) — двунаправленная линия последовательных данных, по которой передаются адреса и байты данных.
- SCL (англ. Serial Clock) — линия тактового сигнала, формируемого контроллером; поддерживает «растягивание тактов» (clock stretching) целевыми устройствами.
- Подтягивающие резисторы (Rp) — обеспечивают высокий уровень на линиях SDA и SCL, когда ни одно из устройств не удерживает их на низком уровне. Номинал резисторов (обычно 1–10 кОм) зависит от напряжения и ёмкости шины[10].
- Выходы с открытым стоком (англ. open-drain) или открытым коллектором (англ. open-collector) — позволяют нескольким устройствам безопасно делить одну шину без риска короткого замыкания[11].
- Контроллер (ранее мастер, англ. controller) — устройство, которое инициирует передачу, генерирует тактовый сигнал SCL и формирует условия START/STOP.
- Цель (ранее ведомый, англ. target) — устройство, которое отвечает на свой адрес и на запросы от контроллера. Может замедлять передачу, удерживая линию SCL на низком уровне («растягивание тактов»).
- Множественные контроллеры — шина поддерживает наличие нескольких контроллеров; конфликт при одновременном начале передачи разрешается с помощью механизма арбитража[12].
Физический уровень
Основные электрические и временные параметры определены в спецификации UM10204:
- Напряжение питания VDD — стандартный диапазон от 1,8 В до 5 В. Логические уровни зависят от VDD (например, 0,3·VDD для низкого уровня и 0,7·VDD для высокого).
- Ёмкость шины CBUS — максимальная ёмкость для каждой линии (SDA и SCL) не должна превышать 400 пФ для режимов Standard-mode и Fast-mode. Это ограничение не менялось в последующих ревизиях спецификации. Для режима Fast-mode Plus максимальная ёмкость увеличена до 550 пФ[13].
- Скоростные режимы: Спецификация определяет несколько режимов работы, которые вводились постепенно:
- Standard-mode (Sm): до 100 кбит/с (оригинальная спецификация 1982 года).
- Fast-mode (Fm): до 400 кбит/с (добавлен в 1992 году).
- High-speed mode (Hs-mode): до 3,4 Мбит/с (добавлен в 1998 году).
- Fast-mode Plus (Fm+): до 1 Мбит/с (добавлен в 2007 году).
- Ultra-fast mode (UFm): до 5 Мбит/с (однонаправленный режим, добавлен в 2012 году).
Формат кадра и тайминги
Передача состоит из последовательности:
- START (падение SDA при высоком SCL);
- адрес 7 или 10 бит + бит R/W;
- ACK/NACK на 9-м такте;
- 8-битные байты данных с подтверждением после каждого;
- STOP (рост SDA при высоком SCL)[14].
Ключевые тайминги (минимальные значения):
- tHD;STA — 4 µs (Std), 0,6 µs (Fast);
- tSU;STA — 4,7 µs / 0,6 µs;
- tLOW — 4,7 µs / 1,3 µs;
- tHIGH — 4,0 µs / 0,6 µs[15].
Управление шиной и арбитраж
При одновременном начале передачи несколькими контроллерами (ранее — мастерами) каждый выводит свой бит на SDA и сравнивает с фактическим уровнем на шине. Контроллер, пытавшийся вывести «1» и обнаруживший «0», теряет арбитраж и освобождает шину; победитель продолжает передачу[16].
Этапы работы
- Состояние простоя — SDA и SCL высоки.
- START — начало транзакции.
- Адресация — контроллер посылает адрес + бит R/W.
- Передача данных — последовательность 8-битных байтов и ACK/NACK.
- Повторный START (опционально) — смена направления или адресата без освобождения шины.
- STOP — завершение, шина переходит в простой режим[17].
Инициализация шины
Последовательность настройки контроллера микроконтроллера:
- конфигурация выводов SDA/SCL как open-drain с альтернативной функцией;
- подключение внешних подтягивающих резисторов;
- подача тактирования периферии I2C;
- расчёт и запись делителя частоты SCL;
- выбор режима работы (контроллер или цель) и (для цели) программирование собственного адреса;
- включение модуля и, при необходимости, прерываний или DMA[18].
Адресация устройства
- 7-битная адресация обеспечивает 112 пользовательских адресов (из 128 возможных, за вычетом зарезервированных диапазонов 0x00–0x07 и 0x78–0x7F)[19].
- 10-битная адресация, добавленная в спецификации 1992 года, использует префикс 11110xx и позволяет адресовать до 1008 устройств[20].
- Зарезервированные адреса включают общий вызов 0x00, CBUS 0x01 и коды режима Hs (0x78–0x7B).
Передача данных
Данные передаются старшим разрядом вперёд; изменение SDA допускается только при низком уровне SCL, чтение — при высоком[21].
Подтверждение приёма
Приёмник тянет SDA к «0» на 9-м такте (ACK). Сигнал NACK (SDA = «1») используется для окончания чтения контроллером или для сигнализации ошибки.
Завершение передачи
Условие STOP (рост SDA при высоком SCL) освобождает шину; повторный START позволяет контроллеру удерживать контроль без STOP.
- Простота и компактность: всего две сигнальные линии (SDA и SCL) и общий GND, что упрощает трассировку печатных плат и уменьшает количество выводов микросхем[22].
- Низкая стоимость: простая логика протокола и широкая доступность компонентов с аппаратной поддержкой I2C делают его экономически выгодным решением[23].
- Низкое энергопотребление: протокол эффективен для устройств с батарейным питанием, таких как носимая электроника и датчики IoT[24].
- Масштабируемость: поддержка до 112 устройств на одной шине при стандартной 7-битной адресации.
- Гибкость: поддержка мульти-контроллерного режима (ранее — мульти-мастерного), при котором несколько контроллеров могут инициировать передачу данных. Механизм арбитража разрешает конфликты без потери данных.
- Надёжность: механизм подтверждения приёма (ACK/NACK) после каждого байта позволяет контролировать целостность передачи[25].
- Поддержка «горячего» подключения (hot-plugging): позволяет добавлять или удалять устройства с шины без выключения питания системы (при соответствующей аппаратной реализации).
- ограниченные скорости по сравнению с SPI;
- длина линии и суммарная ёмкость ограничены 400 пФ;
- отсутствие встроенного CRC;
- возможные конфликты адресов;
- зависимость времени фронтов от номинала подтягивающих резисторов;
- многие из недостатков, в частности ограниченная скорость и статическая адресация, устранены в протоколе-преемнике MIPI I3C.
Развитие и преемник: I3C
Для устранения ограничений I2C, связанных со скоростью, энергопотреблением и статической адресацией, в 2016 году альянс MIPI Alliance представил протокол-преемник — I3C (англ. Improved Inter-Integrated Circuit)[26]. I3C позиционируется как эволюционное развитие I2C, предлагающее значительные улучшения при сохранении обратной совместимости с большинством существующих целевых устройств I2C.
Ключевые преимущества I3C по сравнению с I2C:
- Высокая скорость: Стандартная скорость передачи данных (SDR) достигает 12,5 МГц, что значительно превышает возможности I2C. Протокол также поддерживает режимы с более высокой пропускной способностью (HDR).
- Низкое энергопотребление: Протокол более энергоэффективен, что делает его предпочтительным для мобильных и носимых устройств с батарейным питанием.
- Динамическая адресация: Контроллер I3C может динамически назначать адреса всем устройствам на шине во время инициализации, что решает проблему конфликтов статических адресов, присущую I2C.
- Внутриполосные прерывания (англ. In-band interrupts): Целевые устройства могут отправлять запросы на прерывание контроллеру по основным линиям шины, устраняя необходимость в отдельных физических линиях прерываний[27].
- Поддержка «горячего» подключения (англ. Hot-Join): Позволяет подключать новые устройства к работающей шине без её перезапуска.
Благодаря обратной совместимости, устройства I2C могут работать на одной шине с устройствами I3C, что обеспечивает плавный переход на новый стандарт. В спецификации I2C версии 7.0 (2021 год) компания NXP Semiconductors официально признала I3C в качестве преемника и обновила собственную терминологию (controller/target вместо master/slave), чтобы соответствовать стандарту MIPI I3C.
Сферы применения
Несмотря на свой возраст, шина I2C остаётся востребованной в широком спектре электронных устройств благодаря своей простоте, низкой стоимости и малому количеству требуемых выводов. Основные области применения включают:
- Потребительская электроника: I2C является стандартом де-факто для внутрисхемной связи в смартфонах, планшетах, телевизорах и другой бытовой технике. Он используется для конфигурации модулей камер, считывания данных с сенсорных экранов, управления аудиокодеками, а также для взаимодействия с микросхемами памяти EEPROM, RTC, АЦП и ЦАП[28][29].
- IoT и носимая электроника: Эта сфера является одним из главных драйверов роста популярности шины. Благодаря простоте и низкому энергопотреблению, I2C идеально подходит для подключения множества датчиков (температуры, давления, движения) к микроконтроллерам в устройствах умного дома, умных городов, фитнес-трекерах и промышленной электронике (IIoT)[30][31].
- Автомобильная промышленность: В современных автомобилях, особенно в электромобилях и машинах с системами помощи водителю (ADAS), I2C широко используется для связи на локальном уровне внутри электронных блоков. Шина применяется для опроса датчиков в системах климат-контроля, мультимедийных комплексах, а также для управления модулями лидаров, радаров и других компонентов[32][33].
- Центры обработки данных и телекоммуникации: На базе I2C построены протоколы SMBus и PMBus, которые применяются для мониторинга и управления компонентами серверов и сетевого оборудования: отслеживания температуры, управления скоростью вращения вентиляторов и контроля параметров блоков питания[30].
- Промышленная автоматизация и медицина: В промышленном оборудовании шина используется для связи между датчиками, исполнительными механизмами и контроллерами в рамках концепции Индустрии 4.0. Она также находит применение в медицинских приборах для подключения сенсоров и модулей управления[32].
Большинство современных микроконтроллеров (STM32, AVR, ESP32) содержат аппаратный модуль I2C с генератором SCL, буфером данных, автоматикой ACK/NACK и поддержкой прерываний либо DMA[18].
- Linux i2c-dev/SMBus API;
- Python smbus2;
- Arduino Wire;
- STM32 HAL I2C;
- mbed I2C driver.
- Saleae Logic Pro (декодер I2C встроен);
- Total Phase Beagle I2C/SPI (до 4 МГц)[34];
- Bus Pirate V5 с режимом сниффера;
- Sigrok/PulseView с бюджетными логическими анализаторами.
Интеграция с другими интерфейсами
Для подключения I2C к иным шинам применяются мосты:
- I2C ⇄ SPI (NXP SC18IS602/606);
- I2C ⇄ UART (SC16IS740, PI7C9X1170);
- USB ⇄ I2C (адаптеры на FT201X, CH341A);
- CAN ⇄ I2C (модули на MCP2515/MCP2551);
- Ethernet ⇄ I2C (gateway NCD, AnaGate)[35].


