Самодельный логический анализатор. Доработка логического анализатора из китая. Технические характеристики логического анализатора Saleae logic analyzer

Ардуино – уникальный микроконтроллер, позволяющий вам создать любое устройство, ограниченное лишь фантазией инженера. Сегодня мы поговорим об одном из таких проектов и разберём антенный анализатор на Ардуино, а также все нюансы, с которыми вам придётся столкнуться при его пайке и программировании.

На самом деле анализатор спектра на Ардуино – достаточно простой проект, но идеально подойдёт новичкам и тем, кто хочет добавить данное устройство к себе в инструментарий. Давайте разберём, что такое логический анализатор на Аrduino, и какие подводные камни вас ожидают при его проектировке и пайке.

Схема логического анализатора на базе МК Arduino

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

Иными словами, каждые 5 вольт подаваемые на устройство – это единичка, отсутствие таковых – это ноль. Такой двоичный код используется при кодировке данных и во многих устройствах, в том числе на основе Ардуино. Читаться начинает, как правило, с единицы. А чтобы проверить свой проект с двоичной кодировкой, вам и пригодится логический анализатор.

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

  1. 4 канала для логического анализа поступающих сигналов.
  2. Вариативность частоты сигналов вплоть до 400 кГц, такой промежуток охватит большую часть современных приборов, кроме специализированных.
  3. Напряжение на входе должно составлять до +5 Вольт, как уже описывалось, это стандарт, принимаемый за единицу (наличие сигнала).
  4. LED дисплей для отображения информации. Особенно изощрённые программисты могут купить пару светодиодов и выстроить собственный дисплей нужной им диагонали, но для всех остальных – написание ПО под такое устройство будет слишком трудоёмким, и окажется лишним шагом. Поэтому здесь мы рассмотрим вариант устройства именно с ЖК дисплеем.
  5. 4 аккумулятора для питания, на 1.2 В при максимальном напряжении в 4.8 Вольт.
  6. Оперативная память. Желательно взять две разновидности – скоростную (3.6мс на сигнал) и низкоскоростную (36 с), такое решение позволит охватить весь диапазон сигналов.
  7. Панель управления или пара кнопок.
  8. Любая оболочка под крепление конструкции. Можно распечатать на 3-Д принтере, можно взять ненужный пластиковый коробок или обойтись вовсе без корпуса. Здесь мы не будем давать советов, устройство работает, что в оболочке, что без, выбор остаётся за вами.

Для питания вам необходимо подобрать именно аккумуляторы, так как 4 батарейки по 1.5 Вольта могут вывести Ардуино из строя и сжечь плату. Не говоря уже об опасности для ЖК дисплея. Поэтому не поскупитесь, и возьмите качественные комплектующие. Ведь качество конечного изделия равно параметру худшего его компонента.

Не забудьте добавить к конечной схеме переключатель S1, который будет использоваться для подачи питания и отключения прибора, чтобы аккумуляторы не разряжались попросту.

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

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

Рекомендуемая периферия для создания логического анализатора на базе микроконтроллера Arduino

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

  1. Сам микроконтроллер Ардуино. Не имеет разницы, какой вы подберёте, это лишь повлияет на конечный размер устройства. ПО под любую версию выглядит одинаково. На фото выше был использована плата .
  2. ЖК дисплей. Если у вас имеется старый кнопочный телефон, можете снять с него, и устроить «безотходное» производство.
  3. Резисторы различной ёмкости.
  4. Датчик тока.
  5. 4 аккумулятора.
  6. Светодиод или парочка.
  7. Карта памяти, но это опционально.

Помимо этого, вам, естественно, потребуется паяльник, припой и прочие принадлежности. Лучше заранее найти место, где вы будете всё это собирать. А если работаете с паяльником впервые, изучите правила пожарной безопасности и особенности его эксплуатации, чтобы по 10 раз не перепаивать каждую деталь.

Программирование МК Arduino при реализации проекта «логический анализатор»

Благодаря популярности Ардуино существуют уже готовые библиотеки и функции для логических анализаторов на этом МК. Вам остаётся лишь подобрать подходящую и переписать программный код под своё устройство. Ведь платы, датчики и прочие вводные у всех различаются, и чтобы ваше устройство работало без проблем, придётся подогнать чужой код под свои запросы. Если же вы не хотите лишний раз заморачиваться и у вас есть опыт программирования на С++, можете воспользоваться любой полюбившейся средой.

Код для схемы на фото выше может быть таким:

/*********************************** 128 by 64 LCD Logic Analyzer 6 channel and 3Mb/s By Bob Davis Uses Universal 8bit Graphics Library, http://code.google.com/p/u8glib/ Copyright (c) 2012, [email protected] All rights reserved. ********************************************/ #include "U8glib.h" // 8Bit Com: D0..D7: 8,9,10,11,4,5,6,7 en=18, di=17,rw=16 //U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 18, 17, 16); // **** NOTE **** I Moved the three control pins !!! U8GLIB_ST7920_128X64_4X u8g(8, 9, 10, 11, 4, 5, 6, 7, 1, 2, 3); int Sample; int Input=0; int OldInput=0; int xpos=0; void u8g_prepare(void) { u8g.setFont(u8g_font_6x10); u8g.setFontRefHeightExtendedText(); u8g.setDefaultForegroundColor(); u8g.setFontPosTop(); } void DrawMarkers(void) { u8g.drawFrame (0,0,128,64); u8g.drawPixel (20,1); u8g.drawPixel (40,1); u8g.drawPixel (60,1); u8g.drawPixel (80,1); u8g.drawPixel (100,1); u8g.drawPixel (20,62); u8g.drawPixel (40,62); u8g.drawPixel (60,62); u8g.drawPixel (80,62); u8g.drawPixel (100,62); } void draw(void) { u8g_prepare(); DrawMarkers(); // wait for a trigger of a positive going input Input=digitalRead(A0); while (Input != 1){ Input=digitalRead(A0); } // collect the analog data into an array // No loop is about 50% faster! Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; Sample=PINC; // display the collected analog data from array for(int xpos=0; xpos<128; xpos++) { u8g.drawLine (xpos, ((Sample&B00000001)*4)+4, xpos, ((Sample&B00000001)*4)+4); u8g.drawLine (xpos, ((Sample&B00000010)*2)+14, xpos, ((Sample&B00000010)*2)+14); u8g.drawLine (xpos, ((Sample&B00000100)*1)+24, xpos, ((Sample&B00000100)*1)+24); u8g.drawLine (xpos, ((Sample&B00001000)/2)+34, xpos, ((Sample&B00001000)/2)+34); u8g.drawLine (xpos, ((Sample&B00010000)/4)+44, xpos, ((Sample&B00010000)/4)+44); u8g.drawLine (xpos, ((Sample&B00100000)/8)+54, xpos, ((Sample&B00100000)/8)+54); } } void setup(void) { pinMode(A0, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(A3, INPUT); pinMode(A4, INPUT); pinMode(A5, INPUT); // assign default color value if (u8g.getMode() == U8G_MODE_R3G3B2) u8g.setColorIndex(255); // RGB=white else if (u8g.getMode() == U8G_MODE_GRAY2BIT) u8g.setColorIndex(3); // max intensity else if (u8g.getMode() == U8G_MODE_BW) u8g.setColorIndex(1); // pixel on, black } void loop(void) { // picture loop // u8g.firstPage(); do { draw(); } while(u8g.nextPage()); // rebuild the picture after some delay delay(100); }

Не забудьте скачать библиотеки для работы с Ардуино. А также учитывать, что вывод идёт на ЖК экран. По окончанию написания софта просто подгрузите его на плату с помощью специального переходника под usb.

Может случиться так, что из-за особенностей отображения информации на ЖК дисплее, вам не хватит постоянной памяти устройства. В таком случае имеет смысл докупить флешку и прикрепить её к системе. Благо делается это достаточно просто, а всё, что вам потребуется – специальный переходник под ваш форм-фактор физического накопителя.

Хоть и изредка, но возникает нужда отследить что происходит на каких-то логических линиях, причем синхронно на 4-8. Давно хотел заиметь для этих целей логический анализатор (дальше - ЛА) и наконец созрел.
Коротко для нетерпеливых - брать можно. Полностью соответствует заявленным характеристикам, софт вполне юзабельный. Подробнее - под катом:)

Что такое логический анализатор и для чего он нужен

Если коротко, то это что-то вроде очень грубого многоканального осциллографа. Очень грубого - он показывает лишь два уровня, 0 и 1, то есть превысил ли наблюдаемый сигнал заданный уровень или нет. Поэтому он и называется логическим, его предназначение - наблюдать логические сигналы, то есть логические нули и единицы.
Это бывает нужным, например, при отладке какого-то интерфейса с несколькими линиями - работа с памятью, синхронное управление чем-то, многопроводные интерфейсы и т.п. Его используют так же при реверс-инжиниринге, когда нужно изучить работу какого-то устройства, определить используемый протокол связи и даже получить дамп данных, передаваемых, например, по синхронному UART.
Многие ЛА кроме непосредственно записи сигналов могут их декодировать по определенным протоколам, хотя это и не является обязательным свойством ЛА. Особо навороченные могут даже с достаточной уверенностью автоматически определить используемый протокол, но это уже зависит от софта, прилагаемого к ЛА.

Доставка

Дошел просто мгновенно - 29 марта я заказал, а 11 апреля он уже лежал у меня в отделении. Шел обычной почтой, упакован был в стандартный желтый пакет с пупыркой. Ничего экстраординарного:)

Характеристики со страницы продавца

Особенности:
- маленький и легкий
- максимальная частота сэмплов: 100MHz на 3 каналах, 50MHz на 6 каналах, 32MHz на 9 каналах, 16MHz на 16 каналах
- большой объем сохраняемых сэмплов, поддержка сжатия
- встроенный ШИМ-генератор
- совместим с USB2.0/3.0
- мощный и легкий в использовании софт
- поддержка автоматического обновления онлайн
Характеристики:
- число каналов: 16
- максимальная частота сэмплирования: 100MHz
- ширина полосы измерения: 20MHz
- минимальная ширина захватываемого импульса: 20ns
- максимальный размер сохраняемых сэмплов: 10G/канал
- допустимое входного напряжение: -50V / +50V
- входное сопротивление и емкость: 220KΩ, 12pF
- настраиваемый уровень триггера: -4V ~ +4V, шаг: 0.01V
- количество каналов ШИМ-генератора: 2
- диапазон частот ШИМ: 0.1 ~ 10MHz
- шаг настройки частоты ШИМ-генератора: 10ns
- шаг настройки ширины импульса ШИМ-генератора: 10ns
- выходное напряжение ШИМ-генератора: +3.3V
- выходное сопротивление ШИМ-генератора: 50Ω
- потребление в режиме ожидания: 100mA
- максимальный потребляемый ток: 150mA
- размеры: 95mm * 55mm * 23mm
- поддерживаемые операционные системы: Windows XP, Vista, Windows 7/8/10(32/64bit)
- поддерживаемые стандартные протоколы: UART/RS-232/485, I2C, SPI, CAN, DMX512, HDMI CEC, I2S/PCM, JTAG, LIN, Manchester, Modbus, 1-Wire, UNI/O, SDIO, SMBus, USB1.1, PS/2, NEC InfraRed, Parallel, и т.д.…

Комплектация

Комплект состоял из двух пакетов - в одном был кабель USB, в другом сам анализатор со всеми причиндалами:

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


Вот бумажка покрупнее:

Сам анализатор выполнен в симпатичном корпусе вполне оригинального дизайна (по сравнению с набившими оскомину квадратными коробками, в которые китайцы лепят все что могут). Хотя кажется у Гаинты (Gainta) я видел среди типовых корпусов такой… Тем не менее смотрится очень хорошо. Сделано все очень аккуратно, нигде нет лишних зазоров, ничего не перекошено:)
На лицевом шильдике обозначено название модели, приведены краткие характеристики и разрисовано назначение пинов входного разъема. Кроме того есть индикатор, показывающий статус анализатора - в простое он плавно загорается и гаснет, во время сэмплирования часто мигает.
На одном из торцов входной разъем на 20 контактов - 16 каналов, две земли и два выхода ШИМ-генератора. На другом торце - USB-разъем:





В комплекте идут три гребенки по 9 проводов и две по два провода. Если с двухпроводными еще можно придумать что-то - например, одна для земли, вторая для двух каналов или для ШИМ-генератора, то зачем ТРИ большие гребенки - непонятно… Не иначе, одна из них запасная:)

При подключении двух девятиконтактных гребенок мы получаем все 16 каналов и две земли. Длина проводов на всех гребенках - 20 см, все провода оканчиваются изолированными термоусадкой «мамами» для подключения клипс. На каждой гребенке один провод имеет белую термоусадку - предполагается, что это земля, чтобы труднее было перепутать, остальные с черной термоусадкой:

Клипс - ровно 20 штук. То есть можно ими подключить все 20 контактов входного разъема - 16 каналов, 2 земли и 2 ШИМ-генератора. Вряд ли такое когда-то понадобится, но за нежадность китайцам плюс:) Цвета клипс особым разнообразием не страдают, в отличии от проводов:


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


«Мамы» проводов одеваются на эти штырьки довольно туго и сами соскакивать не проявляют желания, соединение довольно надежное.
Устройство клипс элементарное:




Никаких фиксаторов или защелок, задняя часть просто стягивается, а внутренняя пластина вынимается после поворота на 90 градусов. Штырек просто припаян, что не может не радовать в плане ремонтопригодности:)
Для подключения к проводу нужно надавить на заднюю часть, из носика выходит и раскрывается миниатюрный зажимчик. Задняя часть отпускается и под действием пружины зажимчик входит обратно, одновременно закрываясь:




Держит провод уверенно, как достаточно толстый, около 1.5мм, так и тоненький, где-то 0.3мм:




В целом качеством эти клипсы не блещут, но вполне работоспособны в большинстве случаев.

Работа анализатора, софт

Предварительно сразу нужно оговорить один момент: этот анализатор не имеет собственной памяти, все сэмплы сразу же передаются на компьютер, где и сохраняются. Правда, в характеристиках имеется упоминание о сжатии, так что, скорее всего, он не передает тупо 100 мегабит на канал при частоте сэмплирования 100 МГц. Тем не менее, при высоких частотах он очень требователен к качеству канала USB. В идеале корневой хаб, к которому подключен анализатор, не должен обслуживать никаких других клиентов. У меня, например, он заработал на полной скорости только в разъеме на передней панели компа. А на нетбуке он так и не смог обеспечить 50 МГц на 6 каналов, хотя на 5 каналов уже работал, и 100 МГц на три канала обеспечивал.

Итак, софт. Изначально я не обратил внимание на бумажку, где был адрес сайта с софтом, поэтому достал из закромов внешний DVD и честно попытался поставить программу с него. Программа поставилась, но вот драйвера не захотели вставать (Windows XP). Поиском в инете вышел на этот сайт, указанный в бумажке, и скачал оттуда чуть более свежую версию программы. Хотя драйвера в ней были вроде бы такими же, но из новой версии они встали нормально и анализатор ожил:)

Интерфейс программы на первый взгляд очень простой (да и на второй тоже, если честно). Сначала даже непонятно каким образом вообще можно делать в ней что-то полезное:) Но по мере углубления уважение к нему начинает расти:) В целом у меня сложилось такое впечатление от программы: совершенно ненавязчива, ничего лишнего, но вполне достаточна для большинства задач. Есть и мелкие недочеты, конечно, но они не сильно портят впечатление.
Вот так выглядит окно программы:


Быстрыми кликами можно настроить частоту сэмплирования и глубину (количество) сохраняемых сэмплов:


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

Под рукой у меня была платка, в которой можно было обнаружить лишь SPI и USB, вот их я и решил посмотреть. На скриншотах будут уже настроенные каналы, изначально же никаких данных на сигналах нет и каналы называются просто - Chanel 0, Chanel 1 и т.д.
Первые два канала я подключил к USB, 4 следующих - к SPI и запустил анализатор. Вот что получил в целом:


Это все 2 секунды наблюдения:) Теперь нужно подключить декодирование. Выбираем в списке нужный протокол:

И появляется окно настройки этого протокола.
Для USB:


Для SPI:


Как видно, у SPI довольно богатые настройки, позволяющие смотреть этот протокол во всех его проявлениях.
После назначения каналов сигналам протокола программа предлагает автоматически переименовать каналы по названиям сигналов, это у меня на скриншотах уже как раз и сделано. И теперь над графиками при достаточном увеличении будут показываться данные согласно протоколу. Например, вот один их фреймов USB:


Как видно, программа не просто показывает численные значения передаваемых байтов, но и их внутрипротокольное значение - CRC, SYNC, ACK и т.д. Правда, есть места, которые мы с программой не поняли, такое ощущение, что скорость USB резко замедляется в какие-то моменты:

А вот кусок обмена по SPI:

Вот так это будет выглядеть в файле:

Кроме того, можно сохранять не сэмплы, а данные декодированного протокола. Вот, например, кусок сохраненного обмена по CAN в моей машине (скриншотов, к сожалению, не делал):
Time [s],Packet,Type,Identifier,Control,Data,CRC,ACK 0.0002935s,0,DATA,0x0591,0x08,0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00,0x284A,ACK 0.0016248s,1,DATA,0x05D1,0x02,0x10 0x00,0x0249,ACK 0.0023359s,2,DATA,0x0635,0x03,0x00 0x00 0xFD,0x0D93,ACK 0.0033871s,3,DATA,0x0470,0x08,0x40 0x01 0x00 0x46 0x00 0x00 0x00 0x1F,0x5D2D,ACK 0.0046378s,4,DATA,0x0531,0x04,0x01 0x40 0xF0 0xB1,0x40D3,ACK 0.005489s,5,DATA,0x05C1,0x04,0x00 0x00 0x00 0x20,0x0AA2,ACK 0.0063502s,6,DATA,0x065F,0x08,0x01 0x5A 0x5A 0x5A 0x36 0x31 0x5A 0x43,0x3840,ACK 0.0075009s,7,DATA,0x0651,0x08,0x80 0x02 0x50 0xAF 0x38 0x57 0x00 0x00,0x50D4,ACK 0.0086621s,8,DATA,0x0621,0x08,0x20 0x2C 0x69 0x18 0x81 0x64 0xFD 0x00,0x4FE1,ACK 0.0233258s,9,DATA,0x0291,0x05,0x00 0x00 0x00 0x00 0x00,0x1DE1,ACK 0.0333432s,10,DATA,0x03E1,0x08,0x20 0x00 0x30 0x01 0xA2 0x00 0x84 0x00,0x50DB,ACK 0.0432946s,11,DATA,0x03C3,0x08,0xAB 0x00 0x00 0x00 0xA8 0xF0 0x00 0x64,0x0F7B,ACK 0.0444855s,12,DATA,0x040C,0x08,0x00 0x01 0x01 0x01 0x00 0x00 0x00 0x00,0x290F,ACK 0.053637s,13,DATA,0x0470,0x08,0x40 0x01 0x00 0x46 0x00 0x00 0x00 0x1F,0x5D2D,ACK 0.0548882s,14,DATA,0x0531,0x04,0x01 0x40 0x00 0x41,0x191A,ACK 0.0632503s,15,DATA,0x0291,0x05,0x00 0x00 0x00 0x00 0x00,0x1DE1,ACK 0.0666019s,16,DATA,0x0497,0x08,0x00 0x00 0x00 0x00 0x64 0x00 0x00 0x20,0x501A,ACK 0.0733737s,17,DATA,0x0151,0x04,0x00 0xE0 0xB0 0x50,0x5718,ACK 0.0833265s,18,DATA,0x02C1,0x06,0x00 0x00 0x00 0x00 0x06 0x00,0x5677,ACK 0.0843872s,19,DATA,0x0359,0x08,0xB8 0x01 0x00 0x00 0x00 0x2B 0x40 0x00,0x4875,ACK 0.0856485s,20,DATA,0x035B,0x08,0x08 0xB4 0x0C 0xB5 0x0B 0xFF 0x02 0x80,0x157E,ACK 0.0868492s,21,DATA,0x0369,0x08,0x3F 0x00 0x00 0x00 0x00 0x00 0x00 0x00,0x45C9,ACK 0.0881104s,22,DATA,0x0381,0x06,0x01 0x00 0x00 0x00 0x00 0x00,0x18D3,ACK 0.0892516s,23,DATA,0x0397,0x08,0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00,0x4293,ACK 0.0905824s,24,DATA,0x03B5,0x06,0x00 0x00 0x00 0x00 0x00 0x00,0x007C,ACK 0.0916936s,25,DATA,0x0457,0x03,0x01 0x40 0x00,0x6539,ACK 0.0925447s,26,DATA,0x04B9,0x06,0x00 0x00 0x00 0x00 0x00 0x00,0x11A3,ACK 0.0936154s,27,DATA,0x0400,0x08,0x0C 0x01 0x09 0x05 0xAC 0x00 0x00 0x00,0x3DDD,ACK

Что еще есть? при ведении курсора по графику канала автоматически показывается ширина текущего импульса, период, частота и заполнение (актуально для ШИМ). Можно вывести два или три маркера и таскать их по графику, при этом они будут притягиваться к ближайшим фронтам и спадам. Справа будет выводиться информация о точном времени маркера и временном промежутке между ними:


Тут маркеры стоят на началах фреймов USB, которые, как известно, с довольно высокой точностью следуют каждую миллисекунду, что анализатор и подтверждает. Или, скорее, подтверждает свою достаточно хорошую точность:)

ШИМ-генератор

Ну, тут все просто. Он есть, оба канала, все работает. Быстро включить-выключить каждый из каналов можно прямо в главном окне наверху, нажав на соответствующую надпись (PWM1 PWM2). Зеленая - активен, красная - отключен. Настройки генератора вызываются в отдельном окне:


Что еще про него сказать - не знаю даже:)

Внутренности

Построение, как я подозреваю, классическое - входное согласование, компараторы триггера, ПЛИС и контроллер с USB. Я вообще подозреваю, что это клон того же Saleae:)








Вторая сторона платы совершенно пуста.
Все очень аккуратно, никаких соплей, неотмытого флюса и т.п. Внутренности не нарушают гармонию внешности:)

Итог

Аппарат мне понравился. Все, что в нем заявлено - работает. Софт произвел очень приятное впечатление. Честно говоря, даже не ожидал от китайцев такой работы:) Есть и недостатки, но мелкие - хотелось бы, например, присваивать сигналам разные цвета. Но это уже скорее придирки.

Довольно часто в домашних электронных поделках возникает необходимость посмотреть тот или иной сигнал, причем достаточно его цифрового представления - что передает МК по I2C, правильно ли настроен ШИМ и т.п. Если на работе есть хороший осциллограф, то покупать его для дома - слишком дорогое удовольствие, особенно, когда необходимость возникает лишь от случая к случаю.
В последнее время появились недорогие (в пределах $50) логические анализаторы, однако меня от их покупки всегда останавливало одна мысль: штука то предельно простая, почему бы не сделать её своими руками из подручных материалов?
В данной статье я расскажу, как сделать простой логический анализатор с минимальными финансовыми затратами - все что нужно это отладочная плата Stm32F4Discovery .

Логический анализатор (далее ЛА) – устройство предназначенное, для записи, просмотра и анализа сигналов в цифровых схемах. Подобно осциллографу, ЛА подключается одним или несколькими щупами к анализируемой схеме, но в отличие от осциллографа фиксирует только два состояния сигнала «0» и «1». Важной функцией ЛА является способность автоматически расшифровывать записанные сигналы, например, разобрать обмен данными по шине I2C или SPI. Также ЛА отличаются бОльшим, по сравнению с осциллографами, количеством анализируемых линий: от 8 в простых анализаторах до сотен в промышленных образцах.
Описываемый здесь проект - LogicDiscovery - это SUMP -совместимый логический анализатор, выполненный в формате USB-приставки к ПК. Он обладает довольно скромными характеристиками: 20MHz, 16 каналов, 24кБ памяти. Однако, этого достаточно для весьма большого круга задач: анализ линий UART, I2C, SPI (в пределах нескольких мегагерц), параллельных шин, измерение временных характеристик сигналов и т.п.

Приступим

Итак, все, что нам понадобится это:
  • Отладочная плата Stm32F4Discovery . От 500 рублей в московской рознице, а может она уже лежит в ваших закромах? Подойдет и любая другая плата на STM32F4 или STM32F2, но тогда придется подправить исходники.
  • Несколько проводов, для подключения к анализируемой схеме.
  • Прошивка, готовая к употреблению лежит на Google.Code . Там же находятся исходники.
  • Кроме того нужен клиент для ПК, рекомендую OLS .
Клиент написан на Java, поэтому полученное решение не зависит от ОС. Теоретически вы можете использовать любой SUMP-совместимый клиент, однако ниже я буду описывать работу именно с этой программой.
Stm32F4Discovery питается от порта mini-USB, через который она и прошивается. Для использования функций ЛА плата подключается к ПК через порт micro-USB. Чтобы запитать плату от этого же порта соединяем перемычкой пины PA9 и 5V . PA9 подключен напрямую к Vbus порта micro-USB, а 5V это вход стабилизатора формирующего питание для платы. Для проверки работы соедините порты PA2 и PD0 . На PA2 формируется тестовый сигнал, а PD0 это первый вход ЛА.

Плата опознается ПК как COM-порт, для Linux драйвера стандартные и должны уже быть в ядре, для Win драйвера скачиваются с сайта ST. После того как плата опозналась можно запускать клиент и приступать к работе.
Но сначала ложка дёгтя.

Ограничения

В проекте используется открытый протокол SUMP . Данный протокол изначально разрабатывался для ЛА на базе ПЛИС, и поскольку в части записи входных сигналов и анализа потока данных микроконтроллеры по-прежнему им уступают, нам будут доступны не все функции реализованные в клиенте:
  • Максимальная частота записи – 20МГц, в оригинале до 200МГц
  • RLE-сжатие и фильтрация шумов не поддерживаются.
  • Нельзя выбрать произвольные группы каналов, только первую (8 каналов), либо первую + вторую (16 каналов).
  • Триггеры работают не по значению, а по фронту (впрочем, на мой взгляд, это уже достоинство).
  • Нет поддержки расширенных (Complex) триггеров.
Эти ограничения следует иметь ввиду при настройке клиента. Тот ничего не знает об этих ограничениях и позволит выбрать любые настройки. Полученный результат в этом случае будет некорректным.

Пользуемся

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

В меню «Capture» , выбирая пункт «Begin capture» , открываем окно настроек записи. На первой странице в поле ««Analyzer port» выбираем порт, на котором сидит наш ЛА, больше ничего менять не нужно. Кнопкой ««Show device metadata» можно проверить наличие связи:

На второй странице указываем параметры захвата. Первые два пункта не трогаем,
«Sampling rate» не выше 20МГц (если указать больше – плата все равно использует 20МГц, но клиент будет думать, что используется указанное значение, в общем, ерунда получится).
«Channel groups» : 0 – используем одну группу каналов, это линии PD0-PD7, либо 0 и 1 – используем две группы каналов - линии PD0-PD15.
«Recording size» : для одной группы каналов – любое значение, для двух групп – не более 12kB (клиент предупредит, если в данном поле выбрано неверное значение).
Чекбоксы на данной странице не трогаем, они не поддерживаются:

Страница «Triggers» - самое интересное. Первый флажок ставим, чтобы просто включить триггеры.
«Before/After ratio» позволяет указать, в процентном соотношении, сколько данных сохранить до срабатывания буфера. После нажатия «Capture» ЛА сразу начинает запись данных, складывая их в циклический буфер, а по срабатыванию триггера отсчитывает указанный в поле After процент времени и отправляет данные на ПК.
«Type» - только «Simple», «Complex» - не поддерживается.
«Mode» - только «Parallel».
«Mask» - это те линии, на которых триггер будет ожидать перепад сигнала, поставте флаг в нулевой позиции для срабатывания по линии PD0
«Value» - фронт сигнала, по которому будет происходить срабатывание триггера. Флажок установлен – передний фронт. Флажок снят – задний:

Для проверки работы соедините порты PD0 и PA2 (на данном порту выводится тестовый сигнал UART) перемычкой.

Вот и все, нажимаем «Capture» и смотрим на полученный сигнал (Ctrl+F - обзорный масштаб):

Если ничего не происходит, значит, вы выставили срабатывание триггера на неправильные линии, или сигнала вовсе нет - проверьте настройки и подключение платы. Триггер можно запустить вручную, нажатием User button (синяя кнопка).

Техника безопасности

Помните: вы подключаетесь напрямую к портам микроконтроллера! Никакой защиты, кроме встроенных в МК диодов на плате нет. Поэтому сначала удостоверьтесь что, изучаемый сигнал имеет максимальное напряжение 3.3В, в крайнем случае 5В, но тогда желательно добавить между источником сигнала и ЛА защитный резистор.

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

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

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

красная — цангового типа, мелкая, очень удобная — легко цепляет ногу attiny2313 в SOIC

Используется только нижняя половина разъема, это 8 каналов, GND, VCC(который имеет двоякое назначение: в версии STD это питание входного преобразователя уровней, тоесть, если его запитать от 12в, логической единицей будет 12, а если от 5, то и за «1» будет 5В), на который в этой версии(и в PRO)вывели 5В,100мА, но не подключили ни к одному проводу, а добраться до него при вставленном разъеме нельзя — а на кой мне эти пять воль без возможности измерений?

В версиях выше STD был исключен входной преобразователь уровней, это было сделано для обеспечения совместимости с USBee AX, диапазон которого ограничен +3.3 и +5, а мне например больше и не надо:) А в версии PRO добавлен АЦП, который работает в режиме осциллографа(+-1В, и делитель 1:10 в комплекте).

Верхняя часть разъема содержит в себе переключалку(три контакта, и джампер) режима работы – косить под USBee или работать со своей программой, и контакты TRG, GND, CLK.

Максимальная частота обновления у каждого канала это 24 мГц, а вот с заявленным «неограниченным временем записи» непонятное — судя по поведению программ от AX — в приборе есть некий фиксированный буфер, время заполнения которого зависит от частоты(ее можно уменьшить), который затем передается на комп, и там обрабатывается.

При частоте 24мГц, можно записать максимум 300М состояний время записи при этом составит 12 секунд
Если понизить частоту до 6мГц, можно писать в течении 50 секунд, а при 1мГц буфера хватит на 300 секунд. С учетом того, что можно настроить запись по событию, этого времени должно хватить – у меня пока проблем не возникало.

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

Есть так же вход-выход CLK, с которого можно как тактированить наблюдаемое утройство, так и брать тактовый сигнал с устройства (если он присутствует отдельно в протоколе, как например в SPI)

(в случае версии STD, это единственный вариант, если не перешивать EEPROM, но в этом случае мы лишаемся возможности вывода сигналов, из за входного преобразователя, так как он видимо односторонний)
Простое, умеет расшифровывать I2C, 1WIRE, UART, SPI, имеет SDK для написания своих анализаторов(на.NET).
Минусы:
Написано на.NET – очень любит кушать память, три-четыре измерения сьедают 500мб памяти, приходится перезапускать.
Не умеет расшифровывать ЮСБ
Плюсы:
Сохраняет состояние и настройки анализаторов при перезапуске
Есть функция AutoBaud(удобно при перехвате UART)
Похож на USBee Suite, только не такой функциональный

USBee Suite
Графическая оболочка для пакета программ USBee AX Test Pod
Очень красиво и наглядно, пожалуй на этом все. Умеет все, что умеет USBee AX Test Pod

USBee AX Test Pod
Комплект программ, идущих в комплекте к USBee AX(c другими версиями они немного другие)

Data Logger

Digital Frequency Generator – генератор частот

Digital Voltmeter – вольтметр(нужен аналоговый вход)

Oscilloscope – осциллограф

Pulse Counter – счетчик импульсов


Собран анализатор качественно, в качестве нижней части корпуса используется печатная плата(на фото видны переходные отверстия, а поскольку к ним не ведет дорожек, логично предположить что она многослойная). А судя по расположению USB разъема(вверх ногами), скорее всего там еще одна плата, под крышкой, к ней и припаян разъем.
В общем, покупкой доволен, как-никак хороший анализатор, за небольшие деньги. А осциллограф удобнее отдельный иметь.

Если есть желание прикупить, то можете написать сюда или мне на почту — [email protected] , будет профит в виде скорости и скидки:)

DI HALT:
Тем временем, вот уже пол года, на просторах Казуса народ вовсю клонирует этот девайс. Т.к. собран он, фактически, на одной микросхеме и все фичи делаются в нем программно. Микросхема эта представляет собой микроконтроллер с аппаратной поддержкой USB и загрузкой программ через USB, что позволяет ее налету превращать во что угодно только за счет софтверной поддержки. Естественно клонируется она тоже влет, т.к. аппаратной защиты тут никакой нету, ну а крякнуть управляющую софтину для опытных бойцов софтайса дело не хитрое.

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

Основные характеристики прибора:

  • до 32 входных каналов;
  • память 128 КБайт на каждый канал;
  • частота дискретизации до 100 МГц;
  • вход внешнего тактирования;
  • все входы совместимы с 3.3 В и 5 В логикой;
  • настраиваемый размер буфера предвыборки/поствыборки кратный 8 КБайт;
  • 16 битный генератор внутренней синхронизации;
  • несколько режимов внутренней синхронизации;
  • программируемая задержка синхронизации;
  • программируемый счетчик событий синхронизации;
  • вход внешней синхронизации;
  • коммуникация с ПК по LPT (EPP режим) или USB интерфейсу;
  • несколько версий приложений для ПК под различные операционные системы.

Основным элементом логического анализатора является ПЛИС , производства компании , которая и выполняет все основные функции. Принципиальная схема прибора изображена на Рисунке 1.

В качестве источника тактовой частоты для ПЛИС используется осциллятор IC4 (IC6), позаимствованный со старой материнской платы компьютера. Несмотря на то, что осциллятор рассчитан на работу при напряжении 5 В, проблем в работе прибора при питании его напряжением 3.3 В выявлено не было.

Для хранения выборок используется внешнее быстродействующее ОЗУ - микросхема .

Для питания прибора используется внешний источник с выходным напряжением до 15 В. ПЛИС и ОЗУ имеют напряжение питания 3.3 В, поэтому установлен регулятор напряжения 3.3 В серии LD1117DT33 .

Коннектор параллельного порта K7 размещен на плате логического анализатора и подключен непосредственно к ПЛИС. Печатная плата логического анализатора двухсторонняя, используются компоненты для поверхностного монтажа и обычные компоненты с выводами. Вид печатной платы показан на Рисунке 2.

Замечание. Вместо вывода 40 (Vss) микросхемы SRAM к «земле» подключен вывод 39 этой микросхемы. Решение: соединить на печатной плате вывод 39 и 40 вместе (вывод 39 не используется в микросхеме SRAM).

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

Адаптер USB интерфейса для логического анализатора собран на микросхеме серии FT2232C производства компании FTDI. Данная микросхема объединяет в себе функциональность двух отдельных микросхем FT232BM и FT245BM. Она имеет два канала ввода/вывода, которые конфигурируются отдельно. Основные моменты конфигурации FT2232C для применения в составе прибора - это питание от USB интерфейса и режим эмуляции шины микроконтроллера (MCU Host Bus Emulation mode). Этот режим конвертируется в протокол EPP посредством мультиплексора IC3 74HCT4053D. Так как непосредственное декодирование сигналов /DST, /AST и RD/WR может вызывать конфликты таймингов, используется дополнительный сигнал A8, который используется в качестве сигнала RD/WR (чтение/запись) в периоды передачи данных по EPP протоколу.

Коннектор JTAG (CON2) используется для конфигурирования ПЛИС - это для будущих разработок, на текущий момент данный интерфейс не используется.

Микросхема EEPROM серии 93LC56 (IC2) хранит конфигурационные данные для микросхемы FT2232C и является обязательным элементом для правильного функционирования программируемого интерфейса. Для программирования данной микросхемы используется утилита FT_Prog (ранее она имела название MProg). Данная утилита и драйвера FT2232C доступны для скачивания на сайте компании FTDI.

Печатная плата адаптера разработана односторонней, что упрощает ее изготовление.

Существует также версия B 1.0 адаптера USB интерфейса (Рисунок 5). Данная версия отличается отсутствием коннектора JTAG и печатной платой, которая выполнена с учетом встраивания ее в корпус коннктора CANNON 25. Внешний вид собранных адаптеров а Рисунке 6.

a) b)
Рисунок 6. Внешний вид адаптера USB интерфейса версия A 1.1 (а) и версия B 1.0 (b)

Также имеется еще одна версия схемы логического анализатора (Рисунок 7), в которую уже интегрированы интерфейсы USB и LPT. Автором этого варианта является Bob Grieb и при разработке схемы использовалась среда TinyCAD, печатная плата для него разрабатывалась в редакторе FreePCB.