Подробный обзор интерфейса высокоскоростной последовательной передачи данных HSTX в Raspberry Pi RP2350

Микроконтроллер 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 выводов.

Raspberry Pi RP2530 HSTX interface
Raspberry Pi RP2530 HSTX block diagram

Извлечём ключевые аспекты из документации:

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 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.

Raspberry Pi RP2350 HSTX video output

На фото показана плата 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.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments