Данные всегда одни и те же: 0x4A. Разница между шинами — в том, сколько нужно проводов, кто задаёт такт, как приёмник понимает, где начало байта, и на какое расстояние это уедет. Ниже — один и тот же байт на шести шинах. Меняйте биты в панели снизу — все осциллограммы перерисуются.
Один байт, шесть шин0x4A
начни отсюда
Зачем микросхемам вообще разговаривать друг с другом?
Внутри почти любого устройства — умных часов, чайника, машины — сидит микроконтроллер, маленький мозг-начальник. А вокруг него «сотрудники»: датчик температуры, экран, флешка, модуль Wi-Fi. Начальник должен собирать с них данные и раздавать команды. Вопрос — как именно они переговариваются?
Можно к каждому сотруднику протянуть свой пучок проводов — быстро, но плата мгновенно превращается в лапшу. А можно пустить один-два общих провода, по которым все говорят по очереди, соблюдая правила. Вот эти правила разговора по проводам и называются последовательными шинами (serial buses): «последовательными» — потому что биты бегут по проводу один за другим, а не все сразу.
Дальше в статье — шесть самых распространённых таких «языков». Делают они одно и то же (переносят байты), но по-разному, и каждый заточен под свою задачу.
Одна задача — своя шина
Вывести картинку на цветной экран
SPI — нужна огромная скорость, провода короткие и их не жалко.
Повесить на плату десяток мелких датчиков
I²C — всего два провода на всех; скорость не критична, важно не плодить провода и пины.
Связать узлы в машине под капотом
CAN — вокруг искры, помехи, вибрация — нужна неубиваемость и защита от сбоев.
Скинуть отладочный текст на компьютер
UART — простейший шнурок из двух проводов, работает почти с чем угодно без настройки.
Протянуть гирлянду термометров по дому
1-Wire — один провод на все датчики и десятки метров; скорость не важна.
Подключиться к промышленному прибору или консоли сервера
RS-232 — старый надёжный стандарт: большие напряжения тянут кабель на метры.
Словарь человеческим языком
Байт
Минимальный кусочек информации — число от 0 до 255. Один символ, один цвет пикселя, одно показание датчика. Восемь бит (нулей и единиц) в ряд.
Тактовый сигнал (clock)
Дирижёр с метрономом: стучит «раз-два-три», и на каждый удар устройства передают ровно один бит. Есть такт (SPI, I²C) — идут синхронно; нет такта (UART) — обе стороны заранее договариваются о точном темпе.
Подтяжка (pull-up)
Обычный резистор, который подтягивает провод к «плюсу», чтобы тот не болтался в воздухе и не ловил помехи, как антенна, когда никто ничего не передаёт.
Ведущий и ведомый
Ведущий (master) начинает разговор и задаёт темп; ведомый (slave) отвечает, когда к нему обратились. У одних шин ведущий один, у других все равны.
00
Четыре вопроса, которые различают все шины
ВОПРОС 1
Кто задаёт такт?
Есть отдельная линия тактов — шина синхронная (SPI, I²C): приёмник не обязан знать частоту заранее. Нет такой линии — асинхронная (UART, RS-232, 1-Wire): скорость нужно согласовать заранее, и обе стороны должны держать её точно.
ВОПРОС 2
Как найти начало байта?
По служебному биту (старт-бит UART), по фронту выбора микросхемы (CS у SPI), по особому нарушению правил (START у I²C — SDA падает, пока SCL высокий), или по длинному импульсу сброса (1-Wire).
ВОПРОС 3
Сколько устройств на линии?
Двое (UART, RS-232), один ведущий и много ведомых по отдельной линии выбора (SPI) или по адресу (I²C, 1-Wire), либо все равны и борются за шину (CAN).
ВОПРОС 4
Как считается уровень?
Однопроводно относительно общей земли — просто, но ловит помехи (UART, SPI, I²C). Дифференциально — по разнице двух проводов витой пары, помеха приходит в оба и вычитается (CAN, RS-485). Отсюда десятки метров вместо сантиметров.
Асинхронно: только данные
Такта нет. Приёмник ловит спад старт-бита, ждёт полбита и дальше сэмплирует в середине каждого битового интервала, отсчитывая время своим таймером. Расхождение частот больше ≈2–3 % — и байт разъедется.
Синхронно: данные + такт
Ведущий сам говорит «читай сейчас» фронтом такта. Скорость может быть любой и даже плавать — приёмник всё равно попадёт в бит. Цена — лишний провод.
01 / асинхронный · точка-точка
UART
Universal Asynchronous Receiver / Transmitter
Два провода данных, никакого такта. Обе стороны заранее договорились о скорости (115200), и байт заворачивается в кадр: старт-бит, восемь бит данных младшим вперёд, стоп-бит. В покое линия высокая — поэтому падение уровня и есть «внимание, поехали».
ПроводаTX, RX, GND
Тактнет, по договорённости
Дуплексполный
Устройств2
Скорость9600 … 115200 бит/с до 1–3 Мбит/с
Дистанциядо ~1 м на уровнях TTL
Осциллограмма кадра 8N10x4A
Младший бит идёт первым, поэтому на экране байт читается «задом наперёд» относительно записи 0b. Кадр 8N1 = 8 бит данных, No parity, 1 стоп-бит: на каждые 8 полезных бит уходит 10 битовых интервалов, то есть 20 % трафика — накладные.
Схема соединения
Единственная хитрость: TX одного идёт в RX другого, линии перекрещиваются. И общая земля обязательна — без неё «нуля» просто нет.
Как это работает
Линия в покое держится в 1. Приёмник ждёт спада.
Передатчик опускает линию на один битовый интервал — это старт-бит. Приёмник запускает свой таймер.
Идут 8 бит данных, младшим вперёд. Приёмник читает уровень в середине каждого интервала (обычно с передискретизацией 16×, чтобы не поймать фронт).
При необходимости — бит чётности: контроль на одну ошибку.
Стоп-бит возвращает линию в 1. Если в этот момент линия внизу — приёмник рапортует framing error: скорее всего, не совпал baud rate.
Сильные стороны
Два провода, полный дуплекс, встроен в любой микроконтроллер.
Нет ведущего и ведомого — говорить может кто угодно и когда угодно.
Легко отлаживать: подцепил USB-переходник и читаешь текст в терминале.
Работает поверх чего угодно: RS-232, RS-485, оптоволокно, радио.
Ограничения
Ровно два участника, адресации нет.
Нужен точный тактовый источник: внутренний RC-генератор часто не тянет 115200.
Контроль ошибок — максимум бит чётности.
20 % полосы уходит на старт и стоп.
Ничего не знает о доставке: отправил в пустоту и не узнал.
Где встречается: отладочная консоль любой платы, GSM/GPS/Wi-Fi-модули с AT-командами, чековые принтеры, сканеры штрихкодов, связка «микроконтроллер ↔ Linux-плата», загрузчики прошивок.
02 / синхронный · звезда
SPI
Serial Peripheral Interface
Самая быстрая и самая прямолинейная шина: ведущий дёргает тактовую линию, и на каждый такт два сдвиговых регистра обмениваются битами — по одному туда и по одному обратно, одновременно. Никаких адресов, никаких подтверждений: кого выбрал линией CS, с тем и говоришь.
ПроводаSCK, MOSI, MISO, CS (по одной на ведомого)
Тактот ведущего
Дуплексполный
Устройств1 ведущий + N ведомых
Скорость10 … 100 МГц
Дистанциясантиметры, одна плата
Обмен байтами, режим 0 (CPOL=0, CPHA=0)0x4A
Пока ведущий отдаёт свой байт по MOSI, ведомый в те же такты отдаёт свой по MISO — здесь для примера инверсию. Стрелки — момент выборки: в режиме 0 данные выставляются по спаду и читаются по нарастающему фронту. Старший бит идёт первым.
Схема соединения
SCK, MOSI и MISO общие для всех, а линий CS нужно столько, сколько ведомых, — и каждая занимает пин ведущего. Это главная плата за скорость.
Как это работает
Ведущий опускает CS выбранного ведомого — остальные отключают выходы и не мешают.
Ведущий выдаёт 8 тактов на SCK. Каждый такт = один бит в каждую сторону.
По одному фронту данные выставляются, по противоположному — считываются. Какой именно — определяют CPOL и CPHA, отсюда режимы 0…3.
Байты идут подряд без служебных бит: сколько тактов дал — столько бит и передал. Полоса используется на 100 %.
Ведущий поднимает CS — транзакция закрыта, ведомый сбрасывает свой внутренний автомат.
Сильные стороны
Десятки мегабит: единственный вариант для дисплеев, SD-карт и flash.
Полный дуплекс и нулевые накладные расходы.
Простейшая аппаратура — реализуется на регистрах сдвига.
Посылка любой длины: не обязана быть кратной байту.
Ограничения
Провода: 3 + по одному CS на каждое устройство.
Один ведущий, арбитража нет.
Нет подтверждения: ведущий не узнает, что ведомый умер или вообще не припаян.
Нет стандарта поверх: у каждой микросхемы свой набор команд и свой режим.
Только внутри платы — длинные шлейфы «звенят».
Где встречается: SD-карты, TFT- и e-Ink-дисплеи, микросхемы NOR flash (в том числе QSPI, откуда грузится прошивка), радиомодули nRF24L01 и LoRa, быстрые АЦП, акселерометры в режиме высокой частоты.
03 / синхронный · общая шина
I²C
Inter-Integrated Circuit · TWI
Два провода на всю плату. Устройства умеют только притягивать линию к нулю, а поднимают её резисторы подтяжки — поэтому конфликта на шине физически не бывает. Каждое устройство имеет 7-битный адрес, и каждый переданный байт подтверждается битом ACK.
ПроводаSDA, SCL, GND + 2 подтяжки
Тактот ведущего, ведомый может притормозить
Дуплексполу-
Устройствдо 112 адресов
Скорость100 / 400 кГц, 1 МГц Fm+, 3,4 МГц HS
Дистанциядесятки см, лимит по ёмкости 400 пФ
Запись байта в устройство 0x3C0x4A
Правило шины: SDA меняется только когда SCL внизу. Изменение при высоком SCL — это служебный символ: падение = START, подъём = STOP. Заштрихованные биты ACK притягивает уже ведомый — так ведущий узнаёт, что его услышали. Логика тут обратная привычной: 0 (линия притянута) = ACK «принял», 1 (линия свободна) = NACK «никого нет» или «хватит» — так работает открытый сток.
Схема соединения
Две подтяжки на всю шину (обычно 4,7 кОм на 100 кГц, 2,2 кОм на 400 кГц) — а не по паре на каждое устройство. Выходы у всех «открытый сток»: тянуть вверх им нечем.
Как это работает
START: SDA падает, пока SCL высокий. Шина занята.
Ведущий отдаёт 7 бит адреса и бит направления: 0 — запись, 1 — чтение.
Устройство с этим адресом притягивает SDA на девятом такте — ACK. Тишина на девятом такте значит «никого нет дома».
Дальше байты данных, каждый со своим ACK. Приёмник может ответить NACK — «хватит».
Не успевает? Ведомый держит SCL внизу — clock stretching, ведущий терпеливо ждёт.
STOP: SDA поднимается при высоком SCL. Шина свободна.
Сильные стороны
Два провода на десятки устройств — экономия пинов колоссальная.
Адресация и подтверждение приёма встроены в протокол.
Можно опросить шину и узнать, что к ней вообще подключено.
Несколько ведущих с честным арбитражем.
Ограничения
На порядки медленнее SPI, полудуплекс.
Адреса конфликтуют: два одинаковых датчика часто нельзя повесить рядом.
Ёмкость шины ограничивает длину проводов и скорость.
Зависший ведомый может держать SDA внизу и убить всю шину.
Накладные расходы: адрес и ACK на каждый байт.
Где встречается: почти все датчики (BME280, MPU6050, VL53L0X), OLED-дисплеи SSD1306, EEPROM 24Cxx, часы реального времени, микросхемы питания, расширители портов, EDID монитора в HDMI-кабеле.
Шина, спроектированная для машины, где рядом искрит стартёр. Витая пара, дифференциальные уровни, 120 Ом на концах. Ведущих нет — есть сообщения с приоритетом: адресуется не узел, а сам смысл сообщения через идентификатор, и все узлы решают сами, слушать его или нет.
ПроводаCAN_H, CAN_L (витая пара) + 2×120 Ом
Тактнет, синхронизация по фронтам
Дуплексполу-
Устройствдесятки равноправных
Скорость500 кбит/с типично, до 1 Мбит/с · CAN FD до 8
Рецессивное состояние — обе линии около 2,5 В, разница ≈0 В, это логическая 1. Доминантное — линии разъезжаются на ±1 В, это логический 0. Если один узел передаёт 1, а другой 0 — на шине окажется 0. На этом простом факте построен весь арбитраж. Аналогия: 0 — доминантный (кто-то говорит вслух), 1 — рецессивный (все молчат). Перебить тишину можно, наоборот — нет; поэтому у кого в ID раньше идут нули, тот выигрывает арбитраж, не потеряв ни бита.
Структура кадра · тот же байт как единственный байт данных0x4A
Полезных данных максимум 8 байт (в CAN FD — 64), зато на них навешано 44+ служебных бита: приоритет, длина, CRC-15, подтверждение от всех слушателей сразу. Это шина не про объём, а про надёжность.
Схема соединения
Одна линия-магистраль с короткими отводами и обязательными терминаторами 120 Ом на двух концах — без них отражения ломают кадры. Микроконтроллер сам на шину не выходит: между ними трансивер.
Как это работает
Узел ждёт тишины на шине и начинает кадр доминантным SOF.
Передаёт идентификатор и одновременно слушает шину. Увидел на ней 0 там, где сам выдал 1 — значит, кто-то приоритетнее: молча уступает и попробует ещё раз. Меньший ID = выше приоритет, и байты победителя не пострадали.
Идут длина и 0–8 байт данных, затем CRC-15.
Каждый, кто принял кадр без ошибок, притягивает бит ACK. Один общий бит на всех слушателей.
Заметил ошибку — любой узел выдаёт error frame и рушит кадр для всех. Передатчик повторит автоматически.
Узел, который ошибается постоянно, по счётчикам ошибок сам себя отключает от шины — bus off. Сломанная железка не утащит за собой сеть.
Широковещательность: добавили слушателя — существующие узлы менять не нужно.
Всего два провода на всю сеть.
Ограничения
Нужен трансивер и правильная топология с терминаторами.
8 байт на кадр — большие блоки приходится нарезать.
Сложнее в освоении и отладке, нужен анализатор.
Сам по себе смысла не несёт: нужен протокол верхнего уровня — OBD-II, J1939, CANopen.
Низкоприоритетное сообщение на загруженной шине может ждать долго.
Где встречается: вся автомобильная электроника и диагностика через OBD-II, грузовики и сельхозтехника (J1939), промышленная автоматика (CANopen), контроллеры BLDC-моторов, лифты, медицинское оборудование, батарейные BMS.
05 / уровни и разъём · точка-точка
RS-232
EIA/TIA-232 · «COM-порт»
Частая путаница: RS-232 — это не другой UART. Кадр тот же самый, старт-стоп-биты те же. Стандарт описывает напряжения и разъём: логическая единица здесь — это −12 В, ноль — +12 В. Инверсия плюс размах в 24 вольта: сигнал переживает и длинный кабель, и наводки, которые убили бы TTL.
ПроводаTXD, RXD, GND + RTS/CTS, DTR/DSR
Уровни1 = −5…−15 В 0 = +5…+15 В
Дуплексполный
Устройств2
Скорость300 … 115200 бит/с
Дистанциядо 15 м
Один кадр в двух мирах: TTL и RS-2320x4A
Сверху то, что выходит из микроконтроллера, снизу — то, что уходит в кабель после MAX3232. Форма идентична, но перевёрнута и растянута через ноль. Подключить RS-232 напрямую к пину микроконтроллера нельзя: −12 В его убьют.
Разъём DE-9 и преобразователь уровней
Минимальный рабочий набор — три провода: 2 RXD, 3 TXD, 5 GND. Остальные — аппаратное управление потоком (RTS/CTS) и наследие модемов (DTR, DSR, DCD, RI). Кабель между двумя равноправными устройствами перекрещивает 2 и 3 и называется нуль-модемным.
Что нужно знать на практике
Внутри устройства живёт обычный UART. RS-232 начинается после микросхемы уровней.
MAX232 / MAX3232 делают ±12 В из одного питания зарядными насосами на четырёх конденсаторах.
Настройка описывается строкой вида 115200 8N1 — скорость, биты данных, чётность, стоп-биты. Не совпало хоть что-то — на экране мусор.
Земля общая на оба устройства, и это слабое место: разные потенциалы земель на длинном кабеле дают ток по «нулю».
Нужны сотни метров или много узлов — берётся дифференциальная родня: RS-422 и RS-485 (до 1200 м, до 32 узлов, поверх него живёт Modbus). По сути это тот же UART-кадр, но пущенный по витой паре дифференциальными уровнями, как в CAN, — оттого и дальнобойность и стойкость к помехам.
Сильные стороны
Большой размах напряжения → помехоустойчивость выше TTL, метры вместо сантиметров.
Полный дуплекс, аппаратное управление потоком.
Абсолютная совместимость: стандарту больше шестидесяти лет.
Ставится на любой UART одной микросхемой.
Ограничения
Только два устройства.
Однопроводные уровни относительно общей земли — до RS-485 далеко.
Крупный разъём, нужны конденсаторы и отдельная микросхема.
На компьютерах исчез: живёт через переходники USB-UART (CP2102, FT232, CH340).
Где встречается: промышленные контроллеры и ЧПУ, лабораторные приборы, ИБП, кассовое оборудование, сетевые коммутаторы и серверы (консольный порт), диагностика в железнодорожной и энергетической автоматике.
06 / асинхронный · один провод
1-Wire
Dallas / Maxim одношинный интерфейс
Предел экономии: одна линия данных с подтяжкой — и по ней же устройство может питаться, запасая энергию в конденсаторе, пока линия свободна. Ни такта, ни второго провода: всё кодируется длительностью низкого импульса. Каждое устройство несёт уникальный 64-битный номер, вшитый на заводе.
ПроводаDQ + GND (+ VCC опционально)
Тактнет, только тайминги
Дуплексполу-
Устройствмного, поиск по ROM ID
Скорость≈16 кбит/с, overdrive ≈125
Дистанциядесятки метров
Сброс, отклик и запись байта временными слотами0x4A
Единицу и ноль отличает только длина низкого импульса внутри слота: короткий провал ≈6 µs — это 1, длинный ≈60 µs — это 0. Отсюда главная сложность: драйвер живёт на микросекундных задержках, и лишнее прерывание посреди слота портит бит.
Схема соединения и паразитное питание
Подтяжка 4,7 кОм — и на этой же линии висят все датчики. В режиме паразитного питания третий провод не нужен вовсе: пока линия высокая, устройство заряжает внутренний конденсатор.
Как это работает
Ведущий держит линию внизу ≥480 µs — сброс. Все устройства на линии перезапускаются.
Устройства отвечают своим провалом на 60–240 µs — presence pulse: «мы здесь».
Ведущий передаёт команду слотами по 60–120 µs. Дальше либо Skip ROM, если устройство одно, либо Match ROM с 64-битным номером конкретного.
Несколько устройств находятся алгоритмом ROM search: побитный обход дерева адресов, узлы отсеиваются группами.
При чтении ведущий сам роняет линию на 1–2 µs, отпускает и смотрит уровень: держит ведомый внизу — 0, отпустил — 1.
В номере устройства последний байт — CRC-8, так что подключение проверяется сразу.
Сильные стороны
Один провод на всё, включая питание.
Уникальный заводской ID: устройства не нужно настраивать и адреса не конфликтуют.
Десятки метров обычной витой пары.
Много устройств на одной линии — гирлянда датчиков температуры по дому.
Ограничения
Очень медленно: измерение DS18B20 занимает до 750 мс.
Жёсткие тайминги в микросекундах, полудуплекс.
Аппаратной поддержки в микроконтроллерах почти нет — всё вручную.
Длинная линия требует аккуратной топологии и иногда активной подтяжки.
Где встречается: термометры DS18B20 (умный дом, инкубаторы, серверные), ключи-таблетки iButton и домофоны, EEPROM DS24xx, идентификация аккумуляторов и картриджей, датчики влажности в теплицах.
07
Всё на одном экране
Шина
Сигнальных линий
Такт
Дуплекс
Устройств
Адресация
Скорость
Дистанция
Уровни
UART
2
нет
полный
2
нет
до ~1 Мбит/с
~1 м
однопроводные, TTL
SPI
3 + N×CS
SCK от ведущего
полный
1 + N
линией CS
10–100 МГц
см
однопроводные, TTL
I²C
2 + подтяжки
SCL от ведущего
полу-
до 112
7-битный адрес
0,1–3,4 МГц
десятки см
открытый сток
CAN
2 (витая пара)
нет, по фронтам
полу-
десятки
ID сообщения, приоритет
до 1 Мбит/с
40–500 м
дифференциальные
RS-232
2 (+ поток)
нет
полный
2
нет
до 115200 бит/с
15 м
±5…15 В, инверсия
1-Wire
1
нет, тайминги
полу-
много
64-битный ROM ID
16–125 кбит/с
десятки м
открытый сток + подтяжка
Полезное дополнение к таблице: RS-485 — дифференциальная многоточечная версия последовательного порта: тот же UART-кадр, витая пара, до 32 узлов и 1200 м, полудуплекс. На нём работает Modbus RTU и почти вся промышленная периферия.
08
Какую взять под задачу
Два устройства, немного данных, нужно просто и сразу — и хочется видеть трафик глазами в терминале.
UART
Дисплей, SD-карта, флеш или АЦП на той же плате: важна скорость, пины есть.
SPI
Пять-десять мелких датчиков и регистров, данных мало, а свободных пинов почти нет.
I²C
Метры провода, вибрация и помехи, отказ недопустим, узлов много и они равноправны.
CAN
Подключиться к промышленному прибору, ИБП или консольному порту сервера.
RS-232
Гирлянда термометров по длинному кабелю, скорость не важна, проводов хочется минимум.
1-Wire
Сотни метров, десятки узлов, но CAN избыточен, а работать нужно с готовыми промышленными устройствами.
RS-485 / Modbus
09
Где обычно всё ломается
UART
Не перекрещены TX и RX
TX должен идти в RX. Второй классик — несовпадение скорости: вместо текста идёт стабильный мусор. И общая земля обязательна.
SPI
Не тот режим или забытый CS
Данные читаются, но со сдвигом на бит — почти всегда перепутаны CPOL/CPHA. Незакреплённый CS плавает и открывает ведомого в случайный момент: подтяните его к питанию.
I²C
Нет подтяжек или совпали адреса
Без резисторов шина молчит совсем. Два одинаковых датчика — конфликт адресов, спасает пин выбора адреса или мультиплексор TCA9548A. Длинные провода добавляют ёмкость: снижайте частоту.
CAN
Нет терминаторов или разные скорости
120 Ом ставятся ровно на двух физических концах магистрали, не на каждом узле. Битрейт должен совпадать у всех до бита — иначе шина уходит в лавину ошибок.
RS-232
Прямое подключение к пину
±12 В сжигают вход микроконтроллера — нужен MAX3232. И проверьте, нужен ли нуль-модемный кабель: два «терминала» без перекрёста друг друга не услышат.
1-Wire
Съеденные тайминги
Прерывание посреди слота на 60 µs ломает бит. На длинной линии добавьте подтяжку посильнее и проверяйте CRC-8 каждого ответа, прежде чем верить показаниям.
Общее
Разные уровни питания
5 В и 3,3 В напрямую не дружат: нужен делитель, преобразователь уровней или устройство с толерантными входами. Проверяйте это раньше, чем логику протокола.
Общее
Отладка вслепую
Логический анализатор за небольшие деньги показывает то, что иначе гадаешь часами: есть ли ACK, где сбился фронт, тот ли адрес. Смотреть на шину гораздо быстрее, чем угадывать.