Знакомимся с HydraBus и пытаемся понять, зачем он нужен

16 июля 2018

HydraBus — это открытый проект, представляющий собой небольшую отладочную плату на базе микроконтроллера STM32F415RGT6. HydraBus отдаленно напоминает Bus Pirate, только последний использует вместо STM32 микроконтроллер PIC24. Давайте же попробуем выяснить, что умеет HydraBus, и вообще, нужен ли он нам с вами.

Примечание: Далее предполагается, что вы имеете некоторый опыт работы с микроконтроллерами STM32. Если вдруг это не так, обратите внимание на пост Готовим «взрослую» среду разработки под STM32 в Linux.

Купить готовое или спаять самому?

HydraBus можно купить на сайте lab401.com «всего лишь» за 50€, плюс 25€ за доставку. Цена показалась мне неоправданно высокой, поэтому устройство было решено спаять самостоятельно. Файлы Gerber и BOM лежат на GitHub’е. Изготовление десяти плат у JLCPCB обошлось мне в 2$, плюс 6.3$ за доставку. Цена микроконтроллера STM32F415RGT6 составляет 11$ в розницу. Плюс конденсаторы, светодиоды и прочая мелочевка, которая у меня и так была. Ну пусть будет еще 5$. Итого суммарно 24.3$ против 75€, что составляло 88.5$ по курсу на момент написания этих строк. И это у меня еще осталось девять запасных плат.

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

Плата HydraBus, собранная в домашних условиях

У меня не нашлось угловых SMD кнопок, используемых в HydraBus, поэтому вместо них я вкорячил прямые. Понадобилась пара лишних проводочков, но в итоге все заработало. С обратной стороны платы используется сборка из четырех резисторов (R13), которой у меня тоже не нашлось. Эти резисторы не очень-то и нужны, так как они подтягивают с плюсу SPI-шину, идущую к SD-карте. Как мы выяснили в рамках заметки Учимся работать с SDHC/SDXC-картами по протоколу SPI, большинство SD-карт обходятся без этих резисторов. Но для порядку вместо сборки я впаял четыре отдельных резистора 0402.

В целом, самостоятельно спаять HydraBus оказалось достаточно просто. Все, что мне для этого понадобилось, это паяльная станция с феном (я использую ELEMENT 878D), паяльная паста (Mechanic XG-Z40), нормальный флюс (Kingbo RMA-218), пинцет, лупа с сорокократным увеличением и светодиодной подсветкой, а также не сильно дрожащие руки. После пайки плату нужно будет еще как-то отмыть. Я использовал ультразвуковую ванну GT Sonic VGT-800 с отмывочной жидкостью Solins-US. Но с тем же успехом можно использовать старую зубную щетку со спреем Flux-Off или баночкой спирта. Все названное можно без труда найти на каком-нибудь eBay или в Чип-и-Дипе. Ну, разве что, за исключением рук.

Если, как в моем случае, у вас уже есть все необходимые инструменты, плату однозначно дешевле и проще спаять самому. Однако если вы не планируете заводить дружбу с паяльником, дешевле и быстрее будет купить готовую плату.

Тестируем плату

В первую очередь проверяем мультиметром, что между 3V3 и GND нет короткого замыкания. Подаем питание. При этом должно гореть два светодиода — USB и PWR. На приведенном выше фото они находятся вверху слева. Если с этим все хорошо, пробуем подключиться к плате по SWD. Соответствующие шесть пинов на фото можно найти вверху справа, отдельно от всех остальных. Слева направо: 3V3, SWCLK, GND, SWDIO, NRST, NC.

Пользовательская кнопка идет к пину микроконтроллера PA0, а пользовательский светодиод — к PA4. Вооруженные этими знаниями мы без труда напишем и прошьем простенькую программу, вроде такой:

void init() {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
}

void loop() {
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);
    }

    HAL_Delay(100);
}

То есть, в целом, ничто не мешает использовать HydraBus в качестве отладочной платы. Но вряд ли этот проект был бы так интересен, если бы он представлял собой обычную отладочную плату, верно?

Прошиваем HydraFW

Для HydraBus существует несколько как бы официальных прошивок. Давайте познакомимся с дэфолтной прошивкой под названием HydraFW. Описание ее сборки можно найти здесь. Вот краткая версия:

git clone git@github.com:hydrabus/hydrafw.git
cd hydrafw
git submodule init
git submodule update
mkvirtualenv hydrafw
pip install GitPython intelhex
cd src
make
st-flash --reset write build/hydrafw.bin 0x8000000

Подключаем плату по USB. Если все было сделано правильно, User LED будет мигать, а в системе появится устройтсво /dev/ttyACM0.

Изучаем возможности HydraFW

Подключаемся к плате по UART при помощи screen:

screen /dev/ttyACM0

Смотрим список доступных команд:

> help

Помощь по конкретной команде:

> help show

Проверяем работу аппаратного генератора случайных чисел:

> random

D381F228

> random

3A16D1EE

Проверим работу с SD-картой:

> sd ls

245976 free clusters, 64 sectors/cluster, 512 bytes/sector
7871232 KiBytes free (7686 MiBytes free)
----a 2018/05/16 17:06     49274  dolphin.bmp
----a 2018/05/16 17:06     49274  monkey.bmp
----a 2018/05/16 17:06     49274  parrot.bmp
----a 1980/00/00 00:00       134  log.txt
   4 File(s),         0 MiB total    0 Dir(s)

> sd cat log.txt

Total blocks: 15742976 (7871 Mb); Free blocks: 15742528 (7871 Mb)
Total blocks: 15742976 (7871 Mb); Free blocks: 15742464 (7871 Mb)

Fun fact! Прошивка HydraFW не лишена дефектов. В моей коллекции SDHC-карт нашлась по крайней мере одна, с которой без проблем работает мой код, но которую при этом совершенно не понимает HydraFW.

Как и Bus Pirate, HydraBus с прошивкой HydraFW позволяет ходить во внешние устройства по протоколам I2C, SPI, UART и другим. Для примера попробуем поговорить с часами реального времени DS3231 (даташит [PDF]), вот такими:

HydraBus и часы реального времени DS3231

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

> i2c

GPIO resistor: pull-up
Frequency: 100khz (50khz, 400khz, 1mhz)

i2c1> show pins

SCL: PB6
SDA: PB7

i2c1> scan

Device found at address 0x68

Установим время на часах:

i2c1> [ 0xD0 0x00 0x20 0x19 0x19 0x07 0x01 0x07 0x18 ]

I2C START
WRITE: 0xD0 ACK 0x00 ACK 0x20 ACK 0x19 ACK 0x19 ACK 0x07 ACK 0x01 ACK ⏎
  0x07 ACK 0x18 ACK
I2C STOP

Здесь 0xD0 = (0x68 << 1), то есть, адрес устройства, за которым идет бит 0, означающий запись. Байт 0x00 устанавливает адрес (номер регистра), в который мы будем писать. Затем идут секунды, минуты, часы, день недели (1-7), день, месяц и год в BCD.

Для получения текущего времени нужно снова установить адрес в 0x00, и затем прочитать семь байт:

i2c1> [ 0xD0 0x00 ] [ 0xD1 r:7 ]

I2C START
WRITE: 0xD0 ACK 0x00 ACK
I2C STOP
I2C START
WRITE: 0xD1 ACK
READ: 0x26 ACK
READ: 0x22 ACK
READ: 0x19 ACK
READ: 0x07 ACK
READ: 0x01 ACK
READ: 0x07 ACK
READ: 0x18 NACK
I2C STOP

Для теста SPI поговорим с SPI flash чипом AT45DB041D:

> spi

Device: SPI1
GPIO resistor: floating
Mode: master
Frequency: 320khz (650khz, 1.31mhz, 2.62mhz, 5.25mhz, 10.50mhz, ?
  21mhz, 42mhz)
Polarity: 0
Phase: 0
Bit order: MSB first

spi1> show pins

CS:   PA15
SCK:  PB3
MISO: PB4
MOSI: PB5

spi1> frequency 10.5m

spi1> [ 0x9F r:5 ]

/CS ENABLED
WRITE: 0x9F
READ: 0x1F 0x24 0x00 0x00 0x00
/CS DISABLED

spi1> exit

Как видите, мы успешно прочитали device id.

Теоретически, поскольку в HydraBus реализован протокол Bus Pirate, плата должна работать с flashrom. К сожалению, на момент написания этих строк данная возможность была сломана. Подробности можно найти здесь.

Примеры работы с другими протоколами можно найти на вики проекта.

Дополнение: Поддержку flashrom как бы починили. Однако следует использовать форкнутый flashrom, поскольку pull request в апстрим пока что не приняли. Для дампа SPI flash памяти ее требуется подключить к SPI2 и воспользоваться командой:

./flashrom -p buspirate_spi:dev=/dev/ttyACM0 --read flash.dump

Пины у SPI2 следующие — CS = PC1, SCK = PB10, MISO = PC2, MOSI = PC3.

Заключение

Возможностей у HydraBus довольно много, и рассмотреть их все в рамках одной статьи не представляется возможным. Например, HydraFW также умеет работать с Sigrok и PulseView по протоколу SUMP. Доступно 16 каналов (пины с PC0 по PC15), можно записывать до 4096 сэмплов со скоростью до 2 MS/s. Это, конечно же, не самые выдающиеся характеристики. Но учитывая, что не всякий логический анализатор из той же ценовой категории может похвастаться 16-ю каналами, в некоторых задачах, пожалуй, может и пригодиться. Так или иначе, в роли сниффера HydraBus, похоже, не уступает Bus Pirate.

Из проектов, связанных с HydraBus, для самостоятельного изучения можно рекомендовать следующие:

Шилды HydraNFC и HydraFlash можно купить в собранном виде на lab401.com (раз, два), по очень завышенной цене.

Каков же вердикт, нужен HydraBus или не нужен? Давайте прикинем. Насколько я смог выяснить, по возможностям он ничем не уступает Bus Pirate, а во многом и превосходит (более удобные, не однобуквенные, команды, наличие SD-карты, существенно больше пинов, …). Сообщество разработчиков вокруг STM32, по всей видимости, несколько больше, ну или точно не меньше, чем вокруг микроконтроллеров PIC. Не удивительно, что для HydraBus существует довольно много связанных открытых проектов, в то время, как у Bus Pirate таких проектов особо и не наблюдается.

Как мне кажется, Bus Pirate уже можно закапывать, и светлое будущее за HydraBus. Конечно, у проекта есть кое-какие шероховатости. Но это делает его только интереснее в плане возможности стать контрибьютором. И в целом, должен отметить, проект производит впечатление довольно зрелого.

Дополнение: Вас также может заинтересовать статья Считываем и декодируем информацию о VGA-мониторе.

Метки: , .


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