Превращаем плату 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 вполне способна с ним справится:
Раз уж мы все равно воткнули iCEstick в USB-порт, давайте заодно подключим его к устройству, которое будем анализировать. Лично я использовал отладочную плату Nucleo-F411RE с подключенным SPI flash, как было описано в статье Микроконтроллеры STM32: работа с SPI на примере флеш-памяти AT45DB161E:
На каком пине iCEstick живет каждый из 16-и доступных каналов объясняет следующая иллюстрация:
На приведенной картинке каналы event[0:3] подключены к MISO, MOSI, SCK и CS шины SPI соответственно.
Важно! Не забудьте соединить земли логического анализатора и отлаживаемого устройства, иначе вместо сигнала вы увидите мусор. На фото земли соединены зеленым проводом, идущим отдельно ото всех остальных.
Последняя версия Python-составляющей проекта доступна на GitHub. Она состоит из двух скриптов:
- bd_server.py — представляет собой своего рода мост между iCEstick, с которым скрипт общается по UART, и прочими приложениями, взаимодействие с которыми осуществляется по TCP;
- sump2.py — общается с bd_server.py по TCP и предоставляет пользовательский интерфейс, написанный при помощи библиотеки PyGame;
Для работы скриптов понадобятся сторонние библиотеки. Чтобы не засорять ими систему, воспользуемся virtualenv:
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_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 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. Если все было сделано правильно, вы получите картинку, похожую на следующую:
На приведенном скриншоте от микроконтроллера к чипу AT45DB161E летят данные 10011111 (см MOSI и SCK), или байт 0x9F. Вы можете помнить, что это команда получения device id, в ответ на которую чип посылает пять байт с информацией об устройстве. Само собой разумеется, чтение данных, передаваемых по другим шинам, осуществляется ничуть не сложнее.
Итак, что же мы имеем в итоге? Эта штука работает. Баги есть, но мелкие. Заводится не в один клик, но порог вхождения, тем не менее, не высокий. Пользоваться довольно удобно. Если логический анализатор не является часто используемым инструментом в вашей работе, но какой-нибудь на всякий случай хотелось бы держать под рукой, SUMP2 видится мне не самым плохим вариантом.
Плюс этот проект открывает широкие возможности в плане самореализации. В том смысле, что можно реализовать для него хотя бы то же декодирование I2C, SPI и UART.
Дополнение: Вас также могут заинтересовать статьи Знакомимся с Sigrok и логическим анализатором DSLogic и Начало работы с Bus Pirate и примеры его использования.
Метки: FPGA, Электроника.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.