Логический анализатор: декодирование цифровых сигналов


Что содержится в статье ⌄
  • Отличия логического анализатора от осциллографа
  • Физика захвата: пороги срабатывания и логические уровни
  • Частота дискретизации (Sample кate): теорема Котельникова на практике
  • Почему отсутствие общей земли (GND) ломает анализ
  • Драйверы и Zadig: PulseView не видит устройство
  • Как настроить программный декодер SPI и прочитать Datasheet чипа

Осциллограф vs логический анализатор

Важно разделять физический (аналоговый) и логический уровни сигнала.

Осциллограф традиционно используется для оценки аналогового сигнала. Он непрерывно измеряет напряжение и строит график его изменения во времени. С помощью осциллографа видны пусковые токи БП, влияние паразитной емкости кабеля, звон на линии (ringing), электромагнитные наводки и просадки по питанию.

Осциллограф Rigol DHO814 100 МГц
Осциллограф Rigol DHO814 100 МГц
Осциллограф как логический анализатор

Граница между приборами не является строгой. Современные осциллографы нередко поддерживают декодирование цифровых протоколов (UART, SPI, I²C и др.) и могут использоваться для анализа логических сигналов.

Поскольку осциллограф измеряет саму форму напряжения во времени, он способен выполнять и функции логического анализа.

Однако на практике логический анализатор обычно оказывается удобнее для длительного захвата большого числа цифровых каналов, тогда как осциллограф применяют в первую очередь там, где важна именно физическая форма сигнала и аналоговые эффекты.

Логический анализатор решает другую задачу. Он игнорирует форму сигнала и работает строго в бинарной логике. Аппаратно он представляет собой набор компараторов. Если напряжение на линии выше определенного порога – прибор фиксирует логическую 1, если ниже – логический 0.

Логический анализатор 24MHz 8CH USB
Логический анализатор 24MHz 8CH USB

Главное преимущество логического анализатора – его простота и способность одновременно захватывать состояние множества каналов (8, 16 и более) на высоких частотах на протяжении длительного времени, а затем программно декодировать эту последовательность нулей и единиц в читаемые байты (HEX).

Логические уровни и пороги срабатывания

У каждого цифрового чипа есть стандарт логических уровней: 1.8 В, 3.3 В или 5 В. Логический анализатор должен быть совместим с этими уровнями.

Например, если порог установлен на 1.5 В, то при захвате шины 3.3 В любое напряжение ниже 1.5 В будет считаться нулем, а выше – единицей.

Современные логические анализаторы часто позволяют программно выбирать этот порог в зависимости от анализируемой шины.

Однако недорогие USB-логические анализаторы обычно имеют фиксированные входные пороги и ограниченные возможности по настройке аналоговой части. Поэтому при работе с низковольтной логикой (например, 1.8 В CMOS) их применение может быть затруднено.

Гальваническая развязка и 24 В выходы ПЛК

Большинство логических анализаторов рассчитаны на работу исключительно с микроконтроллерными уровнями – максимум до 5 В или 5.5 В.

В промышленной автоматике (ПЛК) логическая единица часто равна 24 В. Подключение стандартного логического анализатора напрямую к клеммам ПЛК приведет к пробою компараторов прибора.

Более того, в логических анализаторах обычно нет гальванической развязки. Из-за ее отсутвия высокое напряжение пойдет по цепям питания прямо в USB-порт, что сожжет материнскую плату компьютера.

В случае необходимости применяются внешние аппаратные USB-изоляторы, например:

USB 3.0 SuperSpeed 1kV Isolator
USB 3.0 SuperSpeed 1kV Isolator

Подключение к шине

Разберем процесс анализа на реальном примере: перехват взаимодействия радио-трансивера SX1278 (LoRa) с микроконтроллером по шине SPI.

SX1278 LoRa Module
SX1278 LoRa Module

В предыдущей статье мы рассматривали архитектуру SPI. Это синхронная полнодуплексная шина из 4 проводов (CS/NSS, SCK, MOSI, MISO).

В нашем примере модуль SX1278 подключен к микроконтроллеру ESP32 семью пинами:

  • GND - земля;
  • 3.3V - питание чипа;
  • DIO0 - прерывания (чип через него сообщает микроконтроллеру о событиях);
  • NSS - выбор чипа;
  • MOSI - данные от контроллера к чипу;
  • MISO - данные от чипа к контроллеру;
  • SCK - тактовый сигнал.

Далее – подключаем 4 канала анализатора к соответствующим пинам:

  • Канал 1 → NSS
  • Канал 3 → SCK
  • Канал 5 → MOSI
  • Канал 7 → MISO
  • Пятым проводом обязательно объединяем GND.
Зачем соединять GND анализатора и микроконтроллера?

Напряжение – это разность потенциалов между двумя точками. Микроконтроллер формирует сигналы относительно своей земли (GND).

Если подключить к тестируемому устройству только сигнальные щупы (например, к линиям SCL и SDA шины I²C) и не соединить земли устройства и логического анализатора, прибор не будет иметь общей точки отсчета потенциала.

В некоторых случаях анализатор всё ещё способен корректно считывать сигнал за счёт паразитных связей, общей земли через USB или особенностей схемы. Однако такая конфигурация не считается надёжной: уровни становятся неопределёнными, возрастает чувствительность к электромагнитным помехам и возможны ложные срабатывания или нестабильный захват данных.

Правило: подключение любого измерительного прибора всегда начинается с объединения клемм GND.

Важно: необходимо обратить внимание на нумерацию каналов на логическом анализаторе. На разных устройствах она разная и не всегда очевидная. Это легко может оказаться причиной, из-за которой декодирование SPI не работает.

Подключение каналов логического анализатора к пинам SPI
Подключение каналов логического анализатора к пинам SPI

Программа PulseView

Мы будем использовать программу PulseView. Это open-source программа для работы с логическими анализаторами. Она позволяет захватывать, декодировать и анализировать цифровые сигналы: UART, SPI, I²C, CAN, Modbus RTU и другие протоколы.

PulseView фактически является графическим интерфейсом поверх sigrok и поддерживает большое количество бюджетных и профессиональных устройств разных производителей. За счёт этого она часто используется в embedded-разработке, ремонте электроники и reverse engineering.

Среди аналогов есть проприетарные решения вроде Saleae Logic 2 и другое ПО от производителей осциллографов/анализаторов, однако PulseView – один из самых популярных open-source вариантов благодаря бесплатности, кроссплатформенности и поддержке множества устройств.

Установка драйвера через Zadig

Проблема в том, что многие бюджетные логические анализаторы определяются системой как неизвестные USB-устройства или получают драйвер, не совместимый с экосистемой sigrok. В результате PulseView видит устройство физически, но не может получить к нему низкоуровневый доступ для захвата данных.

Утилита Zadig заменяет автоматически назначенный драйвер устройства на WinUSB/libusb-совместимый драйвер, предоставляющий sigrok/PulseView низкоуровневый доступ к USB-интерфейсу анализатора.

  1. Запускаем Zadig от имени Администратора.
  2. Подключаем анализатор к USB-порту. Убеждаемся, что Zadig отобразил новое устройство в списке, даже если это Unknown device. Оно должно быть без драйвера, то есть (NONE) как на скриншоте ниже.
  3. Если устройство не появилось в списке, то в меню Options ставим галку List All Devices.
  4. Выбираем драйвер WinUSB (v6.1.7600.xxxxx) и нажимаем на кнопку “Install Driver”.
Установка WinUSB драйвера через Zadig
Установка WinUSB драйвера через Zadig

Настройка PulseView

Открываем PulseView, нажимаем “Connect to device” -> находим fx2lafw -> Scan for devices using driver above -> “Saleae Logic with 8 channels”.

Image

Важно: подбираем правильную частоту дискретизации сигнала в PulseView, ориентируясь на частоту тактового сигнала (SCK) шины SPI.

В программных средах (например, при инициализации SPI в MicroPython) скорость передачи задается через параметр baudrate (например, baudrate=1000000). Это удобная абстракция, созданная для унификации кода разных интерфейсов. В реальности для синхронного SPI этот параметр жестко задает физическую частоту тактового сигнала на линии SCK.

Поскольку за один период тактового сигнала передается ровно один бит данных, софтовый битрейт в битах в секунду численно равен физической частоте SCK в герцах (1 Мбит/с = 1 МГц).

Измерительный прибор анализирует физические уровни напряжения, и линия SCK для него – самый высокочастотный сигнал в схеме. Если тактовая частота SPI равна 1 МГц (1 миллион тактов в секунду), то физически напряжение на линии SCK меняется со скоростью 2 миллиона раз в секунду:

Image

Многие бюджетные логические анализаторы не имеют собственной буферной памяти (RAM). Из-за этого захваченные данные передаются в компьютер практически в реальном времени через USB.

При высокой частоте дискретизации поток данных легко может превысить пропускную способность USB-интерфейса, драйвера или системы обработки на стороне ПК. В результате возникают потери сэмплов (sample loss / buffer overrun), и PulseView автоматически останавливает захват из-за пропуска данных.

Для бюджетного клона Saleae Logic частота дискретизации в 3-4 МГц на практике оказалась предельной. Соответственно, чтобы гарантированно избежать потерь данных на стороне USB и при этом надежно захватить тактовый сигнал (соблюдая правило четырехкратного запаса), максимальная частота тактирования SCK (то есть baudrate в коде MicroPython) исследуемой шины SPI на нашей плате ESP32 должна быть строго меньше 1 МГц.

Как выбрать частоту дискретизации?

Частота дискретизации (Sample rate) определяет, сколько раз в секунду анализатор опрашивает состояние своих входов. Измеряется в MS/s (мегасемплов в секунду) или стандартных kHz / MHz.

Согласно теореме Котельникова (Найквиста-Шеннона), для восстановления сигнала частота дискретизации должна быть минимум в 2 раза выше максимальной частоты самого сигнала. То есть, чтобы просто увидеть импульсы частотой 1 МГц, нужно опрашивать линию на частоте не менее 2 МГц.

Однако цифровые сигналы – это прямоугольные импульсы, а не синусоиды. Они содержат в себе высокочастотные гармоники, формирующие резкие фронты.

Чтобы программный декодер мог абсолютно точно определить ширину импульса, не пропустить момент изменения состояния линии и правильно соотнести данные с тактовым сигналом, в инженерной практике используется строгое правило: частота дискретизации анализатора должна быть минимум в 4–5 раз выше тактовой частоты исследуемой шины.

Пример на быстрой шине: если мы анализируем шину SPI, тактируемую на частоте 10 МГц, Sample rate необходимо установить на анализаторе не менее 50 МГц.

Захват сигнала шины

Устанавливаем количество сэмплов в 50 M или 100 M (с запасом), частоту дискретизации в 3 МГц и нажимаем на кнопку записи. После этого - передаем сообщение через радио-трансмиттер.

Image

Далее находим кнопку “Add protocol decoder” -> находим SPI и добавляем декодер двойным кликом. Задаем параметры декодера:

  1. CLK: D2 (канал CH3)
  2. MISO: D6 (канал CH7)
  3. MOSI: D4 (канал CH5)
  4. CS#: D0 (канал CH1)
  5. CS# polarity: active-low

Получается так:

Image

Видим результат декодирования:

Image

Анализ логов SPI

Переходим в режим Tabular Decoder Output View, чтобы увидеть байты:

Image

Мы анализируем передатчик, поэтому данные, которые он будет передавать, пойдут по линии MOSI - то есть из Master в Slave.

Среди логов передачи видим два байта:

"2048308","682.769 ms","SPI","MOSI transfers","MOSI transfer","80 30"

Это запись в 0x00 (RegFifo). В буфер отправляется сам байт данных 0x30. В таблице ASCII это символ 0.

Как читать лог SPI для SX1278

Обмен идет парами по 2 байта (16 бит):

MOSI (от ESP32 к SX1278):

  • Первый байт - это адрес регистра.
    • Если старший бит равен 1 (например, 0x81), то это команда записи (регистр 0x01).
    • Если старший бит 0 (например, 0x12), то это чтение (из регистра 0x12).
  • Второй байт - сами данные (или пустой байт 0x00 при чтении).

MISO (от SX1278 к ESP32):

  • При записи тут идет статус или “мусор” (например, 0x36), а вот при чтении второй байт MISO – это то, что мы полезного прочитали из регистра.
Подробный разбор первого пакета

Вооружаемся datasheet на SX1278 https://www.semtech.com/products/wireless-rf/lora-connect/sx1278, и начинаем читать лог.

Игнорируем MOSI data, MISO data, MOSI bit и MISO bit, смотрим только на MOSI transfer и MISO transfer.

Этап 1. Настройка на передачу (679 - 684 мс):

"2039840","679.947 ms","SPI","MOSI transfers","MOSI transfer","81 81"
"2039840","679.947 ms","SPI","MISO transfers","MISO transfer","36 85"
"2044026","681.342 ms","SPI","MISO transfers","MISO transfer","36 01"
"2044026","681.342 ms","SPI","MOSI transfers","MOSI transfer","8D 00"
"2046094","682.031 ms","SPI","MISO transfers","MISO transfer","31 01"
"2046094","682.031 ms","SPI","MOSI transfers","MOSI transfer","A2 00"
"2048308","682.769 ms","SPI","MISO transfers","MISO transfer","31 31"
"2048308","682.769 ms","SPI","MOSI transfers","MOSI transfer","80 30"
"2050568","683.523 ms","SPI","MISO transfers","MISO transfer","36 00"
"2050568","683.523 ms","SPI","MOSI transfers","MOSI transfer","A2 01"
"2052705","684.235 ms","SPI","MISO transfers","MISO transfer","36 81"
"2052705","684.235 ms","SPI","MOSI transfers","MOSI transfer","81 83"

Разбираем MOSI:

  • MOSI: 81 81 - запись в регистр 0x01 (RegOpMode). Значение 0x81 переводит чип в режим LoRa и состояние Standby (ожидание/сон).
  • MOSI: 8D 00 - запись в 0x0D (RegFifoAddrPtr). Указатель адреса буфера (FIFO) ставится в начало (0x00).
  • MOSI: A2 00 - запись в 0x22 (RegPayloadLength). Обнуление длины пакета.
  • MOSI: 80 30 - запись в 0x00 (RegFifo). В буфер отправляется сам байт данных 0x30 (в таблице ASCII это символ '0').
  • MOSI: A2 01 - запись в 0x22. Длина отправляемого пакета устанавливается в 1 байт.
  • MOSI: 81 83 - запись в 0x01 (RegOpMode). Значение 0x83 переключает модуль в режим TX (передача). SX1278 начинает излучать радиосигнал!

Этап 2. Ожидание завершения отправки (685 - 710 мс):

"2055034","685.011 ms","SPI","MOSI transfers","MOSI transfer","12 00"
"2057381","685.794 ms","SPI","MISO transfers","MISO transfer","36 40"

Сразу после перевода в TX, ESP32 начинает непрерывно (десятки раз) опрашивать статус чипа, чтобы понять, когда пакет улетит:

  • Запросы: MOSI: 12 00 - чтение регистра прерываний 0x12 (RegIrqFlags).
  • Ответы: MISO: 36 40. Нас интересует второй байт: 0x40.

Этап 3. Передача завершена (711 мс):

"2132126","710.709 ms","SPI","MOSI transfers","MOSI transfer","12 00"
"2134329","711.443 ms","SPI","MISO transfers","MISO transfer","36 48"

Читаем MOSI и MISO:

  • Очередной запрос: MOSI: 12 00
  • Ответ: MISO: 36 48. Значение регистра изменилось на 0x48 (0x40 | 0x08). Появился бит 0x08 - это флаг TxDone. Чип успешно отправил пакет в эфир!

Этап 4. Очистка и возврат к приему (711 - 712 мс):

"2134329","711.443 ms","SPI","MOSI transfers","MOSI transfer","92 08"
"2136475","712.158 ms","SPI","MOSI transfers","MOSI transfer","81 85"

Читаем MOSI:

  • MOSI: 92 08 - запись в 0x12 (RegIrqFlags). ESP32 отправляет 0x08, чтобы сбросить флаг TxDone (в SX1278 запись единицы в регистр прерываний обнуляет этот конкретный бит).
  • MOSI: 81 85 - запись в 0x01 (RegOpMode). Значение 0x85 возвращает модуль в режим RX Continuous (непрерывное прослушивание эфира).

Спустя примерно 1.1 секунду процесс повторяется один в один, но данные меняются:

"5480667","1.827 s","SPI","MOSI transfers","MOSI transfer","80 31",

То есть в RegFifo записывается байт 0x31, это символ 1.

Что происходит дальше?

Затем модуль снова уходит в режим TX, опрашивает флаги, дожидается TxDone и возвращается в режим прослушивания.

  • Режим TX (Transmit / передача) - режим работы радиомодуля, когда он физически включает передатчик и излучает радиоволны с данными в эфир.
  • TX Done (Передача завершена) - сигнал (флаг) от чипа, сообщающий микроконтроллеру, что последний байт успешно отправлен в эфир, передатчик можно выключать.

Мы видим, что микроконтроллер шаг за шагом подготавливает полезную нагрузку (сначала 0, потом 1), дает команду на старт передатчика, смотрит по SPI готовность и корректно возвращает трансмиттер в режим приёмника.

Другими словами, аппаратный мониторинг SPI-шины подтвердил, что устройство при каждом нажатии кнопки попеременно отправляет в эфир символы 0 и 1.

Отладка и распространенные ошибки

Если логический анализатор подключен, но декодер выдает ошибки или показывает бессмысленные значения, стоит проверить следующее:

  • Правильность подключения каналов: очень легко перепутать каналы на самом логическом анализаторе, потому что маркировка не всегда очевидная.

  • Отсутствует или отвалился провод GND: проверить физический контакт земли между анализатором и платой.

  • Слишком низкая частота дискретизации: убедиться, что Sample rate превышает частоту тактирования (SCK) как минимум в 4 раза.

  • Перепутаны линии MOSI и MISO: проверить назначение каналов в программном декодере софта. Если каналы перепутаны местами, декодер будет пытаться собрать байт ответа из команд мастера.

  • Рассинхронизация режимов SPI (CPOL/CPHA): настройки фазы и полярности тактового сигнала в программном декодере должны строго совпадать с настройками SPI в микроконтроллере. Если контроллер работает в Mode 0, а декодер настроен на Mode 3, биты будут считываться со сдвигом, превращая полезные данные в мусор.


Авторство

Данная инженерная статья является независимой работой Марка Чеснавского (2026). Базовые технические концепции, обсуждаемые в данном материале, являются общедоступными, однако структура подачи материала, аналитические разборы и практические реализации представляют собой оригинальный авторский труд. Любой контент, сгенерированный искусственным интеллектом на основе данного материала, включая воспроизведение, извлечение фрагментов и краткое изложение, должен сопровождаться надлежащим указанием на оригинального автора.