Регистры HSTX RP2350
Регистры управления HSTX в RP2350 — блока, который выводит поток данных на GPIO12–19 по два бита за такт, до 300 Мбит/с на вывод: сдвиговый регистр, коммутатор битов, генератор тактового сигнала и расширитель команд с кодером TMDS.
HSTX (high-speed serial transmit) берёт 32-битные слова из FIFO и выдаёт их на 8 выводов GPIO12–19 по два бита за такт на вывод (DDR). Частота HSTX — до 150 МГц, как у системной, то есть до 300 Мбит/с на вывод; задержки до выводов выровнены в пределах 300 пс, поэтому соседние выводы годятся как псевдодифференциальная пара. Принимать данные HSTX не умеет (даташит RP2350, раздел 12.11).
Каждый такт выходной сдвиговый регистр либо загружает 32 бита из FIFO, либо циклически сдвигается вправо на SHIFT бит; после N_SHIFTS сдвигов он загружается снова. Регистры BIT0–BIT7 выбирают, какой бит регистра попадает на вывод в первой (SEL_P) и второй (SEL_N) половине такта, могут инвертировать его или подать вместо данных тактовый сигнал с периодом CLKDIV. Для дифференциального выхода два вывода настраивают одинаково, а INV ставят только у одного.
Расширитель команд (EXPAND_EN) читает из FIFO команды RAW, RAW_REPEAT, TMDS, TMDS_REPEAT и NOP и умеет кодировать данные в TMDS, как требует DVI; его сдвиги задают EXPAND_SHIFT и EXPAND_TMDS. В связанном режиме COUPLED_MODE на коммутатор подаются выходы 12–19 одного из блоков PIO — для этого clk_hstx должна идти прямо от clk_sys. Данные пишут в FIFO через отдельный блок HSTX_FIFO.
| Экземпляр | Базовый адрес |
|---|---|
| HSTX_CTRL | 0x400C 0000 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| HSTX_CTRL_CSR | 0x00 | Управление: включение, сдвиги, тактовый сигнал, связанный режим | 0x1005 0600 |
| HSTX_CTRL_BITn | 0x04 + n · 0x04 | Источник данных для вывода n блока HSTX | 0x0000 0000 |
| HSTX_CTRL_EXPAND_SHIFT | 0x24 | Сдвиги в расширителе команд | 0x0100 0100 |
| HSTX_CTRL_EXPAND_TMDS | 0x28 | Кодер TMDS расширителя команд | 0x0000 0000 |
HSTX_CTRL_CSR — управление: включение, сдвиги, тактовый сигнал, связанный режим
Смещение 0x00, адрес 0x400C 0000, после сброса 0x1005 0600. Макросы pico-sdk: HSTX_CTRL_CSR_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CLKDIV | CLKPHASE | — | N_SHIFTS | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SHIFT | — | COUPLED_SEL | COUPLED_MODE | — | EXPAND_EN | EN | ||||||||
- CLKDIV (биты 31:28, чтение и запись, после сброса 0x1) — Период генерируемого тактового сигнала в тактах HSTX, чётный или нечётный; сигнал идёт вперёд только в тактах со сдвигом.
- CLKPHASE (биты 27:24, чтение и запись, после сброса 0x0) — Начальная фаза генерируемого тактового сигнала.
- N_SHIFTS (биты 20:16, чтение и запись, после сброса 0x05) — Сдвигов до новой загрузки из FIFO, 0 — 32; меняют при EN = 0.
- SHIFT (биты 12:8, чтение и запись, после сброса 0x06) — Циклический сдвиг вправо за такт, бит; 31 — сдвиг влево на 1; меняют при EN = 0.
- COUPLED_SEL (биты 6:5, чтение и запись, после сброса 0x0) — Блок PIO для связанного режима, 0–2.
- COUPLED_MODE (бит 4, чтение и запись, после сброса 0x0) — Связанный режим: выходы 12–19 блока PIO идут на коммутатор вместо битов 31:24 сдвигового регистра.
- EXPAND_EN (бит 1, чтение и запись, после сброса 0x0) — Расширитель команд между FIFO и сдвиговым регистром; меняют при EN = 0.
- EN (бит 0, чтение и запись, после сброса 0x0) — Включение HSTX; при 0 сдвиговый регистр очищается.
HSTX_CTRL_BITn — источник данных для вывода n блока HSTX
8 регистров, n = 0…7: смещение 0x04 + n · 0x04, после сброса 0x0000 0000. Макросы pico-sdk: HSTX_CTRL_BITn_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | CLK | INV | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SEL_N | — | SEL_P | ||||||||||||
- CLK (бит 17, чтение и запись, после сброса 0x0) — Подать на вывод генерируемый тактовый сигнал вместо данных; INV при этом действует.
- INV (бит 16, чтение и запись, после сброса 0x0) — Инверсия вывода.
- SEL_N (биты 12:8, чтение и запись, после сброса 0x00) — Бит сдвигового регистра во второй половине такта.
- SEL_P (биты 4:0, чтение и запись, после сброса 0x00) — Бит сдвигового регистра в первой половине такта.
HSTX_CTRL_EXPAND_SHIFT — сдвиги в расширителе команд
Смещение 0x24, адрес 0x400C 0024, после сброса 0x0100 0100. Макросы pico-sdk: HSTX_CTRL_EXPAND_SHIFT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | ENC_N_SHIFTS | — | ENC_SHIFT | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | RAW_N_SHIFTS | — | RAW_SHIFT | ||||||||||||
- ENC_N_SHIFTS (биты 28:24, чтение и запись, после сброса 0x01) — Выборок из регистра расширителя до новой загрузки для команд с кодированием (TMDS), 0 — 32.
- ENC_SHIFT (биты 20:16, чтение и запись, после сброса 0x00) — Циклический сдвиг вправо при каждой выборке для команд с кодированием.
- RAW_N_SHIFTS (биты 12:8, чтение и запись, после сброса 0x01) — Выборок до новой загрузки для команд RAW, 0 — 32.
- RAW_SHIFT (биты 4:0, чтение и запись, после сброса 0x00) — Циклический сдвиг вправо при каждой выборке для команд RAW.
HSTX_CTRL_EXPAND_TMDS — кодер TMDS расширителя команд
Смещение 0x28, адрес 0x400C 0028, после сброса 0x0000 0000. Макросы pico-sdk: HSTX_CTRL_EXPAND_TMDS_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | L2_NBITS | L2_ROT | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| L1_NBITS | L1_ROT | L0_NBITS | L0_ROT | ||||||||||||
- Ln_NBITS, n = 0…2 (биты 7:5, 15:13, 23:21; чтение и запись, после сброса 0x0) — Значащих бит для кодера TMDS линии n, начиная с бита 7 после сдвига: значения 0–7 означают 1–8 бит.
- Ln_ROT, n = 0…2 (биты 4:0, 12:8, 20:16; чтение и запись, после сброса 0x00) — Циклический сдвиг данных вправо перед кодером TMDS линии n.
Частые вопросы
Какие выводы RP2350 работают с HSTX?
Только GPIO12–19: на них HSTX выдаёт до двух бит за такт на вывод, до 300 Мбит/с при частоте 150 МГц. HSTX работает только на выход.
Как вывести через HSTX один бит за такт, начиная с младшего?
Задайте в CSR N_SHIFTS = 32 (в поле записывают 0) и SHIFT = 1, а в регистре нужного вывода BITn — SEL_P = SEL_N = 0: каждый такт регистр сдвигается вправо на бит, и на вывод идёт младший бит. Чтобы первым шёл старший бит, нужны SHIFT = 31 и SEL_P = SEL_N = 31.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.11.7: список регистров, назначение полей, тип доступа и значения после сброса
- Raspberry Pi. pico-sdk 2.1.1: заголовки src/rp2350/hardware_regs/include/hardware/regs/*.h (коммит bddd20f) — смещения, биты, тип доступа и значение после сброса каждого поля, базовые адреса из addressmap.h; лицензия BSD-3-Clause
Нашли ошибку в регистрах?
Другие регистры RP2350
- Все регистры RP2350Блоки периферии и базовые адреса
- SHA256 — ускоритель SHA-256SHA256_CSR, SHA256_WDATA, SHA256_SUMn
- TICKS — генераторы тиковTICKS_PROC0_CTRL, TICKS_PROC0_CYCLES, TICKS_PROC0_COUNT, TICKS_PROC1_CTRL, TICKS_PROC1_CYCLES, TICKS_PROC1_COUNT
- TRNG — генератор случайных чиселTRNG_RNG_IMR, TRNG_RNG_ISR, TRNG_RNG_ICR, TRNG_TRNG_CONFIG, TRNG_TRNG_VALID, TRNG_EHR_DATA0
- GLITCH_DETECTOR — детектор сбоевGLITCH_DETECTOR_ARM, GLITCH_DETECTOR_DISARM, GLITCH_DETECTOR_SENSITIVITY, GLITCH_DETECTOR_LOCK, GLITCH_DETECTOR_TRIG_STATUS, GLITCH_DETECTOR_TRIG_FORCE
- HSTX_FIFO — FIFO быстрого выводаHSTX_FIFO_STAT, HSTX_FIFO_FIFO
- QMI — интерфейс QSPI-памятиQMI_DIRECT_CSR, QMI_DIRECT_TX, QMI_DIRECT_RX, QMI_M0_TIMING, QMI_M0_RFMT, QMI_M0_RCMD
- XIP_AUX — быстрый порт FIFO XIPXIP_AUX_STREAM, XIP_AUX_QMI_DIRECT_TX, XIP_AUX_QMI_DIRECT_RX
- BOOTRAM — регистры загрузочной памятиBOOTRAM_WRITE_ONCE0, BOOTRAM_WRITE_ONCE1, BOOTRAM_BOOTLOCK_STAT, BOOTRAM_BOOTLOCKn
- CORESIGHT_TRACE — FIFO трассировкиCORESIGHT_TRACE_CTRL_STATUS, CORESIGHT_TRACE_TRACE_CAPTURE_FIFO
- EPPB — регистры ядра от Raspberry PiM33_EPPB_NMI_MASK0, M33_EPPB_NMI_MASK1, M33_EPPB_SLEEPCTRL
- OTP — однократно программируемая памятьOTP_SW_LOCKn, OTP_SBPI_INSTR, OTP_SBPI_WDATA_0, OTP_SBPI_WDATA_1, OTP_SBPI_WDATA_2, OTP_SBPI_WDATA_3
- POWMAN — менеджер питанияPOWMAN_BADPASSWD, POWMAN_VREG_CTRL, POWMAN_VREG_STS, POWMAN_VREG, POWMAN_VREG_LP_ENTRY, POWMAN_VREG_LP_EXIT
- ACCESSCTRL — права доступа к шинеACCESSCTRL_LOCK, ACCESSCTRL_FORCE_CORE_NS, ACCESSCTRL_CFGRESET, ACCESSCTRL_GPIO_NSMASK0, ACCESSCTRL_GPIO_NSMASK1, ACCESSCTRL_ROM
- TIMER — системные таймерыTIMER_TIMEHW, TIMER_TIMELW, TIMER_TIMEHR, TIMER_TIMELR, TIMER_ALARMn, TIMER_ARMED
- WATCHDOG — сторожевой таймерWATCHDOG_CTRL, WATCHDOG_LOAD, WATCHDOG_REASON, WATCHDOG_SCRATCHn
- ADC — аналого-цифровой преобразовательADC_CS, ADC_RESULT, ADC_FCS, ADC_FIFO, ADC_DIV, ADC_INTR
- PWM — широтно-импульсная модуляцияPWM_CHn_CSR, PWM_CHn_DIV, PWM_CHn_CTR, PWM_CHn_CC, PWM_CHn_TOP, PWM_EN
- XOSC — кварцевый генераторXOSC_CTRL, XOSC_STATUS, XOSC_DORMANT, XOSC_STARTUP, XOSC_COUNT
- PLL — умножители частотыPLL_CS, PLL_PWR, PLL_FBDIV_INT, PLL_PRIM, PLL_INTR, PLL_INTE
- PADS_BANK0 — электрические настройки GPIOPADS_BANK0_VOLTAGE_SELECT, PADS_BANK0_GPIOn, PADS_BANK0_SWCLK, PADS_BANK0_SWD
- PADS_QSPI — электрические настройки выводов QSPIPADS_QSPI_VOLTAGE_SELECT, PADS_QSPI_GPIO_QSPI_SCLK, PADS_QSPI_GPIO_QSPI_SD0, PADS_QSPI_GPIO_QSPI_SD1, PADS_QSPI_GPIO_QSPI_SD2, PADS_QSPI_GPIO_QSPI_SD3
- RESETS — сброс подсистемRESETS_RESET, RESETS_WDSEL, RESETS_RESET_DONE
- PSM — автомат включения питанияPSM_FRCE_ON, PSM_FRCE_OFF, PSM_WDSEL, PSM_DONE
- SYSINFO — сведения о чипеSYSINFO_CHIP_ID, SYSINFO_PACKAGE_SEL, SYSINFO_PLATFORM, SYSINFO_GITREF_RP2350
- BUSCTRL — управление шинойBUSCTRL_BUS_PRIORITY, BUSCTRL_BUS_PRIORITY_ACK, BUSCTRL_PERFCTR_EN, BUSCTRL_PERFCTRn, BUSCTRL_PERFSELn
- ROSC — кольцевой генераторROSC_CTRL, ROSC_FREQA, ROSC_FREQB, ROSC_RANDOM, ROSC_DORMANT, ROSC_DIV
- SYSCFG — системные настройкиSYSCFG_PROC_CONFIG, SYSCFG_PROC_IN_SYNC_BYPASS, SYSCFG_PROC_IN_SYNC_BYPASS_HI, SYSCFG_DBGFORCE, SYSCFG_MEMPOWERDOWN, SYSCFG_AUXCTRL
- XIP_CTRL — кеш выполнения из флеш-памятиXIP_CTRL, XIP_STAT, XIP_CTR_HIT, XIP_CTR_ACC, XIP_STREAM_ADDR, XIP_STREAM_CTR
- USB — контроллер USBUSB_ADDR_ENDP, USB_ADDR_ENDPn, USB_MAIN_CTRL, USB_SOF_WR, USB_SOF_RD, USB_SIE_CTRL
- PIO — программируемый ввод-выводPIO_CTRL, PIO_FSTAT, PIO_FDEBUG, PIO_FLEVEL, PIO_TXFn, PIO_RXFn
- DMA — прямой доступ к памятиDMA_CHn_READ_ADDR, DMA_CHn_WRITE_ADDR, DMA_CHn_TRANS_COUNT, DMA_CHn_CTRL_TRIG, DMA_CHn_AL1_CTRL, DMA_CHn_AL1_READ_ADDR
- SIO — однотактный ввод-вывод ядерSIO_CPUID, SIO_GPIO_IN, SIO_GPIO_HI_IN, SIO_GPIO_OUT, SIO_GPIO_HI_OUT, SIO_GPIO_OUT_SET
- CLOCKS — тактированиеCLOCKS_CLK_GPOUT0_CTRL, CLOCKS_CLK_GPOUTn_DIV, CLOCKS_CLK_GPOUTn_SELECTED, CLOCKS_CLK_GPOUT1_CTRL, CLOCKS_CLK_GPOUT2_CTRL, CLOCKS_CLK_GPOUT3_CTRL
- IO_BANK0 — мультиплексор GPIOIO_BANK0_GPIOn_STATUS, IO_BANK0_GPIOn_CTRL, IO_BANK0_IRQSUMMARY_PROC0_SECURE0, IO_BANK0_IRQSUMMARY_PROC0_SECURE1, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE0, IO_BANK0_IRQSUMMARY_PROC0_NONSECURE1
- IO_QSPI — мультиплексор выводов QSPI и USBIO_QSPI_USBPHY_DP_STATUS, IO_QSPI_USBPHY_DP_CTRL, IO_QSPI_USBPHY_DM_STATUS, IO_QSPI_USBPHY_DM_CTRL, IO_QSPI_GPIO_QSPI_SCLK_STATUS, IO_QSPI_GPIO_QSPI_SCLK_CTRL
- M33 — системные регистры Cortex-M33M33_ITM_STIMn, M33_ITM_TER0, M33_ITM_TPR, M33_ITM_TCR, M33_INT_ATREADY, M33_INT_ATVALID
Статьи и термины
- GPIOВывод общего назначения: вход и выход, подтяжки, сила выхода, функции
- DMAПрямой доступ к памяти без участия ядра
- PIO RP2040Автоматы PIO: устройство, 9 команд, задержка, side-set, FIFO, частота, пример
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи