Третья версия моей балконной поливалки упёрлась не в код и не в датчики — в провода. Экран висел на параллельной схеме: шесть сигнальных линий, питание, земля, потенциометр контраста. Кнопки забрали два пина, реле ещё один, датчик влажности — аналоговый. На макетке жило двадцать с лишним проводов, и любое шевеление превращалось в игру «найди отошедший контакт»: то экран терял строку, то кнопка начинала срабатывать от прикосновения к соседнему проводу. Я уже не проектировал — я расхлёбывал, и каждая новая идея вроде «добавлю датчик давления» автоматически означала новый вечер с проводами.
Лекарство придумали задолго до меня и называется шина I2C: два сигнальных провода, к которым цепляется сколько угодно устройств — каждому выдан номер, а разговором рулит один диспетчер. Шесть линий экрана сжимаются до двух, и каждая новая периферия больше не требует ни одного лишнего пина. В этом уроке разберём, зачем вообще экономить провода до такой степени, кто в шине главный, на какой скорости она бегает и сколько дверей-адресов на ней есть. А в конце честно сравню I2C с соседями — SPI и UART, — чтобы вы знали, когда два провода выигрывают, а когда за них приходится платить.
Зачем придумали: экономика медных дорожек
В 1982 году инженеры Philips сидели над телевизорами, в которых управляющих микросхем становилось всё больше, а плата не резиновая: под каждую пару «процессор — периферия» тянулась своя горсть дорожек, и каждая дорожка стоила денег, места и шансов на заводской брак. Они предложили радикальную экономику: одна линия данных, одна линия такта — и адреса вместо отдельных проводов. Название I2C расшифровывается как Inter-Integrated Circuit, «между микросхемами», и с тех пор шина доехала из телевизоров в каждый датчик, экран и модуль часов на рынке — именно поэтому модули с четырьмя контактами дешевле и доступнее «голых» микросхем с обвязкой.
В мире Arduino за шину отвечает библиотека Wire — она встроена в IDE, ничего устанавливать не нужно. Важная деталь для планирования проекта: на Uno шина живёт на двух конкретных пинах, A4 и A5, и перенести её нельзя — за ними закреплена аппаратная периферия. Куда втыкать провода и как выглядит готовая схема, показано в уроке про два провода I2C; здесь поднимаемся уровнем выше — в роли и правила движения.
Мастер и слейв: диспетчер и пассажиры
Представьте маршрутку с очень строгими правилами. Один пассажир — водитель-мастер; в мире Arduino это почти всегда сама плата. Только он держит руль времени: мастер генерирует тактовый сигнал на линии SCL, сам решает, когда начать разговор, называет адрес собеседника и закрывает передачу. Все остальные — слейвы: экраны, часы, датчики давления. Они сидят тихо, слушают свои номера и отвечают ровно тогда, когда спросили. Для самодельных проектов одного мастера хватает почти всегда: сложность многоводительских шин с арбитражем — из мира промышленных контроллеров, и мы её сюда не тащим.
Демократии здесь нет: слейв не может сам вскрикнуть «у меня показания!». Он ждёт запроса — поэтому в скетчах с I2C датчики не шлют данные в никуда, а мастер ходит по кругу и собирает их по расписанию. У строгих правил есть неожиданное исключение: слейв, который не успевает, может притормозить мастера, задержав линию такта в низком уровне. Приём называется clock stretching, «растяжение такта»: медленный датчик держит дверь закрытой, пока не приготовит ответ, и мастер честно ждёт.
Не все слейвы умеют растягивать такт, и полагаться на это я бы не стал — но знать механизм полезно: если шина замирает на сотни микросекунд между байтами, это не помеха, а кто-то из пассажиров дошивает ответ. Как устроен обмен на примере двух плат — один мастер, второй сам становится устройством — разобрано в уроке про мастер-слейв на I2C.
Анатомия одной передачи выглядит так. По команде beginTransmission мастер ставит на шине старт-условие и первым уходит байт-рамка: семь бит адреса плюс бит направления — ноль означает «мастер пишет», единица «мастер читает». Девятый такт — очередь слейва: он обязан подтвердить адрес, прижав линию данных к земле, иначе мастер поймёт, что говорит в пустоту. Дальше идут байты данных, каждый со своим подтверждением, и в конце закрывающее стоп-условие. Вся церемония умещается в три вызова библиотеки, что вы увидите в скетче ниже.
| I2C | SPI | UART | |
|---|---|---|---|
| Линий без питания | 2: SDA и SCL | 4: MOSI, MISO, SCK, CS | 2: TX и RX |
| Число устройств | до 112 адресов на двух проводах | по линии CS на каждое | две точки |
| Скорость на Uno | 100–400 кГц | до 8 МГц | 9600–115200 бод |
| Типовые жильцы | датчики, экраны, часы | SD-карты, ленты, дисплеи | компьютер, вторая плата |
Из таблицы видно главное: I2C берёт не скоростью, а числом собеседников на двух проводах. Моё правило с границами: датчики и экраны, где за раз передаётся пара-тройка байт, я сажу на I2C; ленты WS2812, которым нужен кадр из сотен пикселей каждые 30 мс, остаются на прямом управлении ногой — у них свой раздел; разговор с компьютером идёт по UART, с которого начинается первый Serial-монитор. Выбор интерфейса — всегда баланс проводов против скорости, и проигрыш тут не позор, а расчёт.
Скорость и адреса: 112 дверей на два провода
Скорость шины задаёт мастер. Классика — 100 кГц, ускоренный режим — 400 кГц; в спецификации существуют ещё 1 Мбит/с и 3,4 Мбит/с, но Uno из коробки умеет первые два, а за разгон отвечает отдельный регистр — это история из продвинутого раздела. Прикинем цену байта: в каждом байте 8 бит данных плюс бит подтверждения, итого 9 тактов; при 100 кГц один такт длится 10 мкс, значит байт — около 90 микросекунд. Строка из 16 символов на экран — примерно полторы миллисекунды с накладными: глазу не видно, зато в loop() это заметный кусок, если печатать на каждом проходе без пауз.
Зачем тогда 400 кГц? Экранам с большим объёмом графики и паре прожорливых датчиков. Но скорость упирается не в чипы, а в физику проводов: стандарт ограничивает ёмкость шины 400 пФ, на практике это около метра обычных макеточных перемычек при 100 кГц. Разогнанную шину я держу только на OLED с короткими проводками; датчик на полуметровом хвосте живёт на стоковых 100 кГц и не жалуется — запас по скорости у него трёхкратный. Разница на цифрах: экран OLED на 400 кГц перерисовывается вдвое-вчетверо быстрее, а датчик влажности, отдающий три байта раз в секунду, разницы между режимами не заметит в принципе.
Теперь двери. Адрес слейва — 7 бит, то есть 128 номеров от 0x00 до 0x7F. Шестнадцать стандарт держит под служебные нужды: младшие 0x00–0x07 и старшие 0x78–0x7F. Живых дверей остаётся 112 — с 0x08 по 0x77, — и именно по ним ходит классический сканер. Адрес прошит в чип производителем, у многих модулей его сдвигают перемычками. Как сканер устроен, разберём в конце этого раздела, а все пять кодов ответа шины построчно раскладываются в уроке про сканер адресов.
#include <Wire.h> void setup() { Wire.begin(); // Uno становится мастером Serial.begin(9600);} void loop() { // Первая церемония: письмо экрану Serial.println("START, адрес 0x27, бит 'пишу'"); Wire.beginTransmission(0x27); // START + адрес + направление Wire.write('H'); // байты ждут в буфере Wire.write('I'); Wire.endTransmission(); // STOP: пакет ушёл целиком Serial.println("Данные 72, 73. STOP — шина свободна"); delay(1500); // Вторая церемония: те же два провода, другой адрес Serial.println("START, адрес 0x68 — часы"); Wire.beginTransmission(0x68); Wire.write(0x00); // указатель на регистр секунд Wire.endTransmission(); delay(1500);}В панели I2C каждый пакет распадается на те самые этапы: START, адрес, данные, STOP — и видно, что между передачами шина свободна. Обратите внимание, как просто сменился собеседник: поменялся один аргумент, а провода и скорость остались теми же. Это и есть главная сила шины — к той же паре A4 и A5 вы потом подвесите и датчик давления, и маленький OLED, и расширитель портов, и ни один из них не потребует отдельного пина.
Теперь слово «шина» для вас не метафора: два провода, диспетчер с монополией на такт, рамка «адрес — данные — подтверждение» и 112 адресных дверей. Дальше — практика с макеткой: как физически соединить модуль с Uno, в каком порядке подавать питание и почему без двух резисторов 4,7 кОм шина мертва — урок про подключение и подтяжки. Три задачи ниже — прямо в симуляторе, без паяльника.
- Поменяйте в симуляторном скетче порядок: сначала байт часам, потом экрану. В панели I2C порядок пакетов перевернётся, а ничего не сломается — каждая передача самостоятельна и закрывается своим STOP.
- Допишите третью церемонию на адрес 0x50 — так отвечает энергонезависимая память семейства 24Cxx. Панель покажет третьего собеседника на тех же двух проводах.
- Отправьте в одной передаче восемь байт подряд через Wire.write() и посчитайте в панели I2C, как растянется пакет. Сверьте с прикидкой из урока: 9 тактов на байт, около 90 мкс при 100 кГц.
- I2C придумали в Philips в 1982 году ради экономии дорожек: две сигнальные линии вместо пучка на каждое устройство
- Мастер (Uno) единственный генерирует такт SCL, называет адреса и открывает-закрывает передачи; слейвы отвечают только по запросу
- Первый байт передачи — семь бит адреса плюс бит направления, девятый такт — подтверждение слейва
- На Uno два рабочих режима — 100 кГц по умолчанию и 400 кГц на коротких проводах; байт с подтверждением — около 90 мкс на 100 кГц
- 7-битный адрес даёт 128 номеров, из них 16 служебные — на шине 112 живых дверей, диапазон 0x08–0x77
- 1. Кто на шине I2C генерирует тактовый сигнал SCL?
- 2. Сколько «живых» адресов остаётся на шине после вычета служебных?
- 3. Сколько тактов шины тратится на один байт данных вместе с подтверждением?
- 4. Что происходит при clock stretching?
- 5. Что из перечисленного обычно сажают именно на I2C?
Частые вопросы по теме урока
- Кто на шине I2C генерирует тактовый сигнал SCL?
- Такт — исключительная привилегия мастера. Единственное исключение — clock stretching, когда слейв задерживает SCL в низком уровне, и мастер ждёт. Мастер — всегда, слейвы никогда
- Сколько «живых» адресов остаётся на шине после вычета служебных?
- Семь бит — это 128 номеров, 16 из них (0x00–0x07 и 0x78–0x7F) зарезервированы стандартом. Живых дверей — 112, с 0x08 по 0x77. 112
- Сколько тактов шины тратится на один байт данных вместе с подтверждением?
- 8 бит данных плюс один бит ACK — девять тактов. При 100 кГц это примерно 90 микросекунд на байт. 9
- Что происходит при clock stretching?
- Медленный слейв задерживает линию такта в низком уровне, пока не будет готов, — мастер честно ждёт. Приём редкий, но о нём полезно знать при отладке. Слейв держит SCL низким, и мастер ждёт
- Что из перечисленного обычно сажают именно на I2C?
- Датчики и экраны отдают байты в день — I2C идеален. Ленте и карте нужна скорость SPI, компьютеру — UART. Датчик давления и экран 16x2