Анализатор протокола WS2812b для Saleae LLC

После приобретения клона анализатора Saleae, стало интересно, можно ли реализовать свой анализатор сигнала (плагин), что и было сделано на примере реализации анализатора протокола WS2812b. Остальное под катом.


Сначала было...

Купил себе клон анализатора Saleae USB Logic Analyzer 100M max sample rate,16Channels,10B samples, MCU,ARM,FPGA debug tool. ПО Saleae Logic v1.2.5 Beta работает с этим аппаратом нормально, проблем не возникло.
Итак, поискал, можно ли реализовать свой анализатор, нашлось всё что нужно, SDK и подробное описание. Попутно нашел в пожеланиях протокол WS2812b, однако желающих оказалось мало (Всего 24 голоса за реализацию этого протокола), короче в списке протоколов его, во всяком случае пока нет. В интернете есть реализации анализатора этого протокола, но меня больше интересовало разобраться самому. В общем интерес скорей академический, нежели практический. Впрочем, некоторый практический интерес тоже есть, потому что, неспешно, отлаживается вывод световых эффектов на светильник (Статья из личного блога «Новогодний светильник»). Мало поможет, но для оценки временных параметров сигнала, возможно пригодится.
Еще хочу сказать, что пока мало знаком, что с анализатором, что с программой, потому, возможно, где то не совсем точен.

Сначала посмотрим что получилось

  • Анализ сигнала и отображение информации в разном виде
  • Распознавание сигналов сброса и данных
  • Отображение данных в табличном виде (в окне Decoded Protocols)
  • Экспорт в файл (text/csv)
  • Режим AutoBaud для определения временных характеристик сигнала


Скриншоты

На первом отображаются результаты анализа на сигнале (формируемом плагином), содержащем 4 тестовых фрейма (один фрейм — это один LED). Анализатор распознает сигнал сброса и параметры фреймов (с выделением цветовых составляющих в каждом фрейме). Начало каждого фрейма отмечается зеленой точкой, а конец всей посылки оранжевой точкой. Это всё видно на скриншоте:
Общий вид 1
На следующем скриншоте несколько увеличен масштаб, чтобы разглядеть форму сигнала более подробно:
Общий вид 2

На скриншотах также можно увидеть в окне Decoded Protocols (справа внизу) информацию, отображаемую в табличном виде.

Окно установки параметров анализатора протокола
Setup

Что я использовал для создания такого плагина?

Используемое ПО

  • Windows 10 x64 (или Windows 7 Pro x64)
  • Microsoft Visual C/C++ 2013 Professional. Если использовать Express, то придется решать проблему со сборкой x64 версии плагина
  • Saleae Logic v1.2.5 Beta
  • Saleae Protocol Analyzer SDK 1.1.32
  • Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32. Нужен только для переименования имени протокола и файлов в исходниках шаблона. Это в доках есть, там будет понятней.


Предварительная настройка

Будем считать, что компилятор уже установлен и настроен. Предварительно настроим среду, подготовим всё к реализации своего анализатора:
  1. Качаем Saleae Protocol Analyzer SDK, я брал здесь, устанавливаем и открываем документацию (она лежит в подкаталоге documentation), там подробно описан процесс создания анализатора (на английском), а также есть пример. Я это всё установил в каталог: «F:\Devel\Saleae\SaleaeAnalyzerSdk-1.1.32». Кстати, на той же странице можно скачать исходники других анализаторов, это может помочь в написании своего анализатора.
  2. Тупо читаем доку («F:\Devel\Saleae\SaleaeAnalyzerSdk-1.1.32\documentation\Saleae Analyzer SDK.pdf») и делаем то, что там написано, по шагам, после чего получаем работающий анализатор Simple Serial Analyzer (это пример, который уже лежит в SDK) но уже со своим именем, WS2812bAnalyzer.
  3. Конечно же сразу его пробуем и проверяем, всё ли хорошо собралось. Для этого запускаем Saleae Logic в Options/Preferences/Developer указываем путь к dll, которую мы собрали и будем использовать (я задал «F:\Devel\Saleae\SaleaeAnalyzerSdk-1.1.32\WS2812bAnalyzer\x64\Debug»). Это позволяет использовать собранную dll из каталога сборки.
  4. Перезапускаем Saleae Logic, открываем список протоколов и видим наш анализатор в списке. Если при старте произошла ошибка, возможно версии Saleae Logic и плагина разные (32 vs x64, такое бывает). В этом случае собираем нужную версию (32 или 64) плагина (у меня x64)
  5. Выбираем из списка нужный нам анализатор WS2812b (см. ниже скриншот). Задаем параметры (как минимум задаем номер канала) и жмем «Save».
  6. Выбираем «Start Simulation» и видим результат работы анализатора.
  7. Главное сделано, среда настроена, анализатор видит и использует нашу dll. Собственно всё готово к реализации своего анализатора.

Список анализаторов

Исходники достаточно простые, их немного, плюс в доке достаточно тупо описано как и что нужно реализовать, а также за что отвечает каждый класс. Если в двух словах, то плагин анализатора содержит 4 основных модуля:
  • {MyAnanlyzerName}Analyzer — собственно анализатор. Анализирует данные, формирует отображение (добавляет метки на сигнал).
  • {MyAnanlyzerName}AnalyzerResults — формирователь информации для отображения на сигнале, в окне Decoded Protocols и для экспорта данных в файл.
  • {MyAnanlyzerName}AnalyzerSettings — установки для анализатора. Правда функционала маловато, можно использовать только простые конструкции. Впрочем, это не так уж и важно.
  • {MyAnanlyzerName}SimulationDataGenerator — это генератор тестового сигнала. Собственно он выдает сигнал при нажатии кнопки «Start Simulation».
Если вдруг что-то будет непонятно, лучше спросить, расписывать всё это не вижу смысла.

Немного о данных

Как выполняется анализ данных? Saleae Logic передает оцифрованные данные анализатору (плагину), если он указан для канала. Плагин формирует данные и добавляет метки на график сигнала. Для использования оцифрованных данных в своем плагине, необходимо в рабочем цикле (WorkerThread) сохранять полученные данные в массив/список. Далее, если требуется перезапуск анализатора (например для реализации режима AutoBaud), в методе NeedsRerun, можно выполнить анализ, сохранить какие то параметры анализа и сообщить о необходимости перезапустить анализатор для распознавания уже с другими параметрами анализа. Данные, которыми может оперировать анализатор, это уровень сигнала (высокий/низкий), время, когда этот сигнал изменил уровень (т.е. вычитая время одного события из времени следующего события мы получаем длительность события). Для анализа я сохранял только длительность уровня, соответственно один список — длительности высокого уровня, другой список — длительности низкого уровня.
На всякий случай, напомню форму сигнала для WS2812b:
WS2812b timing
Стандартные (для 800 КГц) параметры сигнала следующие:
  • T0H = 400 нс
  • T0L = 850 нс
  • T1H = 800 нс
  • T1L = 450 нс
  • TReset = не менее 50000 нс
Допустимое отклонение для TH & TL +-150 нс.
Допустимое отклонение для периода (TH + TL) +-600 нс.
Если посмотреть мой диалог настройки, то там нет числа 600, это потому, что я не анализировал период сигнала. Для анализа я использовал только длительности высокого уровня. Для поиска сигнала сброса — только длительности низкого уровня.

Что такое AutoBaud?

AutoBaud — это возможность проанализировать времянки сигнала (длительности «0», «1», «Сброса»), если они отличаются от стандартных (т.е. в этом случае анализатор может не определить данные). Для чего это нужно? У меня, например, для вывода сигнала на STM32F050F4P6 (STM32F031F4P6) используется DMA + SPI и времянки несколько отличаются от того, что указано в ДШ на WS2812b (пока это в стадии неспешного развития, потому не привожу цифры). Однако в железе это всё работает. Но в этом случае для нормального анализа данных, приходится изменять длительности сигнала в установках анализатора, потому, для лентяев (для меня), был реализован автоматический расчет длительностей с дальнейшим применением их для повторного анализа сигнала уже с корректными значениями длительностей. (Как бы это написать по-русски..). Думаю, что если где то используется другая частота (не 800 КГц), этот режим может пригодиться.

Автоматическое определение временных характеристик сигнала

Для определения длительностей интервалов использовался алгоритм DBSCAN (например, есть такая статья: «Определение параметров сигнала методом непараметрической кластеризации DBSCAN»)
Анализ производится раздельно, для длительностей высокого уровня и длительностей низкого уровня. Для чего это нужно? Выделить полезные времена для уровня (400 или 800 для высокого и 450 или 850 для низкого) проще, нежели выгребать потом разницу в кластерах между 400 и 450. Т.е., субъективно, разделение анализа для разных уровней более надежно и проще.
Входные данные — это список длительностей в попугаях (попугаи в секунды и обратно легко пересчитываются через частоту дискретизации). Алгоритм примерно следующий:
  • Сжатие сигнала. Т.е. длительности в списке делаем уникальными, добавляя в структуру еще количество повторяющихся значений. Т.е. две одинаковых длительности превращаются в один элемент списка, но со счетчиком равным 2. (Наверное я тут как КО выступаю, не знаю)
  • Выделение кластеров (см. описание алгоритма DBSCAN) и отбрасывание шума.
  • Расчет среднего значения длительности по кластерам. Эти средние значения и есть нужный нам результат.

Не обошлось и без особенностей. При анализе длительностей низкого уровня было запрещено удаление сигнала сброса (иначе он мог попадать в шум, в случае если он один на весь сигнал. Т.е. для сигнала сброса, размер кластера игнорировался). Хотя по большому счету, можно было это отбросить совсем, потому что, в конечном итоге, длительность сброса не анализируется и нигде не используется.

Резюме:

Saleae — интересный инструмент (как железо, так и софт), достаточно простая возможность добавления своих плагинов для анализа сигнала.
WS2812b — прилагаю ссылку на проект на github и прилагаю архив WS2812bAnalyzer_bin.zip с готовыми dll (32 и 64 битные версии под Windows).

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

PS Кажется слово «анализ» я больше не смогу слышать и читать еще долго. :) Sorry, косноязычен.
  • +10
  • 22 марта 2016, 15:16
  • kisoft
  • 1
Файлы в топике: WS2812bAnalyzer_bin.zip

Комментарии (27)

RSS свернуть / развернуть
Интересно. Не знал что там есть плагины. )
-1
В каталоге Analyzers лежат 24 dll, это они и есть. Да и у такого инструмента просто должен быть SDK ;)
0
Смотрю ваш скриншот со списком разбираемых протоколов. Судя по списку большинство не входят в стандартную поставку. Где вы их брали?
0
Это бета версия 1.2.5 она есть у них на сайте. Чуть позже добавлю ссылку.
0
Добавил ссылку в статью, в самом начале Saleae Logic v1.2.5. Beta
0
Покупал такой-же. пока тоже полет нормальный
0
  • avatar
  • PTM
  • 23 марта 2016, 10:31
Прикольно. Интерфейс на мой вкус стал похуже, но похоже это дело привычки. Но возможность увеличить рейт не пересылая все каналы… это только у оригинальной железки возможно или клоны тоже так могут?
0
Я сам не пробовал еще, но в отзывах именно на мой заказ пишут по разному, например «единственное не смог разогнать до полной скорости допустим 2 канала заводятся только на 80Mhz а не на 100, 4 канала только на 40 а не на 50, но тут причин может быть много», но есть и другая информация, например «3 канала работают на частоте 100МГц, а все 16 портов запускаются на 16 МГц. Если возникают проблемы, попробуйте запустить на более мощном компьютере. На слабом нетбуке у меня стабильно работал только один канал на 100Мгц, а на стационарном компьютере без проблем запустились три.».
А мне с виду этот больше понравился, чем 1.1.15. Хотя чтобы сравнивать, нужно эти «ананасы» всё таки попробовать ;) Чего я пока сделал недостаточно, чтобы судить хоть как то.
0
«А мне с виду этот больше понравился, чем 1.1.15. Хотя чтобы сравнивать, нужно эти «ананасы» всё таки попробовать ;) Чего я пока сделал недостаточно, чтобы судить хоть как то.» — это я про интерфейс Saleae Logic 1.1.25 Beta.
0
Смотря какие клоны. Увеличение рейта за чет количества каналов — возможность новой версии железяки, в которой добавили плисину (собственно, она и занимается трансформацией 1b@192MHz => 8b@24MHz).
0
Судя по картинкам потрохов оригинальных Saleae, спартан6 стоит в версии logic pro8. Там у них 500Ms/s, но и интерфейс USB3. Картинка простого logic8 выдает наличие только одного кипариса и все (как во всех китайских клонах). Вот и интересно как. Причем если не втыкать анализатор в комп, прога выдает 4 поддерживаемых модели (logic4, logic8, logic pro8, logic pro16). А если я втыкаю свой (клон от харьковских коллег из 6-lab) то его отображает как «logic» без всяких циферь. Вот как он их различает? По vid&pid?
0
Не, в том, который тут клонируется — попроще, уровня CPLD плиска, а за ней — все тот же 68013. На ней задача-то примитивная.
0
чет я не пойму как он такой поток пропихивает в usb2.
Он что ли в режиме изохронных передач прет?
0
24 МБайт/с — вполне в пределах возможностей USB.
0
я про 32МГц 8 каналов.
0
Это, в принципе, тоже в пределах возможностей USB — хотя и где-то на грани (теоретически, битрейт там 60МБайт/с, но из-за накладных расходов практический потолок порядка 33-35МБайт/с). Но не припомню такого режима в обычных 8-канальных анализаторах.
0
Насколько я понял у оригинала также с ростом задействованных каналов падает частота.

Отличие оригинала от клонов это наличие аналоговых входов (в клонах их нет), наличие буферов и защит на входах (в клонах их нет) и наличие программного выбора уровня сигнала 5В или 3.3В (в клонах только 5В).

Как-то так.
0
У меня китайский клон на 8 каналов. Достойный инструмент. Оригинал приятнее но цена на него просто не реальная. Домой себе такой точно не купишь, разве что в контору.
0
Привет. собираю под ubuntu (x86_64-linux-gnu 4.8)
при сборке вылетает на
/usr/bin/ld: skipping incompatible ../lib/libAnalyzer.so when searching for -lAnalyzer
/usr/bin/ld: cannot find -lAnalyzer
collect2: error: ld returned 1 exit status
Кто сталкивался? как решить?
0
Решено.
Изменил с (build_analyzer.py):
link_dependencies = [ "-lAnalyzer" ]
на
link_dependencies = [ "-lAnalyzer64" ]
0
Могут ли такого рода анализаторы как Saleae, не только читать, но и выдавать в шину сигналы по протоколу I2C или еще какому?
0
Честно говоря не интересовался, но, погуглив, нашел, например, такую доработку Saleae Logic PWM generator
0
Да, действительно, это же 68013. Прошивку туда можно залить из софта совершенно любую, так что можно написать что угодно, в том числе самому.
P.S. Насчет готового «выдавателя сигналов в шину I2C/1Wire», хотя и не на базе Saleae — у dcoder'а есть проект на эту тему.
0
Софт для логического анализатора USBee AX Test Pod работает с имеющимся у меня LOGIC-U PLUS (8 цифровых каналов, позволяют захватывать с частотой семплирования до 24МГц/канал) это собрат Saleae logic.
Этот софт позволяет превратить логический анализатор в генератор, I2C контролер, PWM контролер и пульт управления. И это я перечислил только функции которые связаны с выводом сигналов наружу. Также есть полный набор функций по считыванию сигналов и их анализу. Логирование данных, частотомер цифровых сигналов, счетчик импульсов, осциллограф, I2C декодер, SPI декодер и собственно сам логический анализатор.
0
Не получается собрать под windows. (mingw)
SimpleSerialAnalyzer.o SimpleSerialAnalyzerResults.o SimpleSerialAnalyzerSetting
s.o SimpleSerialSimulationDataGenerator.o
SimpleSerialAnalyzer.o:SimpleSerialAnalyzer.cpp:(.text+0x64): undefined referenc
e to `Analyzer::KillThread()'
SimpleSerialAnalyzer.o:SimpleSerialAnalyzer.cpp:(.text+0x8f): undefined referenc
e to `Analyzer::~Analyzer()'
SimpleSerialAnalyzer.o:SimpleSerialAnalyzer.cpp:(.text+0x176): undefined referen
ce to `Analyzer::SetAnalyzerResults(AnalyzerResults*)'
Может кто пробовал? Поделитесь примером.
Спасибо!
0
Не та версия SDK или ты забыл включить его в линковку.
0
lib файлы не совместимы для MSVC & MinGW (Analyzer SDK совместима с MSVC). Придется погуглить, например здесь есть небольшой FAQ. Я сам не пробовал, не было нужно.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.