~ Storm Bridge ~

Мультиинтерфейсный кроссплатформенный преобразователь USB на базе чипа FT232H.

StormBridge

Основные функции

Возможность высокоскоростной аппаратной работы с интерфейсами UART, SPI, I2C, JTAG/SWD, GPIO.
Возможность работы с низковольтными (от 1.2в) интерфейсами с автоматическим, или принудительным определением вольтажа обмена.
Реализована отключаемая гальваническая изоляция UART.
Имеется возможность принудительного сброса устройства без извлечения USB коннекторов.
Присутствует индикация основных режимов работы устройства.
Связь с хостом осуществляется через разъем USB-TypeC.
Компактные размеры 44x44x15мм.

UART:

  • Скорость работы до 12Мбод/с. Поддержка 7/8 битный обмен, с 1/2 стоповыми битами.
  • Возможность обмена по UART через изолятор с выбором референсного напряжения обмена через пин «VCC» колодки «UART TTL».
  • Референсное напряжение изолированной стороны может варьироваться от 5.5 до 3 вольт (до 2.8 в модификации с изолятором ISO7221CDR).
  • Возможность принудительного выбора напряжения обмена между 3.3 и 5 вольт и принудительного выключения гальванической развязки, принудительного выключения микросхемы изолятора.
  • Возможность обмена по UART на пониженном напряжении через преобразователь логических уровней, выбор напряжения обмена может выбираться автоматически через пин VCC референсного напряжения колодки «LOW VOLTAGE SPI», либо выбираться принудительно между 2.5 и 1.8 вольт.
  • Так же имеются расширенные сигналы UART такие, как RTS / CTS / DTR / DSR / DCD доступные на колодке «GPIO» работающие на напряжении 3.3в (толерантны к 5в).

SPI:

  • Возможность обмена по интерфейсу SPI частоте до 30МГц.
  • Напряжение сигнальных линий через колодку «GPIO» — 3.3в (толерантны к 5в).
  • Возможность внутрисхемного программирования микросхем памяти SPI с низковольтными логическими уровнями.
  • Для работы с низкими логическими уровнями в устройстве предусмотрен двунаправленный преобразователь логических уровней.
  • Выбор референсного напряжения может происходить автоматически через пин «VCC» колодки «LOW VOLTAGE SPI», в диапазоне от 1.2 до 3 вольт.
  • Возможность принудительного выбора напряжения обмена на колодке «LOW VOLTAGE SPI» между 1.8 и 2.5 вольт.
  • Предусмотрена схема автоматического перевода сигнальных линий преобразователя в высокоимпедансное состояние, в те моменты, когда не производится запись, для исключения влияния устройства на работу внутрисхемной памяти.

I2C:

  • Возможность обмена по интерфейсу I2С на напряжении от 1.2 до 5 вольт.
  • Возможность принудительной подтяжки линий SDA / SCL к напряжению 3.3 вольта.

JTAG/SWD:

  • Возможность внутрисхемного программирования и отладки микроконтроллеров имеющих возможность работать через интерфейс SWD и JTAG (TCK,TDI,TDO,TMS) через GDB/OpenOCD.
  • Краткий список поддерживаемых устройств приведен на сайте OpenOCD и выглядит следующим образом:

Debug targets:
ARM: AArch64, ARM11, ARM7, ARM9, Cortex-A/R (v7-A/R), Cortex-M (ARMv{6/7/8}-M),
FA526, Feroceon/Dragonite, XScale.
ARCv2, AVR32, DSP563xx, DSP5680xx, EnSilica eSi-RISC, EJTAG (MIPS32, MIPS64),
ESP32, ESP32-S2, ESP32-S3, Intel Quark, LS102x-SAP, RISC-V, ST STM8,
Xtensa.
Flash drivers:
ADUC702x, AT91SAM, AT91SAM9 (NAND), ATH79, ATmega128RFA1, Atmel SAM, AVR, CFI,
DSP5680xx, EFM32, EM357, eSi-RISC, eSi-TSMC, EZR32HG, FM3, FM4, Freedom E SPI,
GD32, i.MX31, Kinetis, LPC8xx/LPC1xxx/LPC2xxx/LPC541xx, LPC2900, LPC3180, LPC32xx,
LPCSPIFI, Marvell QSPI, MAX32, Milandr, MXC, NIIET, nRF51, nRF52, NuMicro,
NUC910, Nuvoton NPCX, onsemi RSL10, Orion/Kirkwood, PIC32mx, PSoC4/5LP/6,
Raspberry RP2040, Renesas RPC HF and SH QSPI,
S3C24xx, S3C6400, SiM3x, SiFive Freedom E, Stellaris, ST BlueNRG, STM32,
STM32 QUAD/OCTO-SPI for Flash/FRAM/EEPROM, STMSMI, STR7x, STR9x, SWM050,
TI CC13xx, TI CC26xx, TI CC32xx, TI MSP432, Winner Micro w600, Xilinx XCF,
XMC1xxx, XMC4xxx.

GPIO:

  • Возможность использовать порты ввода вывода AD0-AD7 на колодке GPIO в качестве портов общего назначения.

Микропереключатели и разъемы

DIP

SW:1-10

микропереключатели выбора работы устройства. Положение активации — сдвинутое вниз, к плате.

Разъем P1

Служит для подключения SPI и других интерфейсов через преобразователь уровней.
Изначально выводы данного разъема спроектированы таким образом, чтобы не мешать работе подключенных к нему устройств и находятся в высокоимпедансном состоянии.
Активация данного разъема может происходить автоматически, с помощью низкого уровня напряжения на выводе GPIO-AD7 (Доп. параметр для flashrom v1.3+ — gpiol3=L ).
Имеется возможность принудительной активации разъема с помощью микропереключателя SW:3.
Выбор напряжения обмена происходит автоматически и равно напряжению приложенному к пину VCC в диапазоне от 1.2 до 3 вольт.
Также можно не подключать пин VCC, а выбрать напряжение обмена принудительно с помощью микропереключателей SW:1(1.8v), либо SW:2 (2.5v).
При включенном положении данных переключателей пин VCC становится выходом и может питать подключенное устройство заданным напряжением (ток не более 100мА).

:warning: Осторожно :exclamation: :

  • Одновременное включение SW:1 и SW:2 на работающем устройстве, может привести к его поломке.
  • Подача напряжения из вне на пин VCC при включенных SW:1, или SW:2, также может привести к поломке устройства.

Соответствие пинов разъема GPIO:

SPI GPIO
SCLK AD0
MOSI AD1
MISO AD2
CS_0 AD3

Разъем P2

Служит для подключения изолированного UART.
Активация данного разъема происходит с помощью микропереключателя SW:4.
Выбор напряжения обмена происходит автоматически и равно напряжению приложенному к пину VCC в диапазоне от 3 до 5 вольт.

Также можно не подключать пин VCC, а выбрать напряжение обмена принудительно с помощью микропереключателей SW:5(3.3v), либо SW:6 (5v). При включенном положении данных переключателей пин VCC становится выходом и может питать подключенное устройство заданным напряжением (ток не более 100мА для 3.3v и не более 400мА для 5v).
:exclamation: В данном режиме теряется гальваническая изоляция, а микропереключатель SW:7(GND) должен быть активирован в обязательном порядке.

:warning: Осторожно :exclamation: :

  • Одновременное включение SW:5 и SW:6 на работающем устройстве, может привести к его поломке.
  • Разъем может активироваться от фантомного питания, через пины RX-TX с внешней стороны и даже передавать информацию с поднятым переключателем SW:4. Корректная работа в таком режиме не может быть гарантирована.

Соответствие пинов разъема GPIO:

UART GPIO
TX AD0
RX AD1

:exclamation: пропускание сигналов ограничено направленностью изолятора

Разъем P3

Служит для подключения любых поддерживаемых интерфейсов. (UART, SPI, I2C, JTAG, GPIO).
Уровни напряжений на данном разъеме 3.3 вольта, толерантны к 5 вольтам. Для удобства подключений, каждый функциональный пин данного разъема продублирован пином GND (ряд у края платы).
Для некоторых режимов работы требуется соединение между собой контактов AD1 и AD2. Для удобства, данный функционал предусмотрен переключателем SW:10(SDA2).
Для работы интерфейса I2C предусмотрена подтяжка к напряжению 3.3 вольта, которая активируется с помощью переключателей SW:8(SCL) и SW:9(SDA1).
Для питания внешних устройств предусмотрены пины 3.3 и 5 вольт (ток не более 100мА для 3.3v и не более 400мА для 5v).

:warning: Осторожно :exclamation: :

  • пин AD7 подтянут к 3.3в через 51кОм, а так же служит катодом для светодиода «Flash».

Функциональное назначение:

GPIO UART SPI JTAG I2C
AD0 TX SCLK TCK SCK
AD1 RX MOSI TDI SDA/O
AD2 RTS MISO TDO SDA/I
AD3 CTS CS TMS
AD4 DTR CS1
AD5 DSR CS2
AD6 DCD CS3
AD7 RI CS4 RCLK RSCK

Инструкция по эксплуатации в Linux

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

Прошивка SPI-Flash памяти с помощью flashrom v 1.3+

Для начала нужно собрать flashrom версии не ниже 1.3 из исходного кода, перед сборкой в системе необходимо иметь библиотеки libftdi и libusb.
Если в системе уже есть flashrom другой версии, для удобной работы можно создать симлинк собранной версии программы, но с другим именем в директории /usr/bin, например команда
# ln -s flashrom /usr/bin/flashrom-dev, запущенная в директории с собранной программой, создаст симлинк и позволит использовать команду flashrom-dev из любого каталога.
Подключение к чипу памяти производится согласно назначению разъемов.
Команда для проверки наличия обмена с чипом памяти, с автоматической активацией преобразователя логических уровней:

flashrom-dev -p ft2232_spi:type=232H,divisor=2,gpiol3=L

где:
-p ft2232_spi:type=232H,divisor=2,gpiol3=L — выбор программатора и параметров обмена;
параметр divisor=2 — настройка частоты обмена по формуле 60_Мгц / divisor, divisor может быть только целым четным числом от 2 до 2^17 (= 131072). Стабильная частота для конкретного чипа и шлейфа подбирается опытным путем, рекомендуемо для внутрисхемной прошивки выбирать divisor не меньше 6 (то есть 10_Мгц и меньше);
параметр gpiol3=L — активация преобразователя логических уровней, через gpio AD7.

:fire: Для работы с чипами рекомендуется ознакомиться с инструкцией на flashrom, среди удобных функций рекомендуется обратить внимание на возможность работы с регионами памяти через файл layout.

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

Found Micron/Numonyx/ST flash chip "N25Q512..1G" (65536 kB, SPI) on ft2232_spi.
Found Micron flash chip "MT25QU512" (65536 kB, SPI) on ft2232_spi.
Multiple flash chip definitions match the detected chip(s): "N25Q512..1G", "MT25QU512"
Please specify which chip definition to use with the -c <chipname> option.

в данном случае следует выбрать чип из предложенных, например ... -с MT25QU512

пример команды для прошивки с верификацией:

flashrom-dev -p ft2232_spi:type=232H,divisor=10,gpiol3=L -c "MT25QU256" -w rom.bin --progress

где rom.bin файл прошивки, а ключ --progress позволяет видеть прогресс загрузки

Прошивка и отладка микроконтроллеров через OpenOCD

Для примера выбрана IDE VS-Code и микроконтроллер STM32F103C8T6. IDE и контроллер могут быть любыми, которые поддерживают отладку через OpenOCD.
Начальный код сгенерирован STM32CubeMX
Действия производились в ArchLinux на ядре 6.4.8-arch1-1 (64-бита), с установленным пакетным менеджером yay

sudo pacman -Sy openocd $(pacman -Ssq arm-none-eabi) clang ninja cmake llvm meson
yay -Sy visual-studio-code-bin stm32cubemx

Далее устанавливаются расширения в VS-Code:

ms-vscode.cpptools-extension-pack
marus25.cortex-debug
mcu-debug.memory-view
rioj7.command-variable
actboy168.tasks
cschlosser.doxdocgen

Начальный код генерируется в CubeMX:

file -> new project ->
(в строке поиска открывшегося селектора) commercial part number: stm32f103c8t6
в правом нижнем углу появляются результаты поиска, выделяется нужный МК, далее вкладка docs & resources, находится system view description, скачивается архив с svd файлами, которые понадобятся для проекта.
Далее кнопка start project -> конфигурация МК в зависимости от отладочной платы, или проекта.
Для удобства отладки и снятия необходимости переводить плату в «загрузочный» режим сразу настраивается отладочный интерфейс system core -> sys -> debug: serial wire.
После настройки интерфейсов, модулей и используемых частот,
вкладка project manager -> вкладка project
project name: projectname
project location: …/stm32projects
toolchain/ide: makefile
Вкладка code generator -> stm32cube mcu packages and embedded software packs
тут можно выбрать копировать файлы библиотек в каталог, или использовать ссылки на библиотеки.
Далее кнопка generate code. На этом CubeMX можно закрыть.

Настройка задач отладки в VS-Code:

В каталог с проектом …/stm32projects/projectname копируется скачанный ранее файл svd под нужную серию МК (stm32f103.svd).
В нем же создается подкаталог .vscode, внутри которого создаются файлы launch.json и tasks.json со следующим содержимым:

launch.json
{
    "version": "2.0.0",
    "configurations": [
        {
            "name": "OCD-Debug",
            "type": "cortex-debug",
            "request": "launch",
            "cwd": " {workspaceRoot}",
            "servertype": "openocd",
            "executable": "./build/ {workspaceFolderBasename}.elf",
            "svdFile": "STM32F103.svd",
            "configFiles": [
                "interface/ftdi/ft232h-module-swd.cfg",
                "target/stm32f1x.cfg"
            ],
            "runToEntryPoint": "main",
            "showDevDebugOutput": "none",
            "preLaunchTask": "Build"
        },
        {
            "name": "OCD-Flash",
            "type": "cortex-debug",
            "request": "launch",
            "cwd": "{workspaceRoot}",
            "servertype": "openocd",
            "executable": "./build/ ${workspaceFolderBasename}.elf",
            "svdFile": "STM32F103.svd",
            "configFiles": [
                "interface/ftdi/ft232h-module-swd.cfg",
                "target/stm32f1x.cfg"
            ],
            "preLaunchTask": "Write firmware"
        }
    ]
}

tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",
            "type": "shell",
            "group": "build",
            "command": "make",
            "problemMatcher": []
        },
        {
            "label": "Clean",
            "type": "shell",
            "group": "build",
            "command": "make clean",
            "problemMatcher": []
        },
        {
            "label": "Write firmware",
            "type": "shell",
            "command": "make clean \n make \n openocd -f interface/ftdi/ft232h-module-swd.cfg -f target/stm32f1x.cfg -c 'program ./build/${workspaceFolderBasename}.bin verify reset exit' ",
            "problemMatcher": []
        }
    ]
}

После этого каталог с проектом открывается в VS-Code через контекстное меню. Подтверждается доверие авторам файлов в каталоге.

Подключение МК и отладка

Подключение МК к устройству производится согласно назначению разъемов.
В случае с STM32F1 это SWD интерфейс:

GPIO STM32
AD0 SWCLK
AD1/AD2 SWDIO
3.3v 3.3v
GND GND

Чтобы объединить AD1 и AD2 активируется микропереключатель SW:10(SDA2).

После этого устройство подключается к хосту.
В VS-Code во вкладке Запуск и отладка должны быть доступны созданные ранее задачи: OCD-Debug и OCD-Flash.

  • OCD-Debug — стандартная сборка и отладка проекта.
  • OCD-Flash — может пригодиться для прошивки МК без отладки, но сессию все равно придется закрывать вручную.

Инструкция по эксплуатации в Windows

UART

Драйверы для работы с UART можно загрузить с сайта производителя
Так же драйверы и утилиты использующиеся в инструкции имеются в архивах (openocd/drivers)
Устройство должно определиться как стандартный COM-Port.

WinUSB Drivers

Для работы Flashrom и OpenOCD необходимо заменить драйверы на WinUSB, для этого:
Запускаем Zadig, вкладка options — чекбокс List All Devices.
Из выпадающего списка выбираем устройство Storm_Bridge, драйвер выбираем WinUSB, нажимает кнопку Replace Driver.
При успешной замене драйверов устройство должно переместиться в класс «Устройства USB». Соответственно стандартный COM-Port более не будет доступен
Для быстрой подмены уже имеющихся драйверов в архиве c openocd имеется утилита UsbDriverTool.exe.

SPI (на примере flashrom)

Для работы с Flashrom распаковываем архив с предварительно компилированной программой.
Так же можно собрать Flashrom самостоятельно, подробнее на https://github.com/flashrom/flashrom .
В папке с flashrom.exe открываем командную строку. Команды для работы аналогичны инструкции для Linux:
для запроса типа подключенной микросхемы

flashrom -p ft2232_spi:type=232H,divisor=2,gpiol3=L

SWD (На примере CubeIDE)

Открываем CubeIDE создаем проект, для теста выбран STM32F103C8T6.
Настраиваем периферию. Сохраняем, генерируется начальный код.
Открываем вкладку Run — External Tools — External Tools Configurations
Нажимаем кнопку New lauch configurations.

Для удобства называем новую конфигурацию GDB_C8T6.
Location: patchto\openocd-20230202\OpenOCD-20230202-0.12.0\bin\openocd.exe
Working Directory: patchto\openocd-20230202\OpenOCD-20230202-0.12.0\
Arguments: -f interface/ftdi/ft232h-module-swd.cfg -f target/stm32f1x.cfg
Сохраняем.

Вкладка Run — Debug Configurations
Создаем новую конфигурацию в STM32 Cortex-M C/C++ Application
Для удобства называем новую конфигурацию OpenOCD_C8T6.
Во вкладке Debugger созданного проекта:
Connect to remote GDB server
Port nimber 3333
Debug probe ST-LINK (OpenOCD)
снять чекбокс Enable live expressions
Сохраняем.

Для удобства создаем Launch Group
Называем C8T6
Добавляем созданный ранее GDB_C8T6
Launch mode: Run
установить чекбокс Adopt launch if already running.
ОК
Добавляем созданный ранее OpenOCD_C8T6
Launch mode: Debug
установить чекбокс Adopt launch if already running
ОК — Сохраняем.

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

Полезные файлы и ссылки:


Изменено: