Шина I²C (I2C, IIC, TWI)
I²C — двухпроводная шина для связи микросхем внутри устройства: линия данных SDA и тактовая линия SCL с открытым стоком, подтянутые резисторами к питанию. Здесь — протокол по спецификации NXP UM10204, адреса популярных датчиков и расчёт подтяжек с калькулятором.
Обновлено Редакция GAW
Содержание
- Как устроена шина I²C
- Режимы и скорости I²C
- Протокол I²C: START, адрес, данные, ACK и STOP
- Адреса I²C популярных микросхем
- Расчёт подтягивающих резисторов I²C
- Согласование уровней 3,3 В и 5 В
- Мультиплексоры, буферы и длинные линии
- I²C и TWI в микроконтроллерах AVR
- I²C, SMBus и PMBus: в чём разница
- Типичные ошибки и отладка
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.
- Подтяжка: , . Для 3,3 В, 400 кГц и 200 пФ — от 967 Ом до 1,77 кОм.
- TWI в микроконтроллерах AVR — это тот же I²C. SMBus совместим с ним по протоколу, но вводит таймаут 25–35 мс и минимальную частоту 10 кГц.
Как устроена шина I²C
Устройства подключаются к SDA и SCL параллельно, без отдельных линий выбора. Каждое ведомое откликается только на свой адрес, поэтому к двум выводам микроконтроллера можно повесить десяток микросхем. Ведущих на шине тоже может быть несколько: I²C — шина с несколькими ведущими (multi-master), конфликты между ними решает арбитраж.
Выходы на шине устроены по схеме «открытый сток» (у биполярных микросхем — «открытый коллектор»). Чтобы передать ноль, устройство открывает транзистор и замыкает линию на землю. Чтобы передать единицу, оно ничего не делает: транзистор закрыт, и линию поднимает до 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, а не от частоты, которую выставил программист.
Режимы и скорости 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 (минимальные, если не указано «не более»):
| Параметр | Sm | Fm | Fm+ |
|---|---|---|---|
| Частота SCL, не более | 100 кГц | 400 кГц | 1000 кГц |
| Удержание (повторного) START tHD;STA | 4,0 мкс | 0,6 мкс | 0,26 мкс |
| Низкий уровень SCL tLOW | 4,7 мкс | 1,3 мкс | 0,5 мкс |
| Высокий уровень SCL tHIGH | 4,0 мкс | 0,6 мкс | 0,26 мкс |
| Подготовка повторного START tSU;STA | 4,7 мкс | 0,6 мкс | 0,26 мкс |
| Установка данных до фронта SCL tSU;DAT | 250 нс | 100 нс | 50 нс |
| Подготовка STOP tSU;STO | 4,0 мкс | 0,6 мкс | 0,26 мкс |
| Пауза между STOP и START tBUF | 4,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 пять:
- На шине нет устройства с таким адресом.
- Приёмник занят и пока не может принимать — так, например, ведёт себя EEPROM во время внутренней записи (до 5 мс у AT24C02C).
- Приёмник получил команду или данные, которые не понимает.
- Приёмник больше не может принимать байты.
- Ведущий-приёмник сообщает ведомому, что прочитал последний нужный байт.
После NACK ведущий завершает обмен STOP или начинает новый повторным START.
Адрес и бит R/W
Первый байт после START — адрес ведомого: 7 старших бит адреса и младший бит направления R/W. Ноль в R/W означает запись (ведущий передаёт), единица — чтение (ведомый отвечает). Ведомое с таким адресом подтверждает байт ACK, остальные молчат.
Пример: чтение регистра с повторным START
Почти все датчики и микросхемы памяти устроены как набор регистров. Чтобы прочитать регистр, ведущий сначала записывает его номер, а затем, не отпуская шину, переключается на чтение. Разберём побайтно чтение регистра идентификатора 0xD0 датчика BME280 с адресом 0x76: по даташиту Bosch там всегда лежит 0x60 (у BMP280 — 0x58, так их и различают).
| Шаг | Передаёт | На линии | Смысл |
|---|---|---|---|
| 1 | ведущий | S | START |
| 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 | ведущий | P | STOP |
Если продолжать подтверждать байты, датчик выдаст следующие регистры подряд — автоинкремент адреса регистра есть почти у всех таких микросхем. В 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) | 1 | START-байт |
| 0000 001 (0x01) | любой | адрес шины CBUS |
| 0000 010 (0x02) | любой | для шин другого формата |
| 0000 011 (0x03) | любой | резерв на будущее |
| 0000 1XX (0x04–0x07) | любой | код ведущего High-speed mode |
| 1111 1XX (0x7C–0x7F) | 1 | Device 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 1602 | 0x20–0x27 | выводы A2–A0 |
| PCF8574A | расширитель портов, модули LCD 1602 | 0x38–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 адресов |
| PCA9685 | 16-канальный ШИМ | 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):
При VDD больше 2 В берут VOL(max) = 0,4 В и IOL = 3 мА для Standard- и Fast-mode или 20 мА для Fast-mode Plus. При VDD до 2 В спецификация гарантирует VOL = 0,2·VDD при токе 2 мА (для Fm и Fm+).
Максимальное сопротивление задаёт время нарастания. Линия заряжается по закону : уровня 0,3 VDD она достигает через , уровня 0,7 VDD — через . Разность и есть время нарастания , откуда
где — 1000 нс для Sm, 300 нс для Fm и 120 нс для Fm+. Любой резистор из диапазона формально подходит. Чем ближе к нижней границе, тем быстрее фронт и меньше влияние помех; чем ближе к верхней, тем меньше ток — UM10204 советует сдвигаться к верхней границе в портативных устройствах, где важен ток потребления.
Как оценить ёмкость шины
Ёмкость Cb складывается из выводов устройств, дорожек, разъёмов и проводов. Ориентиры:
- Выводы микросхем: по UM10204 до 10 пФ на вывод каждого устройства. Мультиплексоры и ключи могут иметь больше, потому что соединяют несколько путей.
- Дорожки на плате: порядка 0,5–1 пФ на сантиметр для дорожки над сплошным полигоном земли; точнее — по ширине дорожки и толщине диэлектрика.
- Кабели: десятки пикофарад на метр, точное значение — в паспорте кабеля. Провода макетной платы и шлейфы добавляют ёмкость быстрее, чем кажется.
Надёжнее всего измерить. Подключите осциллограф к SDA или SCL, измерьте время нарастания между уровнями 0,3 и 0,7 VDD и пересчитайте: . Например, фронт 250 нс при Rp = 4,7 кОм соответствует ёмкости пФ.
Пример расчёта: 3,3 В, Fast-mode, 200 пФ
Шина 400 кГц, питание 3,3 В, оценённая ёмкость линии 200 пФ — тот же пример, что разбирает Texas Instruments в SLVA689.
В диапазон попадают номиналы ряда E24 от 1,0 до 1,6 кОм. Возьмём 1,3 кОм — середину диапазона в логарифмическом масштабе, с одинаковым запасом до обеих границ. Проверка: время нарастания нс из 300 допустимых, ток ключа мА из 3 мА. Даже с допуском ±5 % (1235–1365 Ом) оба условия выполняются: 231 нс и 2,35 мА.
Тот же расчёт для 5 В показывает, как быстро сужается окно: = 4,6 В / 3 мА = 1,53 кОм, и при 200 пФ в диапазон попадает единственный номинал E24 — 1,6 кОм. При 250 пФ = 1,42 кОм, и подходящего резистора нет вовсе. Это согласуется с UM10204: при 5 В ± 10 % обычный резистор вытягивает в Fast-mode около 200 пФ, дальше нужен источник тока, коммутируемая подтяжка или другие меры.
Калькулятор подтягивающих резисторов I²C
Введите напряжение подтяжки, режим и ёмкость линии. Калькулятор считает обе границы по формулам UM10204, показывает подходящие номиналы ряда E24 (если их нет — E96) и проверяет выбранный резистор по времени нарастания и току. Если ёмкость пока неизвестна, начните со 100 пФ для небольшой платы с парой модулей.
Исходные данные
обычно 3,3 или 5 В
до 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 мА
Если подходящего резистора нет
Когда получается больше , помогают такие меры; все, кроме первой, перечислены в п. 7.2 UM10204:
- Снизить ёмкость: укоротить провода, убрать лишние устройства и разъёмы.
- Снизить частоту SCL. Предельная частота считается как с фактическими фронтами.
- Перейти на устройства 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 на каждую линию. Затвор подключают к меньшему напряжению питания, исток — к низковольтной части шины, сток — к высоковольтной. У каждой части свои подтягивающие резисторы к своему питанию.
Схема работает в трёх состояниях:
- Никто не тянет линию вниз. Исток подтянут к 3,3 В, затвор тоже на 3,3 В, напряжение затвор–исток ниже порога, и транзистор закрыт. Пятивольтовую сторону поднимает её собственный резистор до 5 В. Обе стороны в единице, каждая со своим уровнем.
- Ноль выставляет устройство на 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 в режиме ведущего:
где N — предделитель 1, 4, 16 или 64 (биты TWPS в TWSR). При тактовой частоте 16 МГц и N = 1 значение TWBR = 72 даёт 100 кГц, TWBR = 12 — 400 кГц. Реальная частота будет чуть ниже: фронты конечной длительности и растягивание такта ведомыми удлиняют период.
Встроенные подтягивающие резисторы AVR (20–50 кОм) включаются битами PORT, и библиотека Wire в Arduino включает их сама. Даташит допускает, что в некоторых системах их хватит без внешних, но запас тут мал: даже 20 кОм при ёмкости 100 пФ дают время нарастания мкс — больше 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 В дают:
Это больше 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.
Источники
- 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 — большая ёмкость и разводка
- Texas Instruments. SLVA689: I2C Bus Pullup Resistor Calculation (R. Arora, 2015) — формулы Rp(min) и Rp(max), пример для 3,3 В, Fast-mode и 200 пФ
- 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
- System Management Interface Forum. System Management Bus (SMBus) Specification, Version 3.3.1, 2024 — табл. 2 — частота от 10 кГц и таймаут 25–35 мс; приложение B — отличия SMBus от I2C
- Atmel. ATmega328/P Datasheet Complete, Atmel-42735B, 11/2016 — гл. 26 — модуль TWI, табл. 32-2 — встроенные подтяжки, табл. 32-10 — требования к шине
- NXP Semiconductors. PCF8574; PCF8574A: Remote 8-bit I/O expander for I2C-bus with interrupt, Rev. 5, 2013 — табл. 4 и 5 — 7-битные адреса и байты адреса для записи и чтения
- Texas Instruments. TCA9548A Low-Voltage 8-Channel I2C Switch with Reset, SCPS207G, 2019
- Texas Instruments. TXS0102 2-Bit Bidirectional Voltage-Level Translator for Open-Drain and Push-Pull Applications, SCES640I, 2018; TXB0104, SCES650G, 2014; TXB0108, SCES643F, 2014
- NXP Semiconductors. PCA9306: Dual bidirectional I2C-bus and SMBus voltage-level translator, Rev. 9.5, 2023
- Даташиты микросхем из таблицы адресов — 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)
- Arduino. ArduinoCore-avr, библиотека Wire (Wire.cpp, utility/twi.c) — коды возврата endTransmission(), таймаут setWireTimeout(), включение встроенных подтяжек
- STMicroelectronics. STM32F4 HAL, драйвер stm32f4xx_hal_i2c.c — описание параметра DevAddress функции HAL_I2C_Master_Transmit
Смотрите также
- RS-485Уровни, длина линии, терминаторы, смещение, MAX485, Modbus RTU
- RS-232Уровни, распиновка DB9, нуль-модем, MAX3232, UART и AVR
- AVRATmega, ATtiny, AVR Dx/Ex: семейства, прошивка, инструменты
- Последовательное и параллельное соединениеR, C, L: общее значение и подбор пары
- Код SMD-резистора103, 4R7, 01C → номинал и обратно
- Закон ОмаU, I, R и P по любым двум величинам