Экран я вынес в коридор: кабель на полтора метра, на конце LCD с термодатчиком. В комнате, прямо на макетке, этот же экран работал безупречно. За дверью — тишина: сканер печатал «Пусто», хотя оба провода я прозвонил и перепрозвонил. Час я менял библиотеки, второй — грел продавца взглядом через монитор. Виноватой оказалась физика: на длинном кабеле линии SDA и SCL провисали, и подтяжек, которых хватало на двадцати сантиметрах макетки, на полтора метра уже не хватало.
Главного я тогда не понимал: шина I2C живёт только благодаря резисторам подтяжки. Уберите их — и обе линии повиснут в воздухе: мастер будет читать мусор или не увидит ни одного устройства. В уроке про два провода I2C тема прошла вскользь: 4,7 кОм к питанию, на готовых модулях стоит с завода. Здесь разберём вопрос по-взрослому: почему без подтяжки шина молчит, откуда подтяжка вообще берётся — с платы, с модуля или с вашей макетки — и как выбирать номинал под длину провода и число устройств.
Открытый сток: вверх линию тянет только резистор
Вся физика подтяжек упирается в одно свойство шины. Обе линии — SDA и SCL — устроены как открытый сток: каждое устройство подключено к линии через транзистор, который умеет ровно одно действие — прижать линию к земле. Отпустил транзистор — линия ни за что не держится и висит между землёй и пятью вольтами. Никто на шине сам линию вверх не тянет, на то она и открытый сток: вверх её поднимает резистор, второй конец которого сидит на питании.
Пока никто не прижимает линию, через резистор течёт ничтожный ток, и на линии стоит 5 В — единица. Устройство прижало линию — ток побежал через резистор на землю, линия упала до нуля. Ток течёт всё время, пока линия прижата, поэтому запас считают по худшему случаю — непрерывному нулю, а не по среднему трафику. Числа для ориентира: при подтяжке 4,7 кОм и питании 5 В ток прижима — около 1 мА (пять вольт делить на 4700 Ом), при 2,2 кОм — уже 2,3 мА, при 10 кОм — полмиллиампера. Нижняя граница отсюда следует прямо: чем меньше сопротивление, тем больше тока обязан глотать прижимающий транзистор. Стандарт I2C разрешает слейву до 3 мА, значит при 5 В резисторы меньше чем (5 − 0,4) / 3 ≈ 1,5 кОм на всю шину ставить нельзя.
Три источника подтяжки: плата, модуль, макетка
Первый источник — сама Uno. Библиотека Wire при запуске включает внутренние подтягивающие резисторы ATmega328P на A4 и A5 — те самые, что работают в режиме INPUT_PULLUP. Их номинал по даташиту — от 20 до 50 кОм, и для полноценной шины это слабо: фронт сигнала через такие резисторы нарастает лениво, на любом приличном кабеле единицы рассыпаются. Но на столе, с одним модулем и короткими проводами, внутренняя подтяжка часто вывозит — поэтому голая микросхема без обвязки иногда «почему-то работает прямо в руках» и так же загадочно умирает на кабеле. Включать эти резисторы руками не нужно: Wire.begin() делает это сам. И не подменяйте подтяжку выходом HIGH: пин в режиме OUTPUT жёстко держит уровень, и при споре со слейвом по линии пойдёт сквозной ток, на который подтяжка не рассчитана.
Второй источник — бортовые резисторы модулей: на LCD-переходнике PCF8574, на модуле часов DS3231, на OLED-плате подтяжка уже распаяна, обычно по 4,7 кОм, местами 10 кОм. Проект из готовых модулей вообще не требует паять резисторы руками — лучший расклад для новичка. Третий источник — ваша макетка: дискретные резисторы между SDA, SCL и 5 В. Их ставят, когда работаете с голой микросхемой или уносите шину дальше пары десятков сантиметров; как различить 4,7 кОм и 47 кОм по цветным полоскам, разобрано в уроке про маркировку резисторов.
Теперь самое недооценённое место: все подтяжки на шине работают параллельно. Два модуля с бортовыми 4,7 кОм дают 2,35 кОм, четыре — 1,175 кОм. В районе 2-4 кОм суммарная подтяжка шину только укрепляет: фронты круче, помехоустойчивость выше. Но каждый новый модуль снижает сопротивление, и на четвёртом-пятом ток прижима переваливает за комфортные 3 мА: пять модулей по 4,7 кОм — это 940 Ом и 5,3 мА. Шина не сгорает — она начинает глючить самым подлым образом: экран раз в десять секунд рисует мусор, а виноватых ищут в коде, хотя виновата арифметика. Что делать, когда модулей много, — покажу в уроке про разводку конфликтов адресов, а пока достаточно считать параллельные резисторы: для одинаковых номиналов делите 4,7 кОм на число модулей.
| Ситуация | Что ставлю | Почему |
|---|---|---|
| Один модуль, провод до 20 см | бортовая на модуле | заводских 4,7 кОм хватает, паять нечего |
| Голая микросхема без обвязки | внешняя 4,7 кОм к 5 В | внутренние 20-50 кОм годятся только на столе |
| Кабель от полуметра до метра | внешняя 2,2-4,7 кОм | слабая подтяжка не успевает поднимать линию против ёмкости кабеля |
| Четыре и больше модулей | убрать внешние, пересчитать сумму | параллельные резисторы упали ниже 1,5 кОм — начинаются глюки |
С верхней границей номинала всё решает ёмкость. Каждый сантиметр провода и каждый вход микросхемы — крошечный конденсатор, который подтяжка обязана перезарядить обратно до 5 В. Время нарастания фронта оценивается как 0,85 умножить на сопротивление и на ёмкость. Типовая макетка: 50 пФ и 4,7 кОм — фронт поднимается за 0,2 мкс, при бите длиной 10 мкс (это 100 кГц) запас огромный. Кабель в полтора метра — уже 150-200 пФ, тот же резистор даёт 0,6-0,8 мкс, а при предельных для стандарта 400 пФ — почти 1,6 мкс. Стандартному режиму ещё терпимо, быстрому режиму 400 кГц, где бит живёт 2,5 мкс, — нет: вот и весь секрет совета «на длинной шине ставьте 2,2 кОм».
Мои правила выбора короткие. Дефолт — 4,7 кОм: стол и коробка до полуметра провода. Провод длиннее метра или шина разогнана до 400 кГц — 2,2 кОм. Десять кОм не ставлю вовсе: такой номинал живёт только на идеальном столе с одним устройством, а потом проект переезжает в корпус, кабель удлиняется — и начинается охота за призраками. Проверенные связки собраны в таблице выше — сверьте с ней свою ситуацию, прежде чем бежать в магазин за резисторами.
Диагноз без осциллографа: пингуем адреса
#include <Wire.h> void ping(byte addr) { Wire.beginTransmission(addr); byte code = Wire.endTransmission(); // 0 — ответили, 2 — тишина Serial.print("addr=0x"); if (addr < 16) Serial.print("0"); Serial.print(addr, HEX); Serial.print(" code="); Serial.println(code);} void setup() { Wire.begin(); // Wire сам включит слабые внутренние подтяжки A4/A5 Serial.begin(9600); Serial.println("Пинг 0x27, 0x3F, 0x68");} void loop() { ping(0x27); // LCD1602 на PCF8574 ping(0x3F); // тот же LCD, партия PCF8574A ping(0x68); // часы DS3231 Serial.println("---"); delay(2000);}Читать вывод нужно так. Код 2 на всех трёх адресах — никто не откликается: нет подтяжки, перепутаны SDA и SCL, оборвана общая земля. Отвечают все адреса подряд — линия залипла у нуля, ищите короткое замыкание или перегретую пайку. Ответил 0x27, молчит 0x3F — шина жива, и вопрос уже не к подтяжке, а к адресам; их поиск — тема урока про сканер I2C. Код 4 — редкий гость: линия дёргается посреди передачи, ищите подгоревший контакт на макетке.
Итоговый порядок, когда шина молчит. Первый шаг — земля и питание: без общего минуса уровни не сравнить, это я втопил в память собственным проектом с двумя блоками питания. Второй — пинг из скетча: код 2 везде переводит стрелы с библиотек на физику. Третий — подтяжка: на столе хватает внутренней, на кабеле от полуметра ставлю внешнюю 2,2-4,7 кОм. Четвёртый — если шину всё-таки надо тащить через комнату, я больше не мучаю длинный кабель: в коридор едет вторая плата-слейв со своей короткой шиной, механика такой пары разобрана в уроке про мастера и слейва.
- Линии I2C — открытый сток: устройства только прижимают их к земле, вверх поднимает резистор подтяжки
- Wire.begin() включает внутренние подтяжки 20-50 кОм — их хватает одному модулю только на столе
- Дефолт 4,7 кОм; кабель от метра или 400 кГц — 2,2 кОм; при 5 В не опускайтесь ниже 1,5 кОм
- Бортовые подтяжки работают параллельно: пять модулей по 4,7 кОм дают 940 Ом и плавающие глюки
- Код 2 у всех пингов — дело в физике: земля, питание, провода, подтяжка; код тут не виноват
- 1. Почему шина I2C без подтяжки молчит?
- 2. Какой номинал подтяжки стоит брать по умолчанию для стола?
- 3. Три модуля с бортовыми подтяжками по 4,7 кОм плюс внешняя 4,7 кОм. Чему равно общее сопротивление?
- 4. Сканер печатает код 2 для всех адресов, модуль заведомо рабочий. Что проверить первым?
- 5. Чем плохи подтяжки 10 кОм для I2C?
Частые вопросы по теме урока
- Почему шина I2C без подтяжки молчит?
- Устройства умеют только прижимать линию к земле; поднимает её резистор подтяжки. Без него линия висит в воздухе, и единиц на шине не бывает. Линии I2C — открытый сток: сами они вверх не поднимаются
- Какой номинал подтяжки стоит брать по умолчанию для стола?
- 4,7 кОм — золотая середина: ток прижима около 1 мА при 5 В и быстрые фронты. 10 кОм выживает только с одним модулем на коротком проводе. 4,7 кОм
- Три модуля с бортовыми подтяжками по 4,7 кОм плюс внешняя 4,7 кОм. Чему равно общее сопротивление?
- Четыре одинаковых резистора параллельно — номинал делится на четыре: 4,7 / 4 = 1,175 кОм. Ток прижима уже за рекомендованные 3 мА. 1,175 кОм
- Сканер печатает код 2 для всех адресов, модуль заведомо рабочий. Что проверить первым?
- Код 2 значит «никто не откликнулся». Вина почти всегда в физике: общая земля, питание модуля, распиновка SDA/SCL и подтяжка. Землю, питание, провода и подтяжку
- Чем плохи подтяжки 10 кОм для I2C?
- Большое сопротивление заряжает ёмкость линии лениво, фронт растягивается, единицы рассыпаются. Чем длиннее шина, тем меньше нужен номинал. Слишком слабые: на кабеле фронт не успевает подняться до единицы