Современные микроконтроллеры часто взаимодействуют с периферийными устройствами через SPI‑шину. Проверить корректность работы SPI, отправить произвольные байты и посмотреть ответ бывает не так просто без специального оборудования. В этой статье мы разберём проект SPI DevTool — инструмент, который превращает STM32 в удобный веб‑интерфейс для отладки SPI.
Раз за разом начиная, разбирая, или вспоминая разные аппаратные решения, приходится сталкиваться с необходимостью (а то и просто - желанием) "пощупать" SPI-устройство, чтобы понять, как оно работает.
Обыкновенно, для таких задач приходится использовать либо подручную ардуино-подобную конструкцию, либо вовсе писать отдельный драфт, чтобы он выступал мастером для устройства.
В какой-то момент меня это достало, и, по старой доброй традиции "у нас есть N стандартов, ни один из которых...", я решил запилить себе удобный инструмент.
Многого для описания в этом проекте нет, думаю, пару картинок и скрин будет достаточно для тех, кому он интересен, и даже 2 тома описания не помогут тем, кому нет, поэтому дальше буду краток.
Аппаратная база

В качестве основы - недорогая отладочная плата "Черная пилюлька" с Али. Цепляется по TypeC, программируется тем же китайским J-Link-ом
Прошивка
За основу взят проект IP over USB с гитхаба. Спасибо авторам за собранный стек в DHCP, DNS, HTTP-сервером и примерной страничкой. Так, к компу это цепляется в виде виртуального Ethernet:
enx0080e1000000: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.0.2 netmask 255.255.255.0 broadcast 10.10.0.255
inet6 fe80::191a:ddb5:ce97:364b prefixlen 64 scopeid 0x20<link>
Я проинициализировал SPI HAL, GPIO, и создал процесс, в который отправляются данные после получения с веб-страницы POST-запроса. Этот процесс, собственно, и запускает SPI обмен в режиме Receive/Transmit. Как известно, в случае с классическим SPI, его подрежимы выглядят, как Receive/Transmit, в котором данные либо Receive либо Transmit игнорируются. Таким образом не счел нужным разделять эти потоки.
В случае необходимости принять данные нужной длины (для чего SPI должен натактировать нужное число байт), просто отправляем это количество нулей, и смотрим в ответ. Соответственно, для передачи данных их просто вводим, и на ответ не смотрим. Все просто.
Распиновка
Далее подключается подопытный девайс с помощью следующей таблички:
Сигнал |
Порт |
SPI_MOSI |
PA7 |
SPI_MISO |
PA6 |
SPI_SCK |
PA5 |
SPI_NSS |
PA4 |
И любым браузером заходим по адресу http://spi.go/. (ну, или 10.10.0.1, если система по каким-то причинам отказалась воспринимать локальный DNS). Открывается такой вот интерфейс:

На этом, пожалуй, все.
Внимательно следите, чтобы не перепутать, на какую кнопку нажать, когда введете данные (кнопка одна, легко ошибиться).
В данных допускаются пробелы и, вроде, вообще нелегитимные символы, которые просто игнорируются.
Формат данных - только HEX, не счел нужным делать ничего большего.
Исходные коды проекта - тут.
Проект, на основе которого это создано, как я уже упомянул - тут. В нем подмодули, которые я перетащил себе, но в оригинальном проекте все можно найти на гитхабе.
Репродукция проекта в несколько простых шагов
(ссылки дублирую)
Заказать "Черную пилюльку".
Проверить наличие J-Link
Скачать STM32CubeIDE.
Скачать проект, открыть его в STM32CubeIDE, собрать, подключить J-Link, прошить
Подключить к компу, перейти на http://spi.go/