Микроконтроллер Raspberry Pi RP2350 оснащён интерфейсом HSTX (High-Speed Serial Transmit), дополняющим программируемые входы/выходы (PIOs) Raspberry Pi RP2040 , представленные три года назад. Теперь MCU RP2350 содержит три блока PIO и один интерфейс HSTX, работающий через 8 GPIO. Рассмотрим детальнее назначение HSTX, его применение и отличия от PIOs, а также примеры программирования на C и MicroPython.
Интерфейс высокоскоростной последовательной передачи (HSTX) детально описан в документации RP2350 на странице 1118 : «Интерфейс HSTX передаёт данные из системного тактового домена на GPIO со скоростью, независимой от системной тактовой частоты». Дополнительно указана рабочая частота 150 МГц, обеспечивающая до 300 Мбит/с на вывод при DDR-режиме, или суммарно 2400 Мбит/с через 8 выводов.

Извлечём ключевые аспекты из документации:
HSTX асинхронен относительно системы. 32-битная FIFO обеспечивает высокоскоростной доступ через системный DMA. Командный экспандер обрабатывает поток данных, а выходной сдвиговый регистр распределяет 32-битные данные по тактам HSTX с переключением через битовый кроссбар. Режим двойной скорости передачи (DDR) позволяет передавать до двух битов на такт на вывод.
Интерфейс синхронизирует задержки сигналов на GPIO в пределах 300 пикосекунд, минимизируя синфазные помехи при псевдодифференциальной передаче. Это также обеспечивает соблюдение временных параметров установки/удержания при совместной передаче данных и тактового сигнала.
Максимальная тактовая частота HSTX составляет 150 МГц (равна системной). При DDR-режиме достигается скорость 300 Мбит/с на вывод. Соотношение частот системы и HSTX не ограничено, но каждая должна обеспечивать требуемую пропускную способность. Низкая системная частота при высокой HSTX-частоте может ограничить пропускную способность DMA из-за лимита в одну запись FIFO за системный такт.
На RP2350 выводы GPIO 12-19 поддерживают HSTX. Интерфейс работает только на передачу, уступая PIO в гибкости создания двунаправленных интерфейсов. На модифицированной схеме Raspberry Pi Pico 2 выделены GPIO с поддержкой HSTX.

Raspberry Pi Pico 2 pinout diagram with GPIOs supporting HSTX
Сценарии применения HSTX:
Интерфейс специализирован на высокоскоростной передаче данных без приёма, что оптимально для видеовыходов и дисплейных интерфейсов. Для двунаправленных задач (например, эмуляции Ethernet) он неприменим.
В PIO Raspberry Pi RP2040 использовались для реализации DVI , VGA и композитного видеовыхода , тогда как в RP2350 эти задачи можно переложить на HSTX. Для экспериментов с HSTX на Raspberry Pi Pico 2 потребуется пайка, но удобнее использовать плату RP2xxx Stamp Carrier XL с установленным модулем R2350 Stamp , выводящим HSTX через micro-HDMI.
На фото показана плата RP2xxx Stamp Carrier XL с клавиатурой и дисплеем, отображающим CircuitPython REPL. Arturo182 подтвердил использование HSTX в X . Специфичный код пока недоступен, но стандартный образ CircuitPython уже поддерживает функционал [Актуально: код доступен @ https://github.com/adafruit/circuitpython/blob/main/ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c ].
В ближайшее время ожидаются платы от Adafruit, Pimoroni и других производителей с видеовыходами и дисплеями, поддерживающими HSTX.
Примеры кода HSTX для RP2350 на C:
В SDK C/C++ для Raspberry Pi Pico представлены два примера:
- dvi_out_hstx_encoder – генерация DVI-сигнала через командный экспандер и TMDS-кодировщик HSTX. Разрешение буфера кадра: 640×480. Требует внешний видеоконнектор на GPIO 12-19 с токоограничивающими резисторами (270 Ом). Совместим с платой Pico DVI Sock для Raspberry Pi Pico 2.
- spi_lcd – управление SPI LCD ST7789 через HSTX. Тактовая частота SPI независима от системной. Тестировалось с модулем WaveShare 1.3″ ST7789 при разрешении 240×240.
Приведём ключевые фрагменты кода для SPI LCD:
#include "hardware/structs/hstx_ctrl.h"
#include "hardware/structs/hstx_fifo.h"
// These can be any permutation of HSTX-capable pins:
#define PIN_DIN 12
#define PIN_SCK 13
#define PIN_CS 14
#define PIN_DC 15
// These can be any pin:
#define PIN_RESET 16
#define PIN_BL 17
#define FIRST_HSTX_PIN 12
#if PIN_DIN < FIRST_HSTX_PIN || PIN_DIN >= FIRST_HSTX_PIN + 8
#error "Must be an HSTX-capable pin: DIN"
#elif PIN_SCK < FIRST_HSTX_PIN || PIN_SCK >= FIRST_HSTX_PIN + 8
#error "Must be an HSTX-capable pin: SCK"
#elif PIN_CS < FIRST_HSTX_PIN || PIN_CS >= FIRST_HSTX_PIN + 8
#error "Must be an HSTX-capable pin: CS"
#elif PIN_DC < FIRST_HSTX_PIN || PIN_DC >= FIRST_HSTX_PIN + 8
#error "Must be an HSTX-capable pin: DC"
#endif
static inline void hstx_put_word(uint32_t data) {
while (hstx_fifo_hw->stat & HSTX_FIFO_STAT_FULL_BITS)
;
hstx_fifo_hw->fifo = data;
}
static inline void lcd_put_dc_cs_data(bool dc, bool csn, uint8_t data) {
hstx_put_word(
(uint32_t)data |
(csn ? 0x0ff00000u : 0x00000000u) |
// Note DC gets inverted inside of HSTX:
(dc ? 0x00000000u : 0x0003fc00u)
);
}
Требуются два заголовочных файла. Выводы 12-17 назначены на сигналы дисплея, макросы проверяют поддержку HSTX. Первая функция загружает 32-битные данные в FIFO, вторая передаёт данные на LCD.
Основная функция содержит дополнительный HSTX-код:
int main() {
stdio_init_all();
// Switch HSTX to USB PLL (presumably 48 MHz) because clk_sys is probably
// running a bit too fast for this example -- 48 MHz means 48 Mbps on
// PIN_DIN. Need to reset around clock mux change, as the AUX mux can
// introduce short clock pulses:
reset_block(RESETS_RESET_HSTX_BITS);
hw_write_masked(
&clocks_hw->clk[clk_hstx].ctrl,
CLOCKS_CLK_HSTX_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB << CLOCKS_CLK_HSTX_CTRL_AUXSRC_LSB,
CLOCKS_CLK_HSTX_CTRL_AUXSRC_BITS
);
unreset_block_wait(RESETS_RESET_HSTX_BITS);
gpio_init(PIN_RESET);
gpio_init(PIN_BL);
gpio_set_dir(PIN_RESET, GPIO_OUT);
gpio_set_dir(PIN_BL, GPIO_OUT);
gpio_put(PIN_RESET, 1);
gpio_put(PIN_BL, 1);
hstx_ctrl_hw->bit[PIN_SCK - FIRST_HSTX_PIN] =
HSTX_CTRL_BIT0_CLK_BITS;
hstx_ctrl_hw->bit[PIN_DIN - FIRST_HSTX_PIN] =
(7u << HSTX_CTRL_BIT0_SEL_P_LSB) |
(7u << HSTX_CTRL_BIT0_SEL_N_LSB);
hstx_ctrl_hw->bit[PIN_CS - FIRST_HSTX_PIN] =
(27u << HSTX_CTRL_BIT0_SEL_P_LSB) |
(27u << HSTX_CTRL_BIT0_SEL_N_LSB);
hstx_ctrl_hw->bit[PIN_DC - FIRST_HSTX_PIN] =
(17u << HSTX_CTRL_BIT0_SEL_P_LSB) |
(17u << HSTX_CTRL_BIT0_SEL_N_LSB) |
(HSTX_CTRL_BIT0_INV_BITS);
// We have packed 8-bit fields, so shift left 1 bit/cycle, 8 times.
hstx_ctrl_hw->csr =
HSTX_CTRL_CSR_EN_BITS |
(31u << HSTX_CTRL_CSR_SHIFT_LSB) |
(8u << HSTX_CTRL_CSR_N_SHIFTS_LSB) |
(1u << HSTX_CTRL_CSR_CLKDIV_LSB);
gpio_set_function(PIN_SCK, 0/*GPIO_FUNC_HSTX*/);
gpio_set_function(PIN_DIN, 0/*GPIO_FUNC_HSTX*/);
gpio_set_function(PIN_CS, 0/*GPIO_FUNC_HSTX*/);
gpio_set_function(PIN_DC, 0/*GPIO_FUNC_HSTX*/);
Для LCD тактовая частота HSTX снижена до 48 МГц (USB-частота), тогда как пример DVI использует стандартные 125 МГц (достаточно для 640×480@60FPS).
Регистр конфигурации битового кроссбара определяет:
- BITx.SEL_P – бит сдвигового регистра (0-31) для первой половины такта HSTX
- BITx.SEL_N – бит для второй половины такта
- BITx.INV – инверсия сигнала
- BITx.CLK – подключение вывода к тактовому генератору
В коде DDR-режим отключён установкой SEL_N=SEL_P на трёх выводах, сигнал CLK подключён к генератору, а вывод DC инвертирован.
MicroPython SDK обновлён для RP2350, но актуальная документация пока не включает HSTX. Однако альфа-версия CircuitPython для Raspberry Pi Pico 2 уже поддерживает HSTX для генерации высокочастотных сигналов (например, DVI). Поддержка реализована только в CircuitPython 9.2.0 Alpha.
Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.