Перейти к содержанию

Что такое side-set в PIO RP2040 и как его использовать?

Обновлено Редакция GAW

У каждой команды PIO есть 5-битное поле Delay/side-set. Без side-set оно задаёт задержку после команды — до 31 такта. Side-set забирает старшие биты этого поля и использует их, чтобы в том же такте выставить значения на нескольких выводах. Основы PIO — на странице PIO RP2040 и в термине «PIO».

Сколько остаётся на задержку

ДирективаБит side-setБит задержкиНаибольшая задержка
нет0531 такт
.side_set 11415 тактов
.side_set 1 opt2 (с флагом)37 тактов
.side_set 2237 тактов
.side_set 550задержки нет

Наибольшая задержка — наш расчёт как 2 в степени числа бит минус 1.

Пример: быстрый вывод SPI

.program spi_tx_fast
.side_set 1            ; one side-set bit: the clock pin
loop:
    out pins, 1 side 0 ; data bit out, clock low
    jmp loop    side 1 ; clock high

Это пример из даташита: бит данных и фронт такта меняются в одной команде, и один бит уходит за два такта автомата. В программе на C side-set настраивают так:

sm_config_set_sideset(&c, 1, false, false);   // 1 bit, not optional, drives pin values
sm_config_set_sideset_pins(&c, PIN_SCK);      // lowest side-set pin

Частоту, с которой автомат исполняет команды, задаёт делитель — его считает калькулятор PIO RP2040. Если данные поступают быстрее, чем автомат их отдаёт, смотрите ответ «Сколько данных помещается в FIFO PIO». Выводы и периферия микросхемы — на странице RP2040.

Похожие вопросы

Что будет, если side-set и команда OUT пишут в один и тот же вывод?

По даташиту RP2040 побеждает side-set. Сопоставления выводов для side-set, OUT и SET независимы и могут пересекаться — на этом построен пример I2C, где SCL управляется через side-set, а SDA — через OUT и SET.

Нужно ли указывать side в каждой команде?

Без слова opt — да, side-set выполняется в каждой команде, и ассемблер требует значение. С .side_set N opt значение можно опускать: старший бит поля служит флагом, и команды без side выводы не трогают. Плата за это — ещё один бит, отнятый у задержки.

Сработает ли side-set, если команда ждёт данных?

Да. По даташиту side-set выполняется в первом такте команды, даже если сама команда остановилась, например PULL ждёт данных в FIFO или WAIT ждёт уровня на выводе.

Источники

  1. Raspberry Pi Ltd. RP2040 Datasheet (build 2025-02-20) — разд. 3.3.1: директива .side_set <count> (opt) (pindirs) — opt забирает ещё один бит у задержки, pindirs — значения идут в направления выводов; разд. 3.4.1: каждая команда исполняется за один такт, 5-битное поле Delay/side-set — младшие (5 − SIDESET_COUNT) бит задают задержку, старшие — side-set; разд. 3.5.1: side-set меняет уровень или направление до 5 выводов одновременно с командой, применяется в первом такте даже при остановке команды; если side-set и OUT/SET пишут в один вывод, побеждает side-set; пример spi_tx_fast — бит за два такта; настройка: PINCTRL_SIDESET_COUNT, EXECCTRL_SIDE_EN (бит разрешения), PINCTRL_SIDESET_BASE, EXECCTRL_SIDE_PINDIR
  2. Raspberry Pi Ltd. pico-sdk 2.3.1, src/rp2_common/hardware_pio/include/hardware/pio.h — sm_config_set_sideset_pins(c, sideset_base) — первый вывод side-set; sm_config_set_sideset(c, bit_count, optional, pindirs): bit_count — число бит, забираемых у поля задержки (не больше 5), optional — старший бит служит флагом применения side-set, pindirs — side-set меняет направления выводов

Нашли ошибку?