Перейти к содержанию

Шина I²C (I2C, IIC, TWI)

I²C — двухпроводная шина для связи микросхем внутри устройства: линия данных SDA и тактовая линия SCL с открытым стоком, подтянутые резисторами к питанию. Здесь — протокол по спецификации NXP UM10204, адреса популярных датчиков и расчёт подтяжек с калькулятором.

Обновлено Редакция GAW

I²C (Inter-Integrated Circuit) — последовательная синхронная шина, которую Philips Semiconductors (сейчас NXP) выпустила в 1982 году для связи микросхем внутри одного устройства. Все участники сидят на двух общих линиях: по SDA (Serial Data) идут данные, по SCL (Serial Clock) — тактовые импульсы. Обмен всегда начинает ведущее устройство: оно генерирует такт и выбирает ведомое по адресу. По I²C подключают EEPROM, часы реального времени, датчики, АЦП и ЦАП, расширители портов, контроллеры дисплеев и светодиодов.

Эталон для всех чисел в этой статье — NXP UM10204 «I2C-bus specification and user manual», ревизия 7.0 от 1 октября 2021 года. В ней термины master и slave заменены на controller и target; по-русски дальше — «ведущий» и «ведомый». По оценке NXP, I²C поддерживают более 1000 микросхем от более чем 50 производителей, а на его основе построены SMBus, PMBus, IPMI и канал DDC в видеоинтерфейсах.

Коротко

  • Две сигнальные линии, SDA и SCL, плюс общий провод. Выходы всех устройств — с открытым стоком, единицу на линии создают подтягивающие резисторы.
  • Скорости: до 100 кбит/с (Standard-mode), 400 кбит/с (Fast-mode), 1 Мбит/с (Fast-mode Plus), 3,4 Мбит/с (High-speed mode) и однонаправленный Ultra Fast-mode до 5 Мбит/с.
  • Адрес — 7 бит плюс бит направления R/W. Из 128 адресов 16 зарезервированы, устройствам остаются 0x08–0x77.
  • Состав шины ограничивает ёмкость линии: не более 400 пФ на 100 и 400 кГц и 550 пФ в Fast-mode Plus.
  • Подтяжка: Rmin=(VDD−VOL)/IOLR_{min} = (V_{DD} - V_{OL}) / I_{OL}, Rmax=tr/(0,8473⋅Cb)R_{max} = t_r / (0{,}8473 \cdot C_b). Для 3,3 В, 400 кГц и 200 пФ — от 967 Ом до 1,77 кОм.
  • TWI в микроконтроллерах AVR — это тот же I²C. SMBus совместим с ним по протоколу, но вводит таймаут 25–35 мс и минимальную частоту 10 кГц.

Как устроена шина I²C

Устройства подключаются к SDA и SCL параллельно, без отдельных линий выбора. Каждое ведомое откликается только на свой адрес, поэтому к двум выводам микроконтроллера можно повесить десяток микросхем. Ведущих на шине тоже может быть несколько: I²C — шина с несколькими ведущими (multi-master), конфликты между ними решает арбитраж.

Шина I2C: ведущий, три ведомых устройства и подтягивающие резисторыЛинии SDA и SCL общие для всех устройств. Каждая линия подтянута к VDD своим резистором Rp, выходы устройств — с открытым стоком. Все устройства соединены общим проводом GND.SDASCLVDDRpRpВедущийМК, controllerEEPROM24C02, 0x50Часы RTCDS3231, 0x68ДатчикBME280, 0x76GND — общий провод обязателенвыходы всех устройств — открытый сток
Типичная шина: один ведущий, три ведомых с разными адресами, по одному подтягивающему резистору на SDA и SCL и общий провод

Выходы на шине устроены по схеме «открытый сток» (у биполярных микросхем — «открытый коллектор»). Чтобы передать ноль, устройство открывает транзистор и замыкает линию на землю. Чтобы передать единицу, оно ничего не делает: транзистор закрыт, и линию поднимает до VDD подтягивающий резистор Rp. Получается «монтажное И»: линия в единице, только когда её отпустили все. Отсюда два важных следствия: короткого замыкания между выходами не бывает в принципе, а любое устройство может придержать линию в нуле — на этом построены подтверждение, растягивание такта и арбитраж.

Пороги логических уровней в UM10204 привязаны к напряжению питания: низкий уровень — не выше 0,3 VDD, высокий — не ниже 0,7 VDD. У старых устройств Standard-mode встречались фиксированные пороги 1,5 и 3,0 В. Если на шине один ведущий и никто из ведомых не растягивает такт, выход SCL ведущего может быть и двухтактным — спецификация это допускает.

Почему спад быстрый, а фронт медленный

Ноль на линии создаёт транзистор с малым сопротивлением, поэтому спад короткий. Единицу создаёт резистор, который заряжает ёмкость линии Cb: выводы микросхем, дорожки, провода. Фронт получается экспоненциальным, и время его нарастания от 0,3 VDD до 0,7 VDD — главный ограничитель I²C. Оно зависит только от Rp и Cb, а не от частоты, которую выставил программист.

Открытый сток на шине I2C: монтажное И и RC-фронтСлева: линия подтянута к VDD резистором Rp, на неё нагружены ёмкость Cb и выходные транзисторы двух устройств. Справа: при открытии ключа линия падает в ноль быстро, а после закрытия поднимается по экспоненте; время нарастания между уровнями 0,3 VDD и 0,7 VDD равно 0,8473·Rp·Cb.VDDRpлиния SDA или SCLключ устр. 1ключ устр. 2CbVDD0,7 VDD0,3 VDD0ttr= 0,8473 · Rp · Cbключ открытключи закрыты:Cb заряжается через Rp
Монтажное И на линии с открытым стоком и RC-фронт: время нарастания между порогами 0,3 VDD и 0,7 VDD равно 0,8473·Rp·Cb

Режимы и скорости I²C

Спецификация определяет пять режимов. Первые четыре двунаправленные и совместимы сверху вниз: устройство Fast-mode работает на шине 100 кГц, устройство Fast-mode Plus — на 400 кГц. Обратное не гарантировано: микросхема Standard-mode не обязана работать на 400 кГц, и UM10204 прямо не рекомендует ставить её на быструю шину. Пример — часы DS1307, которые по даташиту работают только в режиме 100 кГц.

РежимСкоростьЁмкость линии Cb, не болееВремя нарастания tr, не болееТок выхода IOL при VOL = 0,4 В
Standard-mode (Sm)100 кбит/с400 пФ1000 нс3 мА
Fast-mode (Fm)400 кбит/с400 пФ300 нс3 мА (6 мА при VOL = 0,6 В)
Fast-mode Plus (Fm+)1 Мбит/с550 пФ120 нс20 мА
High-speed mode (Hs)3,4 Мбит/с100 пФ (при 400 пФ — до 1,7 Мбит/с)80 нс по SDAH, 40 нс по SCLH при 100 пФ3 мА
Ultra Fast-mode (UFm)5 Мбит/с, только записьне нормируется50 нсдвухтактный выход, 4 мА

Пояснения к таблице, все по UM10204:

  • Fast-mode требует от входов фильтра помех короче 50 нс и триггера Шмитта. Ток 6 мА при 0,6 В нужен, чтобы тянуть полную нагрузку 400 пФ на 400 кГц; при ёмкости больше 200 пФ спецификация предлагает вместо резистора источник тока или коммутируемую подтяжку.
  • Fast-mode Plus — это прежде всего в 6–7 раз более сильные выходы (20 мА против 3 мА). Они позволяют либо разогнать шину до 1 МГц, либо тянуть заметно большую ёмкость на меньшей частоте.
  • High-speed mode включается только после специального кода ведущего 0000 1XXX, переданного на обычной скорости. На время передачи активный ведущий включает на линии SCLH источник тока, который помогает подтягивающему резистору и укорачивает фронты такта, а арбитража и синхронизации тактов в этом режиме нет.
  • Ultra Fast-mode — отдельная однонаправленная шина USDA/USCL с двухтактными выходами без подтяжек: только запись, без подтверждений, растягивания такта и нескольких ведущих. Нужен для светодиодных драйверов и похожих приёмников; с обычными устройствами I²C несовместим.

Временные параметры

Если вы пишете программную реализацию I²C или проверяете осциллограмму, пригодятся времена из таблицы 11 UM10204 (минимальные, если не указано «не более»):

ПараметрSmFmFm+
Частота SCL, не более100 кГц400 кГц1000 кГц
Удержание (повторного) START tHD;STA4,0 мкс0,6 мкс0,26 мкс
Низкий уровень SCL tLOW4,7 мкс1,3 мкс0,5 мкс
Высокий уровень SCL tHIGH4,0 мкс0,6 мкс0,26 мкс
Подготовка повторного START tSU;STA4,7 мкс0,6 мкс0,26 мкс
Установка данных до фронта SCL tSU;DAT250 нс100 нс50 нс
Подготовка STOP tSU;STO4,0 мкс0,6 мкс0,26 мкс
Пауза между STOP и START tBUF4,7 мкс1,3 мкс0,5 мкс
Данные действительны после спада SCL tVD;DAT, не более3,45 мкс0,9 мкс0,45 мкс

Удержание данных после спада SCL (tHD;DAT) по шине может быть нулевым, но менять SDA можно только после того, как SCL на спаде опустится ниже 0,3 VDD, иначе смена данных попадёт в неопределённую зону 0,3–0,7 VDD. В ревизии 6 спецификации это обеспечивалось требованием внутреннего удержания не меньше 300 нс.

Протокол I²C: START, адрес, данные, ACK и STOP

Условия START и STOP

Свободная шина — это обе линии в единице. Обмен начинается условием START (S): ведущий переводит SDA из единицы в ноль, пока SCL в единице. Заканчивается условием STOP (P): SDA поднимается из нуля в единицу при высоком SCL. Между ними шина считается занятой, и другие ведущие ждут. Если ведущему нужно продолжить обмен, не отдавая шину, он формирует повторный START (Sr) вместо пары STOP–START.

Правило данных: SDA меняется только при низком SCL

Пока SCL в единице, уровень SDA должен стоять неподвижно — в этот момент приёмник читает бит. Менять SDA можно только при низком SCL. Изменение SDA при высоком SCL — это уже не данные, а START или STOP. Один такт SCL — один бит.

Байт и подтверждение ACK/NACK

Данные идут байтами по 8 бит, старшим битом вперёд; число байтов в одном обмене не ограничено. После каждого байта следует девятый такт подтверждения: передатчик отпускает SDA, и приёмник, если принял байт, прижимает её к нулю — это ACK. Если SDA осталась в единице, это NACK. Причин у NACK пять:

  1. На шине нет устройства с таким адресом.
  2. Приёмник занят и пока не может принимать — так, например, ведёт себя EEPROM во время внутренней записи (до 5 мс у AT24C02C).
  3. Приёмник получил команду или данные, которые не понимает.
  4. Приёмник больше не может принимать байты.
  5. Ведущий-приёмник сообщает ведомому, что прочитал последний нужный байт.

После NACK ведущий завершает обмен STOP или начинает новый повторным START.

Адрес и бит R/W

Первый байт после START — адрес ведомого: 7 старших бит адреса и младший бит направления R/W. Ноль в R/W означает запись (ведущий передаёт), единица — чтение (ведомый отвечает). Ведомое с таким адресом подтверждает байт ACK, остальные молчат.

Временная диаграмма I2C: START, адрес 0x76, бит записи, ACK и STOPSCL — тактовые импульсы ведущего. SDA меняется только при низком SCL: семь бит адреса 1110110, бит R/W = 0, затем ведомый удерживает SDA в нуле на девятом такте (ACK). START — спад SDA при высоком SCL, STOP — подъём SDA при высоком SCL.SCLSDASP111011000STARTадрес 0x76 = 1110110, старший бит первымR/WACKSTOPSDA ведёт ведущийACK: SDA в нуле держит ведомыймомент чтения бита
START, адрес 0x76 (1110110) с битом записи, подтверждение ведомого и STOP. Так выглядит проверка адреса, которую делает сканер шины

Пример: чтение регистра с повторным START

Почти все датчики и микросхемы памяти устроены как набор регистров. Чтобы прочитать регистр, ведущий сначала записывает его номер, а затем, не отпуская шину, переключается на чтение. Разберём побайтно чтение регистра идентификатора 0xD0 датчика BME280 с адресом 0x76: по даташиту Bosch там всегда лежит 0x60 (у BMP280 — 0x58, так их и различают).

Кадр чтения регистра по I2C с повторным STARTВедущий передаёт START, адрес 0x76 с битом записи (байт 0xEC) и номер регистра 0xD0, получает два ACK, затем формирует повторный START, адрес с битом чтения (0xED), принимает байт данных 0x60, отвечает NACK и завершает обмен STOP.запись: какой регистр читатьчтение данныхS0x76 + Wбайт 0xEC1110110 0ACKрегистр0xD011010000ACKSr0x76 + Rбайт 0xED1110110 1ACKданные0x6001100000NACKPусловие START/STOP (формирует ведущий)передаёт ведущийпередаёт ведомый
Кадр чтения регистра: запись номера регистра, повторный START, чтение и NACK перед STOP
ШагПередаётНа линииСмысл
1ведущийSSTART
2ведущий0xECадрес 0x76 и R/W = 0 (запись): 1110110 0
3ведомыйACKдатчик откликнулся
4ведущий0xD0номер регистра
5ведомыйACKномер принят
6ведущийSrповторный START, шина не освобождается
7ведущий0xEDадрес 0x76 и R/W = 1 (чтение): 1110110 1
8ведомыйACKдатчик готов отвечать
9ведомый0x60содержимое регистра 0xD0
10ведущийNACKбольше байтов не нужно
11ведущийPSTOP

Если продолжать подтверждать байты, датчик выдаст следующие регистры подряд — автоинкремент адреса регистра есть почти у всех таких микросхем. В Arduino тот же обмен записывается так:

#include <Wire.h>

const uint8_t BME280_ADDR = 0x76;  // 7-bit address, SDO tied to GND

int readRegister(uint8_t reg) {
  Wire.beginTransmission(BME280_ADDR);
  Wire.write(reg);
  if (Wire.endTransmission(false) != 0) return -1;  // false: repeated START instead of STOP
  if (Wire.requestFrom(BME280_ADDR, (uint8_t)1) != 1) return -1;  // ends with NACK + STOP
  return Wire.read();
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Serial.println(readRegister(0xD0), HEX);  // 60 for BME280, 58 for BMP280
}

void loop() {}

10-битная адресация

Для 10-битного адреса первый байт после START имеет вид 11110XX плюс R/W, где XX — два старших бита адреса, а второй байт несёт остальные восемь. Чтобы прочитать такое устройство, ведущий передаёт оба байта с R/W = 0, затем повторный START и только первый байт, уже с R/W = 1. Устройства с 7- и 10-битными адресами уживаются на одной шине, но на практике 10-битная адресация встречается редко — так пишет и сама NXP.

Зарезервированные адреса, общий вызов и программный сброс

Две группы по восемь адресов, 0000 XXX и 1111 XXX, зарезервированы (таблица 4 UM10204):

Адрес (7 бит)R/WНазначение
0000 000 (0x00)0общий вызов (general call)
0000 000 (0x00)1START-байт
0000 001 (0x01)любойадрес шины CBUS
0000 010 (0x02)любойдля шин другого формата
0000 011 (0x03)любойрезерв на будущее
0000 1XX (0x04–0x07)любойкод ведущего High-speed mode
1111 1XX (0x7C–0x7F)1Device ID
1111 0XX (0x78–0x7B)любойпервый байт 10-битного адреса

Общий вызов адресует все устройства сразу; смысл задаёт второй байт. 0x06 — сброс и загрузка программируемой части адреса (это и есть программный сброс), 0x04 — загрузка адреса без сброса, 0x00 использовать запрещено. Поддержка общего вызова необязательна, многие микросхемы его просто не подтверждают. START-байт 0000 0001 помогает микроконтроллерам без аппаратного I²C, которые опрашивают шину программно: семь нулей подряд легко поймать редким опросом. Device ID — необязательное трёхбайтовое поле с кодом производителя (12 бит), кодом микросхемы (9 бит) и ревизией кристалла (3 бита).

Растягивание такта

Ведомое может придержать SCL в нуле, когда не успевает: после приёма байта, пока сохраняет его или готовит ответ, либо на каждом бите, если у него медленная программная реализация. Ведущий обязан ждать, пока линия поднимется. Длительность растягивания в I²C не ограничена — это законная пауза, а не ошибка. Большинство простых ведомых растягивать такт не умеют вовсе, у них нет выходного транзистора на SCL. В режиме Hs такт растягивают только на уровне байта, в UFm — никак.

Синхронизация тактов и арбитраж

Если два ведущих начали передачу одновременно, их такты складываются на SCL по тому же правилу монтажного И. Низкий уровень длится до тех пор, пока его держит ведущий с самым длинным полупериодом нуля, а высокий заканчивается вместе с самым коротким полупериодом единицы. В итоге оба ведущих работают от общего такта.

Арбитраж идёт побитно по SDA. Каждый ведущий, выставив бит, сверяет его с фактическим уровнем линии. Первый, кто передал единицу, а увидел ноль, проиграл: он отпускает SDA, может выдавать такты до конца байта и повторяет попытку, когда шина освободится. Данные победителя при этом не искажаются, а приоритетов нет — исход решают сами адреса и данные: в первом несовпавшем бите выигрывает ноль, поэтому из двух адресов побеждает меньший. Если проигравший ведущий умеет работать и ведомым, а арбитраж решился на этапе адреса, он должен сразу перейти в режим ведомого: возможно, победитель обращается именно к нему.

Адреса I²C популярных микросхем

Все адреса ниже — 7-битные и сверены с даташитами производителей. У многих микросхем младшие биты адреса задаются выводами: их нужно явно соединить с землёй или питанием.

МикросхемаНазначениеАдресЧем задаётся
AT24C02, AT24C256 и другие EEPROM серии 24память0x50–0x57выводы A2–A0; у AT24C неподключённые выводы внутри притянуты к нулю, тогда адрес 0x50. У AT24C16 адресных выводов нет: эти три бита — старшие биты адреса ячейки памяти, и микросхема занимает все восемь адресов
DS1307часы реального времени0x68фиксирован; только 100 кГц
DS3231часы реального времени0x68фиксирован
PCF8574расширитель портов, модули LCD 16020x20–0x27выводы A2–A0
PCF8574Aрасширитель портов, модули LCD 16020x38–0x3Fвыводы A2–A0
SSD1306контроллер OLED-дисплея0x3C или 0x3Dвывод SA0 (он же D/C#)
BMP280, BME280давление, температура, влажность0x76 или 0x77вывод SDO: земля — 0x76, питание — 0x77; оставлять в воздухе нельзя
MPU-6050акселерометр и гироскоп0x68 или 0x69вывод AD0
ADS1115 (ADS1113, ADS1114)АЦП 16 бит0x48–0x4Bвывод ADDR на GND, VDD, SDA или SCL
INA219монитор тока и мощности0x40–0x4Fвыводы A1 и A0, каждый на GND, VS+, SDA или SCL — 16 адресов
PCA968516-канальный ШИМ0x40–0x7Fвыводы A5–A0; 0x70 по умолчанию занят групповым адресом LED All Call
BH1750датчик освещённости0x23 или 0x5Cвывод ADDR: низкий — 0x23, высокий — 0x5C
SHT30, SHT31, SHT35температура и влажность0x44 или 0x45вывод ADDR; оставлять в воздухе нельзя
TCA9548Aмультиплексор I²C на 8 каналов0x70–0x77выводы A2–A0

На готовых модулях адресные выводы обычно уже подключены, и сменить адрес можно перемычкой или площадкой на плате. Переходники для LCD 1602 на PCF8574 с выводами A2–A0, подтянутыми к питанию, отвечают по адресу 0x27, на PCF8574A — по 0x3F.

Конфликты, которые встречаются на практике:

  • 0x68: часы DS1307 или DS3231 и MPU-6050. Решение — подать на AD0 датчика единицу, он переедет на 0x69.
  • 0x40: INA219 с выводами A0 и A1 на земле и PCA9685 с A5–A0 на земле. Одному из них нужно сменить адрес выводами.
  • 0x70: PCA9685 после включения откликается на 0x70 (LED All Call) и мешает мультиплексору TCA9548A с адресом по умолчанию 0x70. Перенесите мультиплексор выводами A2–A0 или отключите All Call в регистре MODE1 PCA9685.

7-битный и 8-битный адрес: откуда берутся 0x27 и 0x4E

Адрес занимает старшие семь бит первого байта, а младший бит — это R/W. Поэтому один и тот же адрес можно записать двумя способами: как 7-битное число или как готовый байт со сдвигом на разряд влево. Для PCF8574 с A2–A0 в единице NXP в таблице 4 даташита приводит оба варианта сразу: 7-битный адрес 27h, байт записи 4Eh и байт чтения 4Fh. Именно отсюда путаница с переходниками LCD: в одних статьях пишут 0x27, в других 0x4E, а устройство одно.

Как понять, какой формат ждёт ваш код:

  • Библиотека Wire в Arduino принимает 7-битный адрес: Wire.beginTransmission(0x27), а R/W добавляет сама.
  • HAL для STM32 ждёт уже сдвинутый адрес: в описании HAL_I2C_Master_Transmit сказано, что 7-битный адрес из даташита нужно сдвинуть влево перед вызовом, то есть передать 0x27 << 1.
  • Некоторые даташиты сразу указывают байт: у часов DS3231M адрес записан как D0h, что соответствует 7-битному 0x68.

Простая проверка: 7-битный адрес никогда не превышает 0x7F, а в рабочем диапазоне — 0x77. Если в документации стоят пары вида 0x4E/0x4F или число больше 0x77, перед вами байты, и адрес — это их значение, делённое на два.

Как найти адрес: сканер шины

Сканер по очереди посылает START, адрес с битом записи и STOP и смотрит, ответил ли кто-нибудь ACK — ровно то, что показано на временной диаграмме выше. Скетч для Arduino:

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin();
  for (uint8_t addr = 0x08; addr <= 0x77; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {  // 0 = ACK, 2 = NACK on address
      Serial.print("Found 0x");
      Serial.println(addr, HEX);
    }
  }
}

void loop() {}

Метод endTransmission() в ядре Arduino для AVR возвращает 0 при успехе, 1 — если данные не поместились в буфер, 2 — если адрес не подтвердили, 3 — если не подтвердили данные, 4 — при прочих ошибках шины и 5 — по таймауту. В Linux, например на Raspberry Pi, то же самое делает утилита i2cdetect из пакета i2c-tools.

Расчёт подтягивающих резисторов I²C

Слишком большой Rp не успевает зарядить ёмкость линии за допустимое время, слишком маленький требует от выходов больше тока, чем они обязаны дать. UM10204 в п. 7.1 даёт формулы для обеих границ.

Формулы UM10204

Минимальное сопротивление задаёт ток, который выход гарантированно втягивает при напряжении низкого уровня VOL(max):

Rp(min)=VDD−VOL(max)IOLR_{p(min)} = \frac{V_{DD} - V_{OL(max)}}{I_{OL}}

При VDD больше 2 В берут VOL(max) = 0,4 В и IOL = 3 мА для Standard- и Fast-mode или 20 мА для Fast-mode Plus. При VDD до 2 В спецификация гарантирует VOL = 0,2·VDD при токе 2 мА (для Fm и Fm+).

Максимальное сопротивление задаёт время нарастания. Линия заряжается по закону V(t)=VDD(1−e−t/RpCb)V(t) = V_{DD}\left(1 - e^{-t/R_pC_b}\right): уровня 0,3 VDD она достигает через t1=0,3567RpCbt_1 = 0{,}3567 R_p C_b, уровня 0,7 VDD — через t2=1,2040RpCbt_2 = 1{,}2040 R_p C_b. Разность и есть время нарастания tr=0,8473RpCbt_r = 0{,}8473 R_p C_b, откуда

Rp(max)=tr0,8473⋅CbR_{p(max)} = \frac{t_r}{0{,}8473 \cdot C_b}

где trt_r — 1000 нс для Sm, 300 нс для Fm и 120 нс для Fm+. Любой резистор из диапазона Rp(min)…Rp(max)R_{p(min)} \ldots R_{p(max)} формально подходит. Чем ближе к нижней границе, тем быстрее фронт и меньше влияние помех; чем ближе к верхней, тем меньше ток — UM10204 советует сдвигаться к верхней границе в портативных устройствах, где важен ток потребления.

Как оценить ёмкость шины

Ёмкость Cb складывается из выводов устройств, дорожек, разъёмов и проводов. Ориентиры:

  • Выводы микросхем: по UM10204 до 10 пФ на вывод каждого устройства. Мультиплексоры и ключи могут иметь больше, потому что соединяют несколько путей.
  • Дорожки на плате: порядка 0,5–1 пФ на сантиметр для дорожки над сплошным полигоном земли; точнее — по ширине дорожки и толщине диэлектрика.
  • Кабели: десятки пикофарад на метр, точное значение — в паспорте кабеля. Провода макетной платы и шлейфы добавляют ёмкость быстрее, чем кажется.

Надёжнее всего измерить. Подключите осциллограф к SDA или SCL, измерьте время нарастания между уровнями 0,3 и 0,7 VDD и пересчитайте: Cb=tr/(0,8473⋅Rp)C_b = t_r / (0{,}8473 \cdot R_p). Например, фронт 250 нс при Rp = 4,7 кОм соответствует ёмкости 250 нс/(0,8473⋅4,7 кОм)≈63250\ \text{нс} / (0{,}8473 \cdot 4{,}7\ \text{кОм}) \approx 63 пФ.

Пример расчёта: 3,3 В, Fast-mode, 200 пФ

Шина 400 кГц, питание 3,3 В, оценённая ёмкость линии 200 пФ — тот же пример, что разбирает Texas Instruments в SLVA689.

Rp(min)=3,3−0,43 мА=967 Ом,Rp(max)=300 нс0,8473⋅200 пФ=1,77 кОмR_{p(min)} = \frac{3{,}3 - 0{,}4}{3\ \text{мА}} = 967\ \text{Ом}, \qquad R_{p(max)} = \frac{300\ \text{нс}}{0{,}8473 \cdot 200\ \text{пФ}} = 1{,}77\ \text{кОм}

В диапазон попадают номиналы ряда E24 от 1,0 до 1,6 кОм. Возьмём 1,3 кОм — середину диапазона в логарифмическом масштабе, с одинаковым запасом до обеих границ. Проверка: время нарастания 0,8473⋅1,3 кОм⋅200 пФ≈2200{,}8473 \cdot 1{,}3\ \text{кОм} \cdot 200\ \text{пФ} \approx 220 нс из 300 допустимых, ток ключа (3,3−0,4)/1,3 кОм≈2,2(3{,}3 - 0{,}4)/1{,}3\ \text{кОм} \approx 2{,}2 мА из 3 мА. Даже с допуском ±5 % (1235–1365 Ом) оба условия выполняются: 231 нс и 2,35 мА.

Тот же расчёт для 5 В показывает, как быстро сужается окно: Rp(min)R_{p(min)} = 4,6 В / 3 мА = 1,53 кОм, и при 200 пФ в диапазон попадает единственный номинал E24 — 1,6 кОм. При 250 пФ Rp(max)R_{p(max)} = 1,42 кОм, и подходящего резистора нет вовсе. Это согласуется с UM10204: при 5 В ± 10 % обычный резистор вытягивает в Fast-mode около 200 пФ, дальше нужен источник тока, коммутируемая подтяжка или другие меры.

Калькулятор подтягивающих резисторов I²C

Введите напряжение подтяжки, режим и ёмкость линии. Калькулятор считает обе границы по формулам UM10204, показывает подходящие номиналы ряда E24 (если их нет — E96) и проверяет выбранный резистор по времени нарастания и току. Если ёмкость пока неизвестна, начните со 100 пФ для небольшой платы с парой модулей.

Исходные данные

В

обычно 3,3 или 5 В

Режим (максимальная частота SCL)
пФ

до 10 пФ на вывод каждого устройства плюс дорожки и провода

Результат

Рекомендуемый Rp
1,3 кОм
ряд E24, середина допустимого диапазона
Минимум Rp
967 Ом(3,3 В − 0,4 В) / 3 мА
Максимум Rp
1,77 кОм300 нс / (0,8473 · 200 пФ)
Подходят из ряда E24
1 кОм, 1,1 кОм, 1,2 кОм, 1,3 кОм, 1,5 кОм, 1,6 кОм
Время нарастания с 1,3 кОм
220 нснорма до 300 нс
Ток ключа при VOL = 0,4 В
2,2 мАдопустимо до 3 мА

Если подходящего резистора нет

Когда Rp(min)R_{p(min)} получается больше Rp(max)R_{p(max)}, помогают такие меры; все, кроме первой, перечислены в п. 7.2 UM10204:

  • Снизить ёмкость: укоротить провода, убрать лишние устройства и разъёмы.
  • Снизить частоту SCL. Предельная частота считается как fmax=1/(tLOW(min)+tHIGH(min)+tr+tf)f_{max} = 1 / (t_{LOW(min)} + t_{HIGH(min)} + t_r + t_f) с фактическими фронтами.
  • Перейти на устройства Fast-mode Plus: выходы на 20 мА позволяют взять резистор в 6–7 раз меньше.
  • Разделить шину буфером вроде PCA9517 или мультиплексором вроде PCA9546A и TCA9548A: каждый сегмент получает свой бюджет ёмкости.
  • Ускорить фронты коммутируемой подтяжкой или ускорителем фронтов (rise time accelerator), который на время фронта подключает дополнительный ток.

Согласование уровней 3,3 В и 5 В

Шина со смешанным питанием — частая ситуация: Arduino Uno на 5 В и датчик на 3,3 В. Напрямую она работает не всегда. Если подтянуть линии к 3,3 В, входу пятивольтового микроконтроллера с порогом 0,7·VDD нужно не меньше 3,5 В — такой уровень он единицей считать не обязан. Если подтянуть к 5 В, на выводы трёхвольтовой микросхемы придёт 5 В, а это допустимо, только если её входы рассчитаны на такое напряжение. Резистивный делитель тоже не поможет: линия двунаправленная, и делитель испортит ноль, который выставляет низковольтная сторона.

Классическое решение описано в NXP AN10441: по одному N-канальному MOSFET на каждую линию. Затвор подключают к меньшему напряжению питания, исток — к низковольтной части шины, сток — к высоковольтной. У каждой части свои подтягивающие резисторы к своему питанию.

Двунаправленный преобразователь уровней I2C на N-канальном MOSFETЗатвор транзистора VT1 подключён к питанию 3,3 В, исток — к линии SDA низковольтной части, сток — к линии SDA пятивольтовой части. У каждой части свой подтягивающий резистор к своему питанию. Встроенный диод сток–исток передаёт низкий уровень с пятивольтовой стороны.+3,3 ВRp1+5 ВRp2GSDVT1 (BSS138)SDA, 3,3 ВSDA, 5 Вк устройствам 3,3 Вк устройствам 5 Вдля SCL — такая же цепь на втором транзисторе
Двунаправленный преобразователь уровней на MOSFET по AN10441: одна линия SDA, для SCL — такая же цепь

Схема работает в трёх состояниях:

  1. Никто не тянет линию вниз. Исток подтянут к 3,3 В, затвор тоже на 3,3 В, напряжение затвор–исток ниже порога, и транзистор закрыт. Пятивольтовую сторону поднимает её собственный резистор до 5 В. Обе стороны в единице, каждая со своим уровнем.
  2. Ноль выставляет устройство на 3,3 В. Исток опускается, напряжение затвор–исток превышает порог, транзистор открывается, и через него то же устройство тянет вниз пятивольтовую сторону.
  3. Ноль выставляет устройство на 5 В. Сначала через встроенный диод сток–исток опускается низковольтная сторона, напряжение затвор–исток растёт, транзистор открывается, и пятивольтовое устройство дотягивает через него низковольтную сторону до нуля.

По AN10441 такой преобразователь работает в режимах Standard и Fast (до 400 кбит/с), но не предназначен для Hs-mode. Напряжение высоковольтной стороны в работе должно быть не ниже низковольтной; бонусом схема изолирует обесточенную часть шины от остальной. Чаще всего ставят BSS138: его пороговое напряжение — от 0,8 до 1,5 В, поэтому при 3,3 В на затворе запас хороший, а для стороны 1,8 В лучше выбрать транзистор с более низким порогом. Подтяжки каждой стороны рассчитывают отдельно, по своему VDD и своей ёмкости.

Готовые микросхемы-трансляторы

  • PCA9306 — тот же принцип на проходных ключах в одном корпусе: два канала и вход разрешения EN. По даташиту NXP опорное напряжение низковольтной стороны подают на VREF1 (от 1,0 до 3,6 В), а VREF2 вместе с EN подтягивают к питанию высоковольтной стороны резистором около 200 кОм; для лучшей работы VREF1 должно быть хотя бы на 1 В ниже напряжения на VREF2. Подтяжки, как и в дискретной схеме, нужны с обеих сторон. Микросхема рассчитана на режимы до Fast-mode Plus включительно, но это не буфер: ёмкости обеих сторон шины складываются.
  • TXS0102 — проходной ключ плюс ускорители фронтов (one-shot) и встроенные подтяжки 10 кОм на каждой линии. Рассчитан на открытый сток, но с оговорками. Внешние подтяжки складываются со встроенными параллельно. Низкий уровень проходит с падением напряжения на ключе: по даташиту выход гарантированно не выше 0,4 В, только если вход прижат не выше 0,15 В, тогда как устройство I²C вправе выдавать ноль до 0,4 В. При большой ёмкостной нагрузке ускоритель может не успеть дотянуть фронт; предел для открытого стока — 2 Мбит/с.
  • TXB0104, TXB0108 и модули на них для I²C не подходят: по даташиту TI они транслируют только двухтактные сигналы, внешние подтяжки допускаются не меньше 50 кОм, а для открытого стока производитель отсылает к серии TXS.
  • TCA9548A тоже умеет согласовывать уровни: его ключи ограничивают напряжение уровнем своего питания, а каждый канал подтягивается к своему напряжению — 1,8, 2,5, 3,3 или 5 В.

Мультиплексоры, буферы и длинные линии

Мультиплексор TCA9548A с адресами 0x70–0x77 подключает к одной шине ведущего восемь независимых каналов. Он решает две задачи: позволяет поставить несколько одинаковых устройств, например восемь датчиков с одним адресом, и делит ёмкость между каналами. Управление — один байт после адреса: бит n включает канал n, можно включить несколько каналов сразу. После включения питания все каналы отключены, а вывод RESET позволяет вернуть микросхему в исходное состояние без снятия питания — например, если один из каналов завис. Помните, что включённые одновременно каналы складывают ёмкости и подтяжки.

На длинном проводе I²C страдает от ёмкости и наводок. Рекомендации UM10204 (п. 7.5) для шлейфа или дорожек длиннее 10 см: класть провода в порядке SDA, VDD, VSS, SCL (или SDA, VSS, SCL, если питания в шлейфе нет) — тогда линии не наводят друг на друга и нагружены одинаково. В витой паре каждую линию свивают с общим проводом; экран соединяют с общим проводом, но кабель должен иметь малую ёмкость между SDA и SCL. Для защиты входов от выбросов в разрыв линий ставят резисторы около 300 Ом, но их надо учитывать в расчёте подтяжек и запаса по низкому уровню.

Для шины на несколько метров и больше применяют буферы и удлинители с повышенным током выходов — UM10204 упоминает буферы серии P82B, микросхемы Fast-mode Plus, ускорители фронтов. Если же нужно связать отдельные устройства в разных корпусах на десятки и сотни метров, честнее взять интерфейс, созданный для линий: RS-485 с дифференциальной передачей или хотя бы RS-232 на короткое расстояние.

I²C и TWI в микроконтроллерах AVR

В микроконтроллерах AVR аппаратный I²C называется TWI — 2-wire Serial Interface; в даташите ATmega328P он прямо описан как совместимый с Philips I2C и рассчитан на частоту SCL до 400 кГц. У ATmega328P линия SDA — это вывод PC4, SCL — PC5. Модулем управляют шесть регистров: TWBR (делитель частоты), TWCR (управление), TWSR (статус и предделитель), TWDR (данные) и TWAR с TWAMR (собственный адрес и маска для режима ведомого).

Частота SCL в режиме ведущего:

fSCL=fCPU16+2⋅TWBR⋅Nf_{SCL} = \frac{f_{CPU}}{16 + 2 \cdot TWBR \cdot N}

где N — предделитель 1, 4, 16 или 64 (биты TWPS в TWSR). При тактовой частоте 16 МГц и N = 1 значение TWBR = 72 даёт 100 кГц, TWBR = 12 — 400 кГц. Реальная частота будет чуть ниже: фронты конечной длительности и растягивание такта ведомыми удлиняют период.

Встроенные подтягивающие резисторы AVR (20–50 кОм) включаются битами PORT, и библиотека Wire в Arduino включает их сама. Даташит допускает, что в некоторых системах их хватит без внешних, но запас тут мал: даже 20 кОм при ёмкости 100 пФ дают время нарастания 0,8473⋅20 кОм⋅100 пФ≈1,70{,}8473 \cdot 20\ \text{кОм} \cdot 100\ \text{пФ} \approx 1{,}7 мкс — больше 1000 нс, допустимых даже на 100 кГц, а с худшими 50 кОм норма выполняется, только если ёмкость линии меньше 24 пФ. Поэтому на практике ставят внешние резисторы.

Минимальный драйвер ведущего на регистрах — чтение одного регистра с повторным START. Коды статуса взяты из таблиц главы 26 даташита; в каждом шаге сравнивается ожидаемый код:

#include <avr/io.h>

#define F_SCL 100000UL

void twi_init(void) {
  TWSR = 0;                                    /* prescaler N = 1 */
  TWBR = (uint8_t)((F_CPU / F_SCL - 16) / 2);  /* 72 at F_CPU = 16 MHz */
}

static uint8_t twi_cmd(uint8_t flags) {
  TWCR = (1 << TWINT) | (1 << TWEN) | flags;   /* writing 1 to TWINT starts the action */
  while (!(TWCR & (1 << TWINT))) {}
  return TWSR & 0xF8;                          /* status code without prescaler bits */
}

/* S, SLA+W, reg, Sr, SLA+R, data + NACK, P. Returns the byte or -1 on error. */
int twi_read_reg(uint8_t addr, uint8_t reg) {
  int result = -1;
  do {
    if (twi_cmd(1 << TWSTA) != 0x08) break;    /* START sent */
    TWDR = (uint8_t)(addr << 1);               /* SLA+W */
    if (twi_cmd(0) != 0x18) break;             /* address ACKed */
    TWDR = reg;
    if (twi_cmd(0) != 0x28) break;             /* register number ACKed */
    if (twi_cmd(1 << TWSTA) != 0x10) break;    /* repeated START sent */
    TWDR = (uint8_t)((addr << 1) | 1);         /* SLA+R */
    if (twi_cmd(0) != 0x40) break;             /* address ACKed */
    if (twi_cmd(0) == 0x58) result = TWDR;     /* byte received, NACK returned (TWEA = 0) */
  } while (0);
  TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWSTO);  /* STOP */
  while (TWCR & (1 << TWSTO)) {}                     /* TWSTO clears once STOP is sent */
  return result;
}

Код 0x20 вместо 0x18 означает NACK на адрес — устройства с таким адресом нет. Код 0x38 — ведущий проиграл арбитраж.

I²C, SMBus и PMBus: в чём разница

SMBus (System Management Bus) разработали Intel и другие компании в 1995 году для управления питанием и мониторинга в компьютерах. Он использует то же железо и ту же адресацию, поэтому устройства SMBus и I²C в большинстве случаев работают вместе, но есть отличия, которые важно помнить, когда на одной шине оказываются микросхемы обоих стандартов. Ниже — по SMBus 3.3.1 и UM10204:

СвойствоI²C (UM10204)SMBus 3.x
Частотаот 0 до 100 кГц, 400 кГц, 1 МГц, 3,4 МГцот 10 до 100 кГц, 400 кГц или 1 МГц, минимум 10 кГц
Удержание SCL в нулене ограниченотаймаут: при низком SCL дольше 25 мс устройства сбрасывают интерфейс, не позднее 35 мс
Пороги входов0,3·VDD и 0,7·VDDфиксированные: VIL = 0,8 В, VIH = 1,35 В (до версии 3.0 — 2,1 В)
Подтверждение своего адресане обязательнообязательно
Протокол поверх байтовопределяет производительстандартные команды, контроль ошибок PEC (CRC-8 с полиномом x⁸ + x² + x + 1), ARP, сигнал SMBALERT#

Отсюда практические следствия. Шина I²C медленнее 10 кГц выходит за спецификацию SMBus: по UM10204, устройства SMBus на ней могут сработать по таймауту. Ведомое I²C, которое держит SCL в нуле дольше 25 мс, на шине SMBus сорвёт обмен: устройства SMBus сочтут шину зависшей и сбросят свой интерфейс. А PMBus — это набор команд для управления источниками питания поверх SMBus: транспорт у него тот же SMBus с небольшими расширениями.

Типичные ошибки и отладка

СимптомВероятная причинаЧто проверить
Сканер ничего не находит или зависаетнет подтяжек, нет общего провода, перепутаны SDA и SCLнапряжение на свободной шине должно быть около VDD на обеих линиях
Устройство не отвечает на адрес из даташита8-битный адрес вместо 7-битного, адресный вывод в воздухеразделить адрес на два; посадить SDO, ADDR, A0 на землю или питание
Два устройства мешают друг другуодинаковые адресатаблица адресов выше; сменить адрес выводом или развести по каналам TCA9548A
Работает на 100 кГц, сбоит на 400 кГцслишком слабая подтяжка или большая ёмкостьфронт осциллографом: не длиннее 300 нс от 0,3 до 0,7 VDD
Ноль на линии выше 0,4 Вслишком сильная подтяжка, несколько модулей со своими резисторамиобщее сопротивление подтяжек и ток ключа
Шина зависает в нуле после сброса микроконтроллераведомое прервали посреди байта, и оно держит SDAпроцедура восстановления, см. ниже
Ошибки при подключении 5-вольтовых и 3,3-вольтовых модулейнесогласованные уровнипреобразователь уровней на MOSFET

Слишком много подтяжек: модули в параллель

Почти каждый готовый модуль с I²C несёт свои подтяжки, чаще всего 4,7 или 10 кОм — на плате это SMD-резисторы с маркировкой 472 или 103 (расшифровка кода). Когда модулей несколько, их резисторы оказываются включены параллельно. Четыре модуля с 4,7 кОм на шине 5 В дают:

R=4,7 кОм4=1,175 кОм,I=5−0,41,175 кОм≈3,9 мАR = \frac{4{,}7\ \text{кОм}}{4} = 1{,}175\ \text{кОм}, \qquad I = \frac{5 - 0{,}4}{1{,}175\ \text{кОм}} \approx 3{,}9\ \text{мА}

Это больше 3 мА, которые обязано втянуть устройство Standard- или Fast-mode, и меньше минимальных 1,53 кОм для 5 В. Слабый выход не опустит линию до 0,4 В, и ноль может прочитаться как единица. Лечится просто: оставить одну пару подтяжек, на остальных модулях выпаять резисторы или разомкнуть перемычки, если они предусмотрены. Проверить итог помогает закон Ома: ток ключа — это (VDD − VOL), делённое на общее сопротивление подтяжек.

Шина зависла в нуле: процедура восстановления

Типичная ситуация: микроконтроллер перезагрузился посреди чтения, а ведомое как раз выдавало ноль и продолжает держать SDA в ожидании тактов. Ведущий видит занятую шину и не может сформировать START. UM10204 (п. 3.1.16) предписывает: если в нуле застряла SDA, ведущий подаёт девять тактовых импульсов на SCL — за это время ведомое досылает байт и должно отпустить линию (драйверы обычно прекращают такты, как только SDA поднялась). Если не помогло, нужен аппаратный сброс или выключение питания устройств. Если же в нуле застряла SCL, остаётся только аппаратный сброс или выключение питания. После освобождения SDA ведущему разумно сформировать STOP, чтобы все устройства вернулись в исходное состояние; сама спецификация о STOP в этой процедуре не говорит, но так делают большинство драйверов.

Пример для ATmega328P: модуль TWI отключается, линии переключаются в режим программного открытого стока:

#include <avr/io.h>
#include <util/delay.h>

/* Open-drain emulation: "release" = input without pull-up, the external Rp pulls the line up. */
static void release(uint8_t bit) { DDRC &= ~(1 << bit); PORTC &= ~(1 << bit); }
static void pull_low(uint8_t bit) { PORTC &= ~(1 << bit); DDRC |= (1 << bit); }

void i2c_bus_recover(void) {
  TWCR = 0;                          /* disconnect TWI from PC4/PC5 */
  release(PC4);                      /* SDA */
  release(PC5);                      /* SCL */
  _delay_us(5);
  for (uint8_t i = 0; i < 9 && !(PINC & (1 << PC4)); i++) {
    pull_low(PC5);                   /* up to nine clocks while SDA is held low */
    _delay_us(5);
    release(PC5);
    _delay_us(5);
  }
  pull_low(PC5);                     /* STOP: SDA goes low while SCL is low... */
  pull_low(PC4);
  _delay_us(5);
  release(PC5);                      /* ...SCL goes high... */
  _delay_us(5);
  release(PC4);                      /* ...and SDA rises while SCL is high */
  _delay_us(5);
}

Чтобы скетч Arduino не зависал навсегда на застрявшей шине, включите таймаут: Wire.setWireTimeout(25000, true) — 25 мс и сброс модуля TWI по таймауту. В ядре для AVR таймаут по умолчанию выключен ради совместимости со старыми версиями библиотеки.

Логический анализатор и осциллограф

Логический анализатор с декодером I²C показывает обмен байт за байтом: START, адрес, ACK или NACK, данные. Это самый быстрый способ понять, откликается ли устройство и что именно оно отвечает. Частоту выборки берите с большим запасом относительно частоты SCL, иначе декодер будет путать START, STOP и биты данных. В настройках декодера обычно можно выбрать, показывать адрес 7-битным или 8-битным, — сверьте с тем, как он записан в вашем коде.

Логический анализатор видит только единицы и нули, поэтому аналоговые проблемы ищут осциллографом:

  • время нарастания от 0,3 до 0,7 VDD — не больше 1000, 300 или 120 нс для своего режима;
  • уровень нуля — не выше 0,4 В: если выше, подтяжка слишком сильная или где-то стоит последовательный резистор;
  • звон и выбросы на длинных проводах;
  • единица на свободной шине — около VDD; если ниже, какое-то устройство подгружает линию или не запитано.

Дальше по теме: другие интерфейсы — в разделе интерфейсы, особенности конкретных микроконтроллеров — в разделе AVR.

Частые вопросы

Какие подтягивающие резисторы ставить на I2C: 4,7 кОм или 10 кОм?

Зависит от напряжения, частоты и ёмкости шины. Нижнюю границу задаёт допустимый ток 3 мА: при 5 В это 1,53 кОм, при 3,3 В — 967 Ом. Верхнюю — время нарастания фронта: при ёмкости линии 100 пФ на 100 кГц допустимо до 11,8 кОм, на 400 кГц — до 3,54 кОм. Поэтому 4,7 кОм хорошо подходит для 100 кГц, для 400 кГц берут 2,2–3,3 кОм, а 10 кОм годится только для медленной шины с ёмкостью меньше 118 пФ.

Чем TWI отличается от I2C?

По сути ничем: TWI (Two-Wire Serial Interface) — название аппаратного модуля I²C в микроконтроллерах Atmel, теперь Microchip. В даташите ATmega328P он прямо назван совместимым с Philips I2C. Отличаются только имена регистров (TWBR, TWCR, TWSR, TWDR), а адреса, кадры и электрические требования — те же, что у любого устройства I²C.

Сколько устройств можно подключить к шине I2C?

При 7-битной адресации свободно 112 адресов: 16 из 128 зарезервированы спецификацией. Но обычно раньше кончается ёмкость: не больше 400 пФ на линию на 100 и 400 кГц и 550 пФ в Fast-mode Plus, а каждый вывод добавляет до 10 пФ плюс дорожки и провода. Одинаковые адреса и лишнюю ёмкость разносят по каналам мультиплексора, например TCA9548A, или разделяют буферами.

Почему сканер нашёл адрес 0x27, а в даташите написано 0x4E?

Это одно и то же. 0x27 — 7-битный адрес, а 0x4E — байт адреса: адрес, сдвинутый на разряд влево, с битом записи в младшем разряде; 0x4F — тот же байт с битом чтения. Библиотека Wire в Arduino ожидает 7-битный адрес, HAL для STM32 — уже сдвинутый.

Можно ли соединить устройства на 3,3 и 5 В по I2C без преобразователя уровней?

Только в частных случаях. Если подтянуть шину к 3,3 В, пятивольтовому входу с порогом 0,7·VDD нужно не меньше 3,5 В, и единицу он может не увидеть. Если подтянуть к 5 В, на выводы 3,3-вольтовой микросхемы придёт 5 В, что допустимо только для входов, рассчитанных на 5 В. Надёжное решение — двунаправленный преобразователь уровней на N-канальном MOSFET или специализированная микросхема.

Какая максимальная длина линии I2C?

Спецификация ограничивает не длину, а ёмкость линии: 400 пФ на 100 и 400 кГц и 550 пФ в Fast-mode Plus. Сколько это метров, зависит от кабеля и числа устройств. В пределах платы и коротких шлейфов I²C работает без ухищрений, а для метров и десятков метров ставят буферы, снижают частоту или передают данные дифференциальным интерфейсом вроде RS-485.

Источники

  1. NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — п. 3.1 — протокол, табл. 4 — зарезервированные адреса, п. 3.1.16 — восстановление шины, табл. 10 и 11 — электрические и временные параметры, п. 5 — режимы скорости, п. 7.1 — расчёт подтяжек, п. 7.2–7.5 — большая ёмкость и разводка
  2. Texas Instruments. SLVA689: I2C Bus Pullup Resistor Calculation (R. Arora, 2015) — формулы Rp(min) и Rp(max), пример для 3,3 В, Fast-mode и 200 пФ
  3. NXP Semiconductors. AN10441: Level shifting techniques in I2C-bus design, Rev. 01, 18 June 2007 — двунаправленный преобразователь уровней на N-канальном MOSFET для Standard- и Fast-mode; сейчас документ публикует Nexperia (Rev. 2, 2020), статья сверена по Rev. 01
  4. System Management Interface Forum. System Management Bus (SMBus) Specification, Version 3.3.1, 2024 — табл. 2 — частота от 10 кГц и таймаут 25–35 мс; приложение B — отличия SMBus от I2C
  5. Atmel. ATmega328/P Datasheet Complete, Atmel-42735B, 11/2016 — гл. 26 — модуль TWI, табл. 32-2 — встроенные подтяжки, табл. 32-10 — требования к шине
  6. NXP Semiconductors. PCF8574; PCF8574A: Remote 8-bit I/O expander for I2C-bus with interrupt, Rev. 5, 2013 — табл. 4 и 5 — 7-битные адреса и байты адреса для записи и чтения
  7. Texas Instruments. TCA9548A Low-Voltage 8-Channel I2C Switch with Reset, SCPS207G, 2019
  8. Texas Instruments. TXS0102 2-Bit Bidirectional Voltage-Level Translator for Open-Drain and Push-Pull Applications, SCES640I, 2018; TXB0104, SCES650G, 2014; TXB0108, SCES643F, 2014
  9. NXP Semiconductors. PCA9306: Dual bidirectional I2C-bus and SMBus voltage-level translator, Rev. 9.5, 2023
  10. Даташиты микросхем из таблицы адресов — Microchip AT24C02C (DS20006111A), AT24C16C (DS20006051A) и AT24C256C (DS20006042A); Maxim DS1307 (rev. 3/15), DS3231 (19-5170, rev. 10) и DS3231M (19-5312, rev. 7); Solomon Systech SSD1306 (rev. 1.5); Bosch Sensortec BMP280 (BST-BMP280-DS001-26) и BME280 (BST-BME280-DS001-23); InvenSense MPU-6000/6050 (PS-MPU-6000A-00, rev. 3.4); TI ADS1115 (SBAS444D) и INA219 (SBOS448G); NXP PCA9685 (rev. 4); ROHM BH1750FVI; Sensirion SHT3x-DIS (версия 4); для преобразователя уровней — Fairchild BSS138 (10/2005)
  11. Arduino. ArduinoCore-avr, библиотека Wire (Wire.cpp, utility/twi.c) — коды возврата endTransmission(), таймаут setWireTimeout(), включение встроенных подтяжек
  12. STMicroelectronics. STM32F4 HAL, драйвер stm32f4xx_hal_i2c.c — описание параметра DevAddress функции HAL_I2C_Master_Transmit