Знакомимся с Sigrok и логическим анализатором DSLogic

23 апреля 2018

Допустим, мы хотим отлаживать цифровую электронику. В предыдущих статьях я рассказывал об осциллографе Rigol DS1054Z, логическом анализаторе SUMP2 на базе iCEstick, а также плате Bus Pirate. Каждое из этих устройств поможет справится с задачей, но не то, чтобы слишком успешно. DS1054Z имеет всего 4 канала и его возможности по декодированию протоколов довольно скромны. Bus Pirate лучше может в протоколы, и каналов у него побольше, но он медленный. SUMP2 быстрый и имеет 16 каналов, но с ним вам придется самим считать единички и нолики. Неужели никак нельзя объединить сильные стороны этих устройств? Разумеется, можно! Иначе стал бы я начинать пост таким введением?

Что такое Sigrok?

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

Sigrok состоит из следующих частей:

  • libsigrok, ядро проекта, написанное на языке C, и состоящее в основном из драйверов для поддерживаемых устройств;
  • libsigrokdecode, библиотека, которая реализует декодирование различных протоколов (декодеры пишутся на Python);
  • sigrok-cli, консольная утилита, являющаяся фронтэндом к предыдущим двум библиотекам;
  • pulseview, GUI-фронтэнд, написанный на C++ и Qt;
  • sigrok-meter, GUI-фронтэнд для более удобного отображения медленно изменяющихся данных, например, температуры;
  • sigrok-dumps, коллекция записанных сигналов (файлы .sr) для тестирования декодеров и прочих целей;
  • sigrok-test, регрессионные тесты;

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

Выбираем логический анализатор

Sigrok поддерживает многие логические анализаторы. Вот некоторые интересные в смысле цены/качества устройства:

  • Noname Saleae Logic Clone. 8 каналов, частота дискретизации 24 МГц, не имеет встроенной памяти, триггеры не поддерживаются (Sigrok попытается эмулировать их программно). Может быть неплохим вариантом, если вы не работаете с высокочастотными сигналами (скажем, разрабатываете только под AVR), или, если если вам нужно 20 недорогих устройств для обучения студентов. На eBay можно найти по запросу «24mhz 8 channel logic analyzer». Цена составляет около 7$.
  • Mcupro Logic16 Clone. 16 каналов, до 100 МГц (в зависимости от числа используемых каналов), есть сжатие передаваемых данных, памяти и триггеров нет. На eBay можно найти по запросу «100mhz 16ch logic analyzer». Устройство обойдется вам где-то в 40$.
  • DreamSourceLab DSLogic. 16 каналов, до 400 МГц при использовании 4 каналов, встроенная поддержка триггеров, по 2 мегабайта памяти на канал. Устройство появилось благодаря кампании на Kickstarter и является открытым железом. На eBay вы найдете его по запросу «dslogic». Цены на железку начинаются от 70$.

Fun fact! Еще есть проект очень маленького и полностью открытого логического анализатора Fx2grok. В готовом виде он нигде не продается, но вы можете изготовить его самостоятельно. Устройство имеет 8 каналов и частоту дискретизации 24 МГц. Как и Noname Saleae Logic Clone, устройство основано на чипе Cypress FX2.

Как вы уже догадались, себе я решил взять DSLogic. Поэтому далее будет приведены примеры именно для этого логического анализатора. Впрочем, работа с другими устройствами будет мало чем отличаться.

Эксперименты с DSLogic

Итак, нам понадобятся следующие пакеты:

yaourt -S libsigrok-git sigrok-cli-git pulseview-git \
  sigrok-firmware-dreamsourcelab-dslogic

Здесь приведены названия пакетов для Arch Linux. В других операционных системах и дистрибутивах Linux установка может отличаться. В крайнем случае, Sigrok не сложно собрать из исходников.

Важно! Приведенные пакеты могут быть не очень стабильны, поскольку они собираются из master-веток. Я лично решил собрать их в не самый удачный момент, в результате чего PulseView часто крэшился. Но уже через пару дней все починили. В случае чего попробуйте собрать чуть более старый код или попросите помощи в рассылке.

Далее подключаем логический анализатор по USB и проверяем, что Sigrok его видит:

sigrok-cli --scan

В моем случае ответ был следующим:

sr: dreamsourcelab-dslogic: Failed to open potential device with
  VID:PID 2a0e:0021: LIBUSB_ERROR_ACCESS.

Для решения проблемы говорим:

sudo sh -c "echo 'SUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"2a0e\", "\
"ATTRS{idProduct}==\"0021\", MODE:=\"0666\"' > "\
"/etc/udev/rules.d/99-dslogic.rules"

Переподключаем устройство и проверяем, что теперь все работает.

Для просмотра всех доступных опций конкретного устройства (оно должно быть подключено) говорим:

sigrok-cli --driver dreamsourcelab-dslogic --show

Хорошо, давайте уже наконец запишем каких-нибудь сигналов! Я решил начать с сигналов, передаваемых между отладочной платой Nucleo-F411RE и OLED-экранчиком на базе SSD1306, работающего по 4-wire SPI:

Логический анализатор DreamSourceLab DSLogic

Как видите, устройства и провода зафиксированы на столе при помощи изоленты. Это существенно снижает вероятность того, что какой-то проводочек где-то случайно отойдет, и потом придется час разбираться, почему вместо ожидаемого сигнала мы видим какой-то мусор. Впервые этот прием я увидел на YouTube-канале OpenTechLab. Канал, к слову, совершенно топовый, и я всячески рекомендую на него подписаться. В частности, про Sigrok я узнал из этого канала. Что не удивительно, так как канал ведет Joel Holdsworth, автор PulseView.

Для записи сигналов я бы советовал использовать sigrok-cli. PulseView это тоже умеет, но не слишком хорошо (есть некоторые баги), во всяком случае, на момент написания этих строк. Уверен, со временем его доведут до ума, но пока проще сделать запись с помощью sigrok-cli и посмотреть результат в PulseView.

Выполняем следующую команду:

sigrok-cli --driver dreamsourcelab-dslogic \
  --config 'voltage_threshold=1.6-1.6:samplerate=10MHz:continuous=on' \
  --channels '0=CLK,1=MOSI,2=DC,3=CS' --continuous \
  --output-file ~/temp/ssd1306-spi.sr

Пока она выполняется, нажимаем Reset на плате Nucleo, чтобы перезапустить код. Затем останавливаем команду с помощью Ctr+C и смотрим результат:

pulseview ~/temp/ssd1306-spi.sr

Видим следующее:

Декодирование SPI в PulseView

Сразу после открытия PulseView он не будет пытаться декодировать SPI. Соответствующий декодер нужно включить, кликнув по иконке с желтым и зеленым сигналами (справа от иконки с красным щупом). Смотрите, как здорово! Больше не нужно считать битики — программа все делает за нас. Само собой разумеется, если вы откроете код библиотеки, использованной для общения с экранчиком, то именно эти байты и увидите в коде процедуры ssd1306_Init.

А что, если мы хотим сохранить декодированные данные или, скажем, скормить их какому-то скрипту? Эту задачу можно решить с помощью sigrok-cli таким образом:

# список доступных опций смотри в:
# sigrok-cli -P spi --show
sigrok-cli -i ~/temp/ssd1306-spi.sr \
  -P 'spi:mosi=MOSI:clk=CLK:cs=CS' -A 'spi=mosi-data'

Пример вывода:

spi-1: AE
spi-1: 20
spi-1: 10
spi-1: B0
...

Само собой разумеется, если бы экранчик использовал протокол I2C, с задачей мы справились бы ничем не хуже. Запись данных:

sigrok-cli --driver dreamsourcelab-dslogic \
  --config 'voltage_threshold=1.6-1.6:samplerate=2MHz:continuous=on' \
  --channels '0=SCL,1=SDA' --continuous \
  --output-file ~/temp/ssd1306-i2c.sr

Просмотр полученных данных в PulseView:

Декодирование I2C в PulseView

Декодирование при помощи sigrok-cli:

# список доступных опций смотри в:
# sigrok-cli -P i2c --show
sigrok-cli -i ~/temp/ssd1306-i2c.sr \
  -P 'i2c:scl=SCL:sda=SDA' -A 'i2c=address-write:data-write'

Пример вывода:

...
i2c-1: Address write: 3C
i2c-1: Data write: 00
i2c-1: Data write: AE
i2c-1: Write
i2c-1: Address write: 3C
i2c-1: Data write: 00
i2c-1: Data write: 20
i2c-1: Write
i2c-1: Address write: 3C
i2c-1: Data write: 00
i2c-1: Data write: 10
i2c-1: Write
...

Легко убедиться, что это те же самые данные, что передавались по SPI.

Наконец, посмотрим на данные, передаваемые между платой Nucleo и SPI flash чипом AT45DB161E:

sigrok-cli --driver dreamsourcelab-dslogic \
  --config 'voltage_threshold=1.6-1.6:samplerate=10MHz:continuous=on' \
  --channels '0=CLK,1=MOSI,2=CS,3=MISO' --continuous \
  --output-file ~/temp/spi-flash.sr

Данные в PulseView:

Декодирование протокола SPI flash в PulseView

Заметьте, что здесь был декодирован протокол SPI, после чего был декодирован работающий поверх него протокол SPI flash. То есть, декодеры можно объединять. Сделать это можно в свойствах протокола (в данном случае SPI), в выпадающем списке Stack Decoder.

Интересно, что декодер SPI flash не понимал некоторые команды данного конкретного чипа. Однако мне не составило большого труда написать патч, добавляющий поддержку недостающих команд (UPD: патч приняли). Писать декодеры оказалось весело, советую попробовать!

Заключение

Я в восторге как от Sigrok, так и от логического анализатора DSLogic. Это совершенно незаменимые инструменты, если вам часто приходится разрабатывать / отлаживать цифровую электронику. Есть, конечно, некоторые шероховатости. Sigrok определенно нельзя назвать зрелым, стабильным проектом. Чтобы все работало, как надо, нужно уметь «держать его правильно». С другой стороны, здесь открываются большие возможности в плане самореализации!

А пользуетесь ли вы логическим анализатором, и если да, то каким?

Дополнение: Основы написания декодеров для Sigrok на языке Python

Метки: , .

Понравился пост? Узнайте, как можно поддержать развитие этого блога.

Также подпишитесь на RSS, Google+, Facebook, ВКонтакте или Twitter.