Превращаем плату iCEstick в логический анализатор

19 марта 2018

Логический анализатор — это устройство, похожее на осциллограф. В отличие от осциллографа, логический анализатор предназначен для работы только с цифровыми сигналами, но никак не аналоговыми. При прочих равных логический анализатор скорее всего будет дешевле осциллографа и предлагать больше каналов. В рамках этой заметки мы познакомимся с довольно нетипичным логическим анализатором SUMP2 от Black Mesa Labs. Нетипичен он тем, что представляет собой конфигурацию для iCEstick и запускаемую на компьютере клиентскую часть, написанную на Python 3.

Некоторые факты о SUMP2:

  • SUMP2 имеет 16 каналов, сигналы захватываются с 96 MSPS;
  • Устройство может работать только с 3.3-вольтовыми сигналами. Для 5 В на OSH Park доступен конвертер уровней на базе чипа SN74LVC244AN;
  • Python-составляющая проекта полностью переносима (работает на Windows, Linux, и тд);
  • Какое-либо умное декодирование UART/SPI/I2C и прочих шин в настоящее время не поддерживается;
  • Программная часть устройства полностью открыта, схема платы iCEstick также общедоступна;
  • Цена вопроса составляет в районе 22$ (официальная цена iCEstick);

Звучит достаточно интересно. Давайте посмотрим, заведется ли :)

Примечание: Резервную копию всех файлов, на которые приводятся ссылки далее по тексту, а также некоторых других файлов, имеющих отношение к SUMP2, вы найдете здесь (246 Кб).

Первым делом нам понадобится конфигурация для iCEstick. Она распространяется в виде проекта для iCEcube2 с исходным кодом на Verilog, а также скомпилированного .bin файла. Среда разработки iCEcube2 у меня не установлена, поэтому я воспользовался .bin файлом. Как оказалось, утилита iceprog из пакета IceStorm вполне способна с ним справится:

iceprog top_bitmap.bin

Раз уж мы все равно воткнули iCEstick в USB-порт, давайте заодно подключим его к устройству, которое будем анализировать. Лично я использовал отладочную плату Nucleo-F411RE с подключенным SPI flash, как было описано в статье Микроконтроллеры STM32: работа с SPI на примере флеш-памяти AT45DB161E:

Логический анализатор на базе iCEstick

На каком пине iCEstick живет каждый из 16-и доступных каналов объясняет следующая иллюстрация:

Распиновка логического анализатора SUMP2

На приведенной картинке каналы event[0:3] подключены к MISO, MOSI, SCK и CS шины SPI соответственно.

Важно! Не забудьте соединить земли логического анализатора и отлаживаемого устройства, иначе вместо сигнала вы увидите мусор. На фото земли соединены зеленым проводом, идущим отдельно ото всех остальных.

Последняя версия Python-составляющей проекта доступна на GitHub. Она состоит из двух скриптов:

  • bd_server.py — представляет собой своего рода мост между iCEstick, с которым скрипт общается по UART, и прочими приложениями, взаимодействие с которыми осуществляется по TCP;
  • sump2.py — общается с bd_server.py по TCP и предоставляет пользовательский интерфейс, написанный при помощи библиотеки PyGame;

Для работы скриптов понадобятся сторонние библиотеки. Чтобы не засорять ими систему, воспользуемся virtualenv:

mkvirtualenv sump2
workon sump2
pip install pygame pyserial

Скрипты bd_server.py и sump2.py я положил в каталог ~/opt. Скрипты мне пришлось прогнать через dos2unix, сказать им chmod u+x, а также заменить путь до интерпретатора на /usr/bin/env python.

Далее создаем файл bd_server.ini, в котором говорим, куда bd_server.py должен ходить по UART (шаблон конфига создается при первом запуске скрипта, и у меня он не преуспел в автоматическом поиске устройства):

bd_connection   = usb     # usb,pi_spi
bd_protocol     = mesa    # mesa,poke
usb_port        = /dev/ttyUSB1    # ie COM4 FT600
tcp_port        = 21567   # ie 21567
baudrate        = 921600  # ie 921600
mesa_slot       = 00      # ie 00
mesa_subslot    = 0       # ie 0
debug_bd_en     = 0       # ie 0,1
debug_tcp_en    = 0       # ie 0,1

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

$ ./bd_server.py

bd_server.py 10.16.2016 by khubbard.
 [OK]   bd_server.py running on Python3
 [OK]   Connection to TCP Socket 21567 established.
 [OK]   Connection to usb /dev/ttyUSB1 established.
 [OK]   bd_server.py is five-by-five.
----------------------------------------------------------------------
 bd_client <-> TCP Sockets <-> bd_server <-> /dev/ttyUSB1 <-> Hardware
----------------------------------------------------------------------
Press Ctrl+Break to terminate.

Наконец, запускаем sump2.py. Скрипт имеет достаточно понятный интерфейс, взаимодействие с которым осуществляется при помощи мыши и клавиатуры. В нем можно управлять курсорами, переименовывать каналы, настраивать триггеры, сохранять данные в файлы (например, VCD, для просмотра в GTKWave), загружать данные из файлов (в случае VCD на момент написания этих строк есть баги), и так далее. Я не буду останавливаться на интерфейсе подробно. Отмечу только, что для начала записи данных в выпадающем меню нужно сказать Acquire → Acquire RLE. Если все было сделано правильно, вы получите картинку, похожую на следующую:

Отладка SPI в логическом анализаторе SUMP2

На приведенном скриншоте от микроконтроллера к чипу AT45DB161E летят данные 10011111 (см MOSI и SCK), или байт 0x9F. Вы можете помнить, что это команда получения device id, в ответ на которую чип посылает пять байт с информацией об устройстве. Само собой разумеется, чтение данных, передаваемых по другим шинам, осуществляется ничуть не сложнее.

Итак, что же мы имеем в итоге? Эта штука работает. Баги есть, но мелкие. Заводится не в один клик, но порог вхождения, тем не менее, не высокий. Пользоваться довольно удобно. Если логический анализатор не является часто используемым инструментом в вашей работе, но какой-нибудь на всякий случай хотелось бы держать под рукой, SUMP2 видится мне не самым плохим вариантом.

Плюс этот проект открывает широкие возможности в плане самореализации. В том смысле, что можно реализовать для него хотя бы то же декодирование I2C, SPI и UART.

Дополнение: Вас также могут заинтересовать статьи Знакомимся с Sigrok и логическим анализатором DSLogic и Начало работы с Bus Pirate и примеры его использования.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.