Что такое side-set в PIO RP2040 и как его использовать?
Обновлено Редакция GAW
У каждой команды PIO есть 5-битное поле Delay/side-set. Без side-set оно задаёт задержку после команды — до 31 такта. Side-set забирает старшие биты этого поля и использует их, чтобы в том же такте выставить значения на нескольких выводах. Основы PIO — на странице PIO RP2040 и в термине «PIO».
Сколько остаётся на задержку
| Директива | Бит side-set | Бит задержки | Наибольшая задержка |
|---|---|---|---|
| нет | 0 | 5 | 31 такт |
| .side_set 1 | 1 | 4 | 15 тактов |
| .side_set 1 opt | 2 (с флагом) | 3 | 7 тактов |
| .side_set 2 | 2 | 3 | 7 тактов |
| .side_set 5 | 5 | 0 | задержки нет |
Наибольшая задержка — наш расчёт как 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 ждёт уровня на выводе.
Источники
- 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
- 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 меняет направления выводов
Нашли ошибку?
Смотрите также
- PIO RP2040Автоматы PIO: устройство, 9 команд, задержка, side-set, FIFO, частота, пример
- Делитель PIO RP2040INT и FRAC по частоте и тактам на бит, регистр CLKDIV, ошибка, код pico-sdk
- PIOПрограммируемый ввод-вывод: автоматы состояний, FIFO, интерфейсы
- Сколько данных помещается в FIFO PIO RP2040?TX и RX по 4 слова; FJOIN — 8 слов в одну сторону; DMA по DREQ
- RP2040: выводы и функции GPIO30 GPIO: выводы QFN-56, функции F1–F9, АЦП, QSPI, SWD, питание, токи