Знакомимся с 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$ по курсу на момент написания этих строк. И это у меня еще осталось девять запасных плат.
Сборка платы занимает один вечер, результат выглядит как-то так:
У меня не нашлось угловых 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. Вооруженные этими знаниями мы без труда напишем и прошьем простенькую программу, вроде такой:
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. Описание ее сборки можно найти здесь. Вот краткая версия:
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:
Смотрим список доступных команд:
Помощь по конкретной команде:
Проверяем работу аппаратного генератора случайных чисел:
D381F228
> random
3A16D1EE
Проверим работу с SD-картой:
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]), вот такими:
Для начала выясним, к каким пинам мы должны подключить устройство, после чего определим его адрес:
GPIO resistor: pull-up
Frequency: 100khz (50khz, 400khz, 1mhz)
i2c1> show pins
SCL: PB6
SDA: PB7
i2c1> scan
Device found at address 0x68
Установим время на часах:
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
, и затем прочитать семь байт:
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:
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 и воспользоваться командой:
Пины у 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 на базе чипа TRF7970A, для работы с RFID-метками;
- Шилд HydraFlash, предназначенный для работы с Nand Flash;
- Шилд HydraESP32 на базе чипа ESP32, для работы с Wi-Fi;
- Шилд HydraLINCAN, для работы с шинами LIN и CAN;
- На HydraBus работает прошивка отладчика Black Magic Probe;
- Также на HydraBus запускается проект MicroPython;
Шилды HydraNFC и HydraFlash можно купить в собранном виде на lab401.com (раз, два), по очень завышенной цене.
Каков же вердикт, нужен HydraBus или не нужен? Давайте прикинем. Насколько я смог выяснить, по возможностям он ничем не уступает Bus Pirate, а во многом и превосходит (более удобные, не однобуквенные, команды, наличие SD-карты, существенно больше пинов, …). Сообщество разработчиков вокруг STM32, по всей видимости, несколько больше, ну или точно не меньше, чем вокруг микроконтроллеров PIC. Не удивительно, что для HydraBus существует довольно много связанных открытых проектов, в то время, как у Bus Pirate таких проектов особо и не наблюдается.
Как мне кажется, Bus Pirate уже можно закапывать, и светлое будущее за HydraBus. Конечно, у проекта есть кое-какие шероховатости. Но это делает его только интереснее в плане возможности стать контрибьютором. И в целом, должен отметить, проект производит впечатление довольно зрелого.
Дополнение: Вас также может заинтересовать статья Считываем и декодируем информацию о VGA-мониторе.
Метки: STM32, Электроника.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.