RisalDash RisalDash
Проводные интерфейсы микроконтроллеров

Один байт — шесть способов его отправить

Данные всегда одни и те же: 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
Осциллограмма кадра 8N1 0x4A
Младший бит идёт первым, поэтому на экране байт читается «задом наперёд» относительно записи 0b. Кадр 8N1 = 8 бит данных, No parity, 1 стоп-бит: на каждые 8 полезных бит уходит 10 битовых интервалов, то есть 20 % трафика — накладные.
Схема соединения
Единственная хитрость: TX одного идёт в RX другого, линии перекрещиваются. И общая земля обязательна — без неё «нуля» просто нет.
Как это работает
  1. Линия в покое держится в 1. Приёмник ждёт спада.
  2. Передатчик опускает линию на один битовый интервал — это старт-бит. Приёмник запускает свой таймер.
  3. Идут 8 бит данных, младшим вперёд. Приёмник читает уровень в середине каждого интервала (обычно с передискретизацией 16×, чтобы не поймать фронт).
  4. При необходимости — бит чётности: контроль на одну ошибку.
  5. Стоп-бит возвращает линию в 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 нужно столько, сколько ведомых, — и каждая занимает пин ведущего. Это главная плата за скорость.
Как это работает
  1. Ведущий опускает CS выбранного ведомого — остальные отключают выходы и не мешают.
  2. Ведущий выдаёт 8 тактов на SCK. Каждый такт = один бит в каждую сторону.
  3. По одному фронту данные выставляются, по противоположному — считываются. Какой именно — определяют CPOL и CPHA, отсюда режимы 0…3.
  4. Байты идут подряд без служебных бит: сколько тактов дал — столько бит и передал. Полоса используется на 100 %.
  5. Ведущий поднимает 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 пФ
Запись байта в устройство 0x3C 0x4A
Правило шины: SDA меняется только когда SCL внизу. Изменение при высоком SCL — это служебный символ: падение = START, подъём = STOP. Заштрихованные биты ACK притягивает уже ведомый — так ведущий узнаёт, что его услышали. Логика тут обратная привычной: 0 (линия притянута) = ACK «принял», 1 (линия свободна) = NACK «никого нет» или «хватит» — так работает открытый сток.
Схема соединения
Две подтяжки на всю шину (обычно 4,7 кОм на 100 кГц, 2,2 кОм на 400 кГц) — а не по паре на каждое устройство. Выходы у всех «открытый сток»: тянуть вверх им нечем.
Как это работает
  1. START: SDA падает, пока SCL высокий. Шина занята.
  2. Ведущий отдаёт 7 бит адреса и бит направления: 0 — запись, 1 — чтение.
  3. Устройство с этим адресом притягивает SDA на девятом такте — ACK. Тишина на девятом такте значит «никого нет дома».
  4. Дальше байты данных, каждый со своим ACK. Приёмник может ответить NACK — «хватит».
  5. Не успевает? Ведомый держит SCL внизу — clock stretching, ведущий терпеливо ждёт.
  6. STOP: SDA поднимается при высоком SCL. Шина свободна.
Сильные стороны
  • Два провода на десятки устройств — экономия пинов колоссальная.
  • Адресация и подтверждение приёма встроены в протокол.
  • Можно опросить шину и узнать, что к ней вообще подключено.
  • Несколько ведущих с честным арбитражем.
Ограничения
  • На порядки медленнее SPI, полудуплекс.
  • Адреса конфликтуют: два одинаковых датчика часто нельзя повесить рядом.
  • Ёмкость шины ограничивает длину проводов и скорость.
  • Зависший ведомый может держать SDA внизу и убить всю шину.
  • Накладные расходы: адрес и ACK на каждый байт.

Где встречается: почти все датчики (BME280, MPU6050, VL53L0X), OLED-дисплеи SSD1306, EEPROM 24Cxx, часы реального времени, микросхемы питания, расширители портов, EDID монитора в HDMI-кабеле.

На практике: сравнение четырёх I²C-датчиков на одной шине →

04 / дифференциальный · все равны

CAN

Controller Area Network

Шина, спроектированная для машины, где рядом искрит стартёр. Витая пара, дифференциальные уровни, 120 Ом на концах. Ведущих нет — есть сообщения с приоритетом: адресуется не узел, а сам смысл сообщения через идентификатор, и все узлы решают сами, слушать его или нет.

ПроводаCAN_H, CAN_L (витая пара)
+ 2×120 Ом
Тактнет, синхронизация по фронтам
Дуплексполу-
Устройствдесятки равноправных
Скорость500 кбит/с типично,
до 1 Мбит/с · CAN FD до 8
Дистанция40 м на 1 Мбит/с,
500 м на 125 кбит/с
Дифференциальная пара: dominant побеждает recessive CAN_H / CAN_L
Рецессивное состояние — обе линии около 2,5 В, разница ≈0 В, это логическая 1. Доминантное — линии разъезжаются на ±1 В, это логический 0. Если один узел передаёт 1, а другой 0 — на шине окажется 0. На этом простом факте построен весь арбитраж. Аналогия: 0 — доминантный (кто-то говорит вслух), 1 — рецессивный (все молчат). Перебить тишину можно, наоборот — нет; поэтому у кого в ID раньше идут нули, тот выигрывает арбитраж, не потеряв ни бита.
Структура кадра · тот же байт как единственный байт данных 0x4A
Полезных данных максимум 8 байт (в CAN FD — 64), зато на них навешано 44+ служебных бита: приоритет, длина, CRC-15, подтверждение от всех слушателей сразу. Это шина не про объём, а про надёжность.
Схема соединения
Одна линия-магистраль с короткими отводами и обязательными терминаторами 120 Ом на двух концах — без них отражения ломают кадры. Микроконтроллер сам на шину не выходит: между ними трансивер.
Как это работает
  1. Узел ждёт тишины на шине и начинает кадр доминантным SOF.
  2. Передаёт идентификатор и одновременно слушает шину. Увидел на ней 0 там, где сам выдал 1 — значит, кто-то приоритетнее: молча уступает и попробует ещё раз. Меньший ID = выше приоритет, и байты победителя не пострадали.
  3. Идут длина и 0–8 байт данных, затем CRC-15.
  4. Каждый, кто принял кадр без ошибок, притягивает бит ACK. Один общий бит на всех слушателей.
  5. Заметил ошибку — любой узел выдаёт error frame и рушит кадр для всех. Передатчик повторит автоматически.
  6. Узел, который ошибается постоянно, по счётчикам ошибок сам себя отключает от шины — 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-232 0x4A
Сверху то, что выходит из микроконтроллера, снизу — то, что уходит в кабель после MAX3232. Форма идентична, но перевёрнута и растянута через ноль. Подключить RS-232 напрямую к пину микроконтроллера нельзя: −12 В его убьют.
Разъём DE-9 и преобразователь уровней
Минимальный рабочий набор — три провода: 2 RXD, 3 TXD, 5 GND. Остальные — аппаратное управление потоком (RTS/CTS) и наследие модемов (DTR, DSR, DCD, RI). Кабель между двумя равноправными устройствами перекрещивает 2 и 3 и называется нуль-модемным.
Что нужно знать на практике
  1. Внутри устройства живёт обычный UART. RS-232 начинается после микросхемы уровней.
  2. MAX232 / MAX3232 делают ±12 В из одного питания зарядными насосами на четырёх конденсаторах.
  3. Настройка описывается строкой вида 115200 8N1 — скорость, биты данных, чётность, стоп-биты. Не совпало хоть что-то — на экране мусор.
  4. Земля общая на оба устройства, и это слабое место: разные потенциалы земель на длинном кабеле дают ток по «нулю».
  5. Нужны сотни метров или много узлов — берётся дифференциальная родня: 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 кОм — и на этой же линии висят все датчики. В режиме паразитного питания третий провод не нужен вовсе: пока линия высокая, устройство заряжает внутренний конденсатор.
Как это работает
  1. Ведущий держит линию внизу ≥480 µs — сброс. Все устройства на линии перезапускаются.
  2. Устройства отвечают своим провалом на 60–240 µs — presence pulse: «мы здесь».
  3. Ведущий передаёт команду слотами по 60–120 µs. Дальше либо Skip ROM, если устройство одно, либо Match ROM с 64-битным номером конкретного.
  4. Несколько устройств находятся алгоритмом ROM search: побитный обход дерева адресов, узлы отсеиваются группами.
  5. При чтении ведущий сам роняет линию на 1–2 µs, отпускает и смотрит уровень: держит ведомый внизу — 0, отпустил — 1.
  6. В номере устройства последний байт — CRC-8, так что подключение проверяется сразу.
Сильные стороны
  • Один провод на всё, включая питание.
  • Уникальный заводской ID: устройства не нужно настраивать и адреса не конфликтуют.
  • Десятки метров обычной витой пары.
  • Много устройств на одной линии — гирлянда датчиков температуры по дому.
Ограничения
  • Очень медленно: измерение DS18B20 занимает до 750 мс.
  • Жёсткие тайминги в микросекундах, полудуплекс.
  • Аппаратной поддержки в микроконтроллерах почти нет — всё вручную.
  • Длинная линия требует аккуратной топологии и иногда активной подтяжки.

Где встречается: термометры DS18B20 (умный дом, инкубаторы, серверные), ключи-таблетки iButton и домофоны, EEPROM DS24xx, идентификация аккумуляторов и картриджей, датчики влажности в теплицах.

07

Всё на одном экране

ШинаСигнальных линийТактДуплексУстройствАдресацияСкоростьДистанцияУровни
UART 2нетполный2нетдо ~1 Мбит/с~1 моднопроводные, TTL
SPI 3 + N×CSSCK от ведущегополный1 + Nлинией CS10–100 МГцсмоднопроводные, TTL
I²C 2 + подтяжкиSCL от ведущегополу-до 1127-битный адрес0,1–3,4 МГцдесятки смоткрытый сток
CAN 2 (витая пара)нет, по фронтамполу-десяткиID сообщения, приоритетдо 1 Мбит/с40–500 мдифференциальные
RS-232 2 (+ поток)нетполный2нетдо 115200 бит/с15 м±5…15 В, инверсия
1-Wire 1нет, таймингиполу-много64-битный ROM ID16–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, где сбился фронт, тот ли адрес. Смотреть на шину гораздо быстрее, чем угадывать.

Этот разбор — от команды RisalDash, открытой библиотеки веб-дашбордов для ESP32 / ESP8266.

Передаём байт
hex 0x4A dec 74 bin 01001010 ascii 'J'