Будет ли работать I2C без подтягивающих резисторов?
Обновлено Редакция GAW
Спецификация I²C (NXP UM10204) построена на выходах с открытым стоком: устройство может только замкнуть линию на землю или отпустить её. Отпущенную линию поднимает к питанию подтягивающий резистор. Если резистора нет, линия после отпускания «висит», и ни ведущий, ни ведомые не видят чёткой единицы.
Хватит ли встроенной подтяжки
Время нарастания по уровням 30–70 % считают по формуле TI SLVA689:
Расчёт ниже — наш, по этой формуле, для ёмкости линии 100 пФ (несколько модулей и провода в десятки сантиметров):
| Подтяжка | tr при 100 пФ | Предел 100 кГц (1000 нс) | Предел 400 кГц (300 нс) |
|---|---|---|---|
| 20 кОм (лучший случай ATmega328P) | 1,7 мкс | превышен | превышен |
| 50 кОм (худший случай) | 4,2 мкс | превышен | превышен |
| 4,7 кОм внешний | 0,4 мкс | выполнен | превышен |
| 2,2 кОм внешний | 0,19 мкс | выполнен | выполнен |
Даже лучший случай встроенной подтяжки не укладывается в требования стандартного режима. На столе с одним датчиком и короткими проводами ёмкость меньше, и обмен может идти — но без гарантии, тем более при нагреве и длинных проводах.
Что делать
Поставьте по одному резистору от SDA и от SCL к питанию шины. Номинал зависит от ёмкости и скорости: его посчитает калькулятор подтяжки I2C. Если на шине уже есть модули со своими резисторами, они соединены параллельно — учитывайте общее сопротивление, иначе ток превысит 3 мА, на которые рассчитаны выходы. Наш пример: три модуля с подтяжкой 4,7 кОм параллельно дают 1,57 кОм — почти минимум 1,53 кОм для шины 5 В; четвёртый такой модуль уже выводит шину за предел.
Подробнее о шине — на странице интерфейса I2C, о самом приёме — в термине «подтягивающий резистор», а о том, как фронт зависит от ёмкости, — в термине «время нарастания».
Похожие вопросы
Почему с одним модулем I2C работает без резисторов, а с другим нет?
Многие модули — дисплеи, датчики, часы — уже несут подтяжку на своей плате, обычно на несколько килоом. Шина работает за счёт неё. Модуль без своих резисторов на той же шине без внешней подтяжки работать не будет.
Сколько встроенных резисторов можно считать подтяжкой?
Встроенные резисторы ATmega328P — от 20 до 50 кОм, и производитель не нормирует их для I2C. Считайте их запасным вариантом для отладки, а в готовой схеме ставьте внешние резисторы, рассчитанные по ёмкости шины.
Что видно на осциллографе, когда подтяжки не хватает?
Вместо прямоугольников — пологие фронты нарастания при резких спадах: линию быстро прижимает к нулю транзистор, а поднимает медленно слабый резистор. Если фронт не успевает дойти до уровня единицы, ведущий читает ошибки и не получает подтверждения.
Источники
- NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.1 — SDA и SCL подключены к питанию через подтягивающий резистор или источник тока, выходы устройств — открытый сток; табл. 11 — время нарастания tr не больше 1000 нс в Standard-mode (100 кГц) и 300 нс в Fast-mode (400 кГц), ёмкость линии Cb до 400 пФ
- Texas Instruments. I2C Bus Pullup Resistor Calculation (SLVA689A, February 2015, rev. October 2026) — ур. 5 — время нарастания от 30 до 70 % уровня tr = 0,8473 · Rp · Cb; верхний предел Rp(max) = tr / (0,8473 · Cb); нижний предел по току 3 мА при VOL 0,4 В
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — табл. 30-1 — сопротивление встроенной подтяжки вывода RPU от 20 до 50 кОм
Нашли ошибку?