Регистры QMI RP2350
Регистры интерфейса QSPI-памяти QMI в RP2350: две микросхемы флеш-памяти или PSRAM в окне XIP, тайминги и формат команд для каждой, прямой режим SPI для программирования и трансляция адресов для нескольких образов программы.
QMI заменил SSI из RP2040 и подключает к окну XIP две внешние микросхемы памяти по SPI, Dual SPI или Quad SPI с общими SCK и линиями данных и отдельными выборами. CS0 (свой вывод) занимает адреса с 0x1000 0000, CS1 (альтернативная функция GPIO) — с 0x1100 0000, по 16 МБ на каждый, до 32 МБ всего (даташит RP2350, раздел 12.14).
Тайминги и формат команд задаются отдельно для каждого выбора: M0_… для CS0, M1_… для CS1. SCK — системная частота, делённая на целое от 1 до 256, выборку входных данных можно сдвигать на полтакта системной частоты (RXDELAY), а режим DTR передаёт адрес и данные по обоим фронтам SCK. Mn_RFMT и Mn_RCMD задают чтение — ширину фаз, код команды, суффикс и пустые такты, Mn_WFMT и Mn_WCMD — запись. После сброса настроены простое чтение командой 03h и запись командой 02h.
Прямой режим (DIRECT_CSR.EN) отдаёт шину программе: она сама управляет выборами и передаёт байты через FIFO DIRECT_TX и DIRECT_RX — так программируют флеш-память. ATRANS0–ATRANS7 делят каждый выбор на четыре окна по 4 МБ с базой и размером в секторах по 4 КБ: загрузчик может выполнять на месте любой из нескольких образов программы, скомпонованных для адреса 0x1000 0000.
| Экземпляр | Базовый адрес |
|---|---|
| XIP_QMI | 0x400D 0000 |
Регистры блока
| Регистр | Смещение | Назначение | После сброса |
|---|---|---|---|
| QMI_DIRECT_CSR | 0x00 | Прямой режим: управление и состояние | 0x0180 0000 |
| QMI_DIRECT_TX | 0x04 | FIFO передачи прямого режима | 0x0000 0000 |
| QMI_DIRECT_RX | 0x08 | FIFO приёма прямого режима: байт на каждый переданный | 0x0000 0000 |
| QMI_M0_TIMING | 0x0C | Тайминги окна CS0 | 0x4000 0004 |
| QMI_M0_RFMT | 0x10 | Формат чтения из окна CS0 | 0x0000 1000 |
| QMI_M0_RCMD | 0x14 | Коды команды чтения для окна CS0 | 0x0000 A003 |
| QMI_M0_WFMT | 0x18 | Формат записи в окно CS0 | 0x0000 1000 |
| QMI_M0_WCMD | 0x1C | Коды команды записи для окна CS0 | 0x0000 A002 |
| QMI_M1_TIMING | 0x20 | Тайминги окна CS1 | 0x4000 0004 |
| QMI_M1_RFMT | 0x24 | Формат чтения из окна CS1 | 0x0000 1000 |
| QMI_M1_RCMD | 0x28 | Коды команды чтения для окна CS1 | 0x0000 A003 |
| QMI_M1_WFMT | 0x2C | Формат записи в окно CS1 | 0x0000 1000 |
| QMI_M1_WCMD | 0x30 | Коды команды записи для окна CS1 | 0x0000 A002 |
| QMI_ATRANS0 | 0x34 | Трансляция адресов XIP 0–4 МБ | 0x0400 0000 |
| QMI_ATRANS1 | 0x38 | Трансляция адресов XIP 4–8 МБ | 0x0400 0400 |
| QMI_ATRANS2 | 0x3C | Трансляция адресов XIP 8–12 МБ | 0x0400 0800 |
| QMI_ATRANS3 | 0x40 | Трансляция адресов XIP 12–16 МБ | 0x0400 0C00 |
| QMI_ATRANS4 | 0x44 | Трансляция адресов XIP 16–20 МБ | 0x0400 0000 |
| QMI_ATRANS5 | 0x48 | Трансляция адресов XIP 20–24 МБ | 0x0400 0400 |
| QMI_ATRANS6 | 0x4C | Трансляция адресов XIP 24–28 МБ | 0x0400 0800 |
| QMI_ATRANS7 | 0x50 | Трансляция адресов XIP 28–32 МБ | 0x0400 0C00 |
QMI_DIRECT_CSR — прямой режим: управление и состояние
Смещение 0x00, адрес 0x400D 0000, после сброса 0x0180 0000. Макросы pico-sdk: QMI_DIRECT_CSR_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| RXDELAY | CLKDIV | — | RXLEVEL | RXFULL | RXEMPTY | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TXLEVEL | TXEMPTY | TXFULL | — | AUTO_CS1N | AUTO_CS0N | — | ASSERT_CS1N | ASSERT_CS0N | BUSY | EN | ||||
- RXDELAY (биты 31:30, чтение и запись, после сброса 0x0) — Задержка выборки входных данных в половинах такта системной частоты.
- CLKDIV (биты 29:22, чтение и запись, после сброса 0x06) — Делитель SCK в прямом режиме: 1–255, 0 — 256; можно менять на лету.
- RXLEVEL (биты 20:18, только чтение, после сброса 0x0) — Записей в FIFO DIRECT_RX.
- RXFULL (бит 17, только чтение, после сброса 0x0) — FIFO DIRECT_RX заполнена — передача ждёт чтения.
- RXEMPTY (бит 16, только чтение, после сброса 0x0) — FIFO DIRECT_RX пуста.
- TXLEVEL (биты 14:12, только чтение, после сброса 0x0) — Записей в FIFO DIRECT_TX.
- TXEMPTY (бит 11, только чтение, после сброса 0x0) — FIFO DIRECT_TX пуста — после текущего кадра передача остановится.
- TXFULL (бит 10, только чтение, после сброса 0x0) — FIFO DIRECT_TX заполнена — новые данные игнорируются.
- AUTO_CS1N (бит 7, чтение и запись, после сброса 0x0) — Выбирать CS1 автоматически, пока установлен BUSY.
- AUTO_CS0N (бит 6, чтение и запись, после сброса 0x0) — Выбирать CS0 автоматически, пока установлен BUSY.
- ASSERT_CS1N (бит 3, чтение и запись, после сброса 0x0) — Выбрать CS1 (низкий уровень); действует и при EN = 0.
- ASSERT_CS0N (бит 2, чтение и запись, после сброса 0x0) — Выбрать CS0 (низкий уровень); действует и при EN = 0.
- BUSY (бит 1, только чтение, после сброса 0x0) — Идёт передача — выбор снимать нельзя.
- EN (бит 0, чтение и запись, после сброса 0x0) — Прямой режим: программа управляет выборами и передаёт данные через FIFO.
QMI_DIRECT_TX — fIFO передачи прямого режима
Смещение 0x04, адрес 0x400D 0004, после сброса 0x0000 0000. Макросы pico-sdk: QMI_DIRECT_TX_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | NOPUSH | OE | DWIDTH | IWIDTH | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DATA | |||||||||||||||
- NOPUSH (бит 20, запись с побочным действием, после сброса 0x0) — Не класть ответ в DIRECT_RX — удобно для команды в начале передачи.
- OE (бит 19, запись с побочным действием, после сброса 0x0) — Разрешение выхода линий данных в Dual и Quad SPI; в обычном SPI не действует.
- DWIDTH (бит 18, запись с побочным действием, после сброса 0x0) — Ширина данных: 0 — 8 бит, 1 — 16 бит.
- IWIDTH (биты 17:16, запись с побочным действием, после сброса 0x0) — Ширина интерфейса для этой записи: SPI, Dual или Quad.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - DATA (биты 15:0, запись с побочным действием, после сброса 0x0000) — Данные для передачи.
QMI_DIRECT_RX — fIFO приёма прямого режима: байт на каждый переданный
Смещение 0x08, адрес 0x400D 0008, после сброса 0x0000 0000, чтение с побочным действием. Макросы pico-sdk: QMI_DIRECT_RX_…
Отдельных полей нет: значение занимает биты 15:0, остальные биты не используются.
QMI_M0_TIMING — тайминги окна CS0
Смещение 0x0C, адрес 0x400D 000C, после сброса 0x4000 0004. Макросы pico-sdk: QMI_M0_TIMING_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| COOLDOWN | PAGEBREAK | — | SELECT_SETUP | SELECT_HOLD | MAX_SELECT | MIN_DESELECT | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MIN_DESELECT | — | RXDELAY | CLKDIV | ||||||||||||
- COOLDOWN (биты 31:30, чтение и запись, после сброса 0x1) — После передачи выбор держится ещё 64 × COOLDOWN тактов системной частоты и полпериода SCK — следующее последовательное обращение продолжит передачу.
- PAGEBREAK (биты 29:28, чтение и запись, после сброса 0x0) — Снимать выбор на границах страниц, кратных степени двойки, — для PSRAM.
Значение Имя в pico-sdk Что значит 0x0 none Границы страниц не учитываются 0x1 256 Прерывать передачу на границе страницы 256 байт 0x2 1024 Прерывать передачу на границе 1024 байт 0x3 4096 Прерывать передачу на границе сектора 4096 байт - SELECT_SETUP (бит 25, чтение и запись, после сброса 0x0) — Добавить до одного такта между выбором и первым фронтом SCK.
- SELECT_HOLD (биты 24:23, чтение и запись, после сброса 0x0) — Добавить до трёх тактов удержания выбора после последнего спада SCK.
- MAX_SELECT (биты 22:17, чтение и запись, после сброса 0x00) — Наибольшее время активного выбора в единицах по 64 такта, 0 — без ограничения.
- MIN_DESELECT (биты 16:12, чтение и запись, после сброса 0x00) — Дополнительные такты паузы между снятием и новым выбором.
- RXDELAY (биты 10:8, чтение и запись, после сброса 0x0) — Задержка выборки входных данных в половинах такта системной частоты.
- CLKDIV (биты 7:0, чтение и запись, после сброса 0x04) — Делитель SCK от системной частоты: 1–255, 0 — 256; чётный или нечётный.
QMI_M0_RFMT — формат чтения из окна CS0
Смещение 0x10, адрес 0x400D 0010, после сброса 0x0000 1000. Макросы pico-sdk: QMI_M0_RFMT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | DTR | — | DUMMY_LEN | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX_LEN | — | PREFIX_LEN | — | DATA_WIDTH | DUMMY_WIDTH | SUFFIX_WIDTH | ADDR_WIDTH | PREFIX_WIDTH | |||||||
- DTR (бит 28, чтение и запись, после сброса 0x0) — Удвоенная скорость (DTR): адрес, суффикс и данные передаются по обоим фронтам SCK.
- DUMMY_LEN (биты 18:16, чтение и запись, после сброса 0x0) — Пустые такты между суффиксом и данными, в единицах по 4 бита.
Значение Имя в pico-sdk Что значит 0x0 none Без пустых тактов 0x1 4 4 пустых бит 0x2 8 8 пустых бит 0x3 12 12 пустых бит 0x4 16 16 пустых бит 0x5 20 20 пустых бит 0x6 24 24 пустых бит 0x7 28 28 пустых бит - SUFFIX_LEN (биты 15:14, чтение и запись, после сброса 0x0) — Длина суффикса после адреса: 0 или 8 бит.
Значение Имя в pico-sdk Что значит 0x0 none Без суффикса 0x2 8 Суффикс 8 бит - PREFIX_LEN (бит 12, чтение и запись, после сброса 0x1) — Длина префикса — кода команды: 0 или 8 бит.
- DATA_WIDTH (биты 9:8, чтение и запись, после сброса 0x0) — Ширина фазы данных: SPI, Dual или Quad.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - DUMMY_WIDTH (биты 7:6, чтение и запись, после сброса 0x0) — Ширина фазы пустых тактов.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - SUFFIX_WIDTH (биты 5:4, чтение и запись, после сброса 0x0) — Ширина суффикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - ADDR_WIDTH (биты 3:2, чтение и запись, после сброса 0x0) — Ширина адреса; адрес всегда 24 бита.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - PREFIX_WIDTH (биты 1:0, чтение и запись, после сброса 0x0) — Ширина префикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита
QMI_M0_RCMD — коды команды чтения для окна CS0
Смещение 0x14, адрес 0x400D 0014, после сброса 0x0000 A003. Макросы pico-sdk: QMI_M0_RCMD_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX | PREFIX | ||||||||||||||
- SUFFIX (биты 15:8, чтение и запись, после сброса 0xA0) — Суффикс после адреса, если SUFFIX_LEN не 0.
- PREFIX (биты 7:0, чтение и запись, после сброса 0x03) — Код команды чтения перед адресом, если PREFIX_LEN не 0.
QMI_M0_WFMT — формат записи в окно CS0
Смещение 0x18, адрес 0x400D 0018, после сброса 0x0000 1000. Макросы pico-sdk: QMI_M0_WFMT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | DTR | — | DUMMY_LEN | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX_LEN | — | PREFIX_LEN | — | DATA_WIDTH | DUMMY_WIDTH | SUFFIX_WIDTH | ADDR_WIDTH | PREFIX_WIDTH | |||||||
- DTR (бит 28, чтение и запись, после сброса 0x0) — Удвоенная скорость (DTR): адрес, суффикс и данные передаются по обоим фронтам SCK.
- DUMMY_LEN (биты 18:16, чтение и запись, после сброса 0x0) — Пустые такты между суффиксом и данными, в единицах по 4 бита.
Значение Имя в pico-sdk Что значит 0x0 none Без пустых тактов 0x1 4 4 пустых бит 0x2 8 8 пустых бит 0x3 12 12 пустых бит 0x4 16 16 пустых бит 0x5 20 20 пустых бит 0x6 24 24 пустых бит 0x7 28 28 пустых бит - SUFFIX_LEN (биты 15:14, чтение и запись, после сброса 0x0) — Длина суффикса после адреса: 0 или 8 бит.
Значение Имя в pico-sdk Что значит 0x0 none Без суффикса 0x2 8 Суффикс 8 бит - PREFIX_LEN (бит 12, чтение и запись, после сброса 0x1) — Длина префикса — кода команды: 0 или 8 бит.
- DATA_WIDTH (биты 9:8, чтение и запись, после сброса 0x0) — Ширина фазы данных: SPI, Dual или Quad.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - DUMMY_WIDTH (биты 7:6, чтение и запись, после сброса 0x0) — Ширина фазы пустых тактов.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - SUFFIX_WIDTH (биты 5:4, чтение и запись, после сброса 0x0) — Ширина суффикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - ADDR_WIDTH (биты 3:2, чтение и запись, после сброса 0x0) — Ширина адреса; адрес всегда 24 бита.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - PREFIX_WIDTH (биты 1:0, чтение и запись, после сброса 0x0) — Ширина префикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита
QMI_M0_WCMD — коды команды записи для окна CS0
Смещение 0x1C, адрес 0x400D 001C, после сброса 0x0000 A002. Макросы pico-sdk: QMI_M0_WCMD_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX | PREFIX | ||||||||||||||
- SUFFIX (биты 15:8, чтение и запись, после сброса 0xA0) — Суффикс после адреса, если SUFFIX_LEN не 0.
- PREFIX (биты 7:0, чтение и запись, после сброса 0x02) — Код команды записи перед адресом, если PREFIX_LEN не 0.
QMI_M1_TIMING — тайминги окна CS1
Смещение 0x20, адрес 0x400D 0020, после сброса 0x4000 0004. Макросы pico-sdk: QMI_M1_TIMING_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| COOLDOWN | PAGEBREAK | — | SELECT_SETUP | SELECT_HOLD | MAX_SELECT | MIN_DESELECT | |||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| MIN_DESELECT | — | RXDELAY | CLKDIV | ||||||||||||
- COOLDOWN (биты 31:30, чтение и запись, после сброса 0x1) — После передачи выбор держится ещё 64 × COOLDOWN тактов системной частоты и полпериода SCK — следующее последовательное обращение продолжит передачу.
- PAGEBREAK (биты 29:28, чтение и запись, после сброса 0x0) — Снимать выбор на границах страниц, кратных степени двойки, — для PSRAM.
Значение Имя в pico-sdk Что значит 0x0 none Границы страниц не учитываются 0x1 256 Прерывать передачу на границе страницы 256 байт 0x2 1024 Прерывать передачу на границе 1024 байт 0x3 4096 Прерывать передачу на границе сектора 4096 байт - SELECT_SETUP (бит 25, чтение и запись, после сброса 0x0) — Добавить до одного такта между выбором и первым фронтом SCK.
- SELECT_HOLD (биты 24:23, чтение и запись, после сброса 0x0) — Добавить до трёх тактов удержания выбора после последнего спада SCK.
- MAX_SELECT (биты 22:17, чтение и запись, после сброса 0x00) — Наибольшее время активного выбора в единицах по 64 такта, 0 — без ограничения.
- MIN_DESELECT (биты 16:12, чтение и запись, после сброса 0x00) — Дополнительные такты паузы между снятием и новым выбором.
- RXDELAY (биты 10:8, чтение и запись, после сброса 0x0) — Задержка выборки входных данных в половинах такта системной частоты.
- CLKDIV (биты 7:0, чтение и запись, после сброса 0x04) — Делитель SCK от системной частоты: 1–255, 0 — 256; чётный или нечётный.
QMI_M1_RFMT — формат чтения из окна CS1
Смещение 0x24, адрес 0x400D 0024, после сброса 0x0000 1000. Макросы pico-sdk: QMI_M1_RFMT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | DTR | — | DUMMY_LEN | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX_LEN | — | PREFIX_LEN | — | DATA_WIDTH | DUMMY_WIDTH | SUFFIX_WIDTH | ADDR_WIDTH | PREFIX_WIDTH | |||||||
- DTR (бит 28, чтение и запись, после сброса 0x0) — Удвоенная скорость (DTR): адрес, суффикс и данные передаются по обоим фронтам SCK.
- DUMMY_LEN (биты 18:16, чтение и запись, после сброса 0x0) — Пустые такты между суффиксом и данными, в единицах по 4 бита.
Значение Имя в pico-sdk Что значит 0x0 none Без пустых тактов 0x1 4 4 пустых бит 0x2 8 8 пустых бит 0x3 12 12 пустых бит 0x4 16 16 пустых бит 0x5 20 20 пустых бит 0x6 24 24 пустых бит 0x7 28 28 пустых бит - SUFFIX_LEN (биты 15:14, чтение и запись, после сброса 0x0) — Длина суффикса после адреса: 0 или 8 бит.
Значение Имя в pico-sdk Что значит 0x0 none Без суффикса 0x2 8 Суффикс 8 бит - PREFIX_LEN (бит 12, чтение и запись, после сброса 0x1) — Длина префикса — кода команды: 0 или 8 бит.
- DATA_WIDTH (биты 9:8, чтение и запись, после сброса 0x0) — Ширина фазы данных: SPI, Dual или Quad.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - DUMMY_WIDTH (биты 7:6, чтение и запись, после сброса 0x0) — Ширина фазы пустых тактов.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - SUFFIX_WIDTH (биты 5:4, чтение и запись, после сброса 0x0) — Ширина суффикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - ADDR_WIDTH (биты 3:2, чтение и запись, после сброса 0x0) — Ширина адреса; адрес всегда 24 бита.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - PREFIX_WIDTH (биты 1:0, чтение и запись, после сброса 0x0) — Ширина префикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита
QMI_M1_RCMD — коды команды чтения для окна CS1
Смещение 0x28, адрес 0x400D 0028, после сброса 0x0000 A003. Макросы pico-sdk: QMI_M1_RCMD_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX | PREFIX | ||||||||||||||
- SUFFIX (биты 15:8, чтение и запись, после сброса 0xA0) — Суффикс после адреса, если SUFFIX_LEN не 0.
- PREFIX (биты 7:0, чтение и запись, после сброса 0x03) — Код команды чтения перед адресом, если PREFIX_LEN не 0.
QMI_M1_WFMT — формат записи в окно CS1
Смещение 0x2C, адрес 0x400D 002C, после сброса 0x0000 1000. Макросы pico-sdk: QMI_M1_WFMT_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | DTR | — | DUMMY_LEN | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX_LEN | — | PREFIX_LEN | — | DATA_WIDTH | DUMMY_WIDTH | SUFFIX_WIDTH | ADDR_WIDTH | PREFIX_WIDTH | |||||||
- DTR (бит 28, чтение и запись, после сброса 0x0) — Удвоенная скорость (DTR): адрес, суффикс и данные передаются по обоим фронтам SCK.
- DUMMY_LEN (биты 18:16, чтение и запись, после сброса 0x0) — Пустые такты между суффиксом и данными, в единицах по 4 бита.
Значение Имя в pico-sdk Что значит 0x0 none Без пустых тактов 0x1 4 4 пустых бит 0x2 8 8 пустых бит 0x3 12 12 пустых бит 0x4 16 16 пустых бит 0x5 20 20 пустых бит 0x6 24 24 пустых бит 0x7 28 28 пустых бит - SUFFIX_LEN (биты 15:14, чтение и запись, после сброса 0x0) — Длина суффикса после адреса: 0 или 8 бит.
Значение Имя в pico-sdk Что значит 0x0 none Без суффикса 0x2 8 Суффикс 8 бит - PREFIX_LEN (бит 12, чтение и запись, после сброса 0x1) — Длина префикса — кода команды: 0 или 8 бит.
- DATA_WIDTH (биты 9:8, чтение и запись, после сброса 0x0) — Ширина фазы данных: SPI, Dual или Quad.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - DUMMY_WIDTH (биты 7:6, чтение и запись, после сброса 0x0) — Ширина фазы пустых тактов.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - SUFFIX_WIDTH (биты 5:4, чтение и запись, после сброса 0x0) — Ширина суффикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - ADDR_WIDTH (биты 3:2, чтение и запись, после сброса 0x0) — Ширина адреса; адрес всегда 24 бита.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита - PREFIX_WIDTH (биты 1:0, чтение и запись, после сброса 0x0) — Ширина префикса.
Значение Имя в pico-sdk Что значит 0x0 s Обычный SPI, 1 бит 0x1 d Dual SPI, 2 бита 0x2 q Quad SPI, 4 бита
QMI_M1_WCMD — коды команды записи для окна CS1
Смещение 0x30, адрес 0x400D 0030, после сброса 0x0000 A002. Макросы pico-sdk: QMI_M1_WCMD_…
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SUFFIX | PREFIX | ||||||||||||||
- SUFFIX (биты 15:8, чтение и запись, после сброса 0xA0) — Суффикс после адреса, если SUFFIX_LEN не 0.
- PREFIX (биты 7:0, чтение и запись, после сброса 0x02) — Код команды записи перед адресом, если PREFIX_LEN не 0.
QMI_ATRANS0 — трансляция адресов XIP 0–4 МБ
Смещение 0x34, адрес 0x400D 0034, после сброса 0x0400 0000. Макросы pico-sdk: QMI_ATRANS0_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x000) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS1 — трансляция адресов XIP 4–8 МБ
Смещение 0x38, адрес 0x400D 0038, после сброса 0x0400 0400. Макросы pico-sdk: QMI_ATRANS1_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x400) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS2 — трансляция адресов XIP 8–12 МБ
Смещение 0x3C, адрес 0x400D 003C, после сброса 0x0400 0800. Макросы pico-sdk: QMI_ATRANS2_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x800) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS3 — трансляция адресов XIP 12–16 МБ
Смещение 0x40, адрес 0x400D 0040, после сброса 0x0400 0C00. Макросы pico-sdk: QMI_ATRANS3_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0xC00) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS4 — трансляция адресов XIP 16–20 МБ
Смещение 0x44, адрес 0x400D 0044, после сброса 0x0400 0000. Макросы pico-sdk: QMI_ATRANS4_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x000) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS5 — трансляция адресов XIP 20–24 МБ
Смещение 0x48, адрес 0x400D 0048, после сброса 0x0400 0400. Макросы pico-sdk: QMI_ATRANS5_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x400) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS6 — трансляция адресов XIP 24–28 МБ
Смещение 0x4C, адрес 0x400D 004C, после сброса 0x0400 0800. Макросы pico-sdk: QMI_ATRANS6_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0x800) — Физическая база окна в секторах по 4 КБ.
QMI_ATRANS7 — трансляция адресов XIP 28–32 МБ
Смещение 0x50, адрес 0x400D 0050, после сброса 0x0400 0C00. Макросы pico-sdk: QMI_ATRANS7_…
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SIZE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | BASE | ||||||||||||||
- SIZE (биты 26:16, чтение и запись, после сброса 0x400) — Размер окна в секторах по 4 КБ; обращение за его пределами — ошибка шины.
- BASE (биты 11:0, чтение и запись, после сброса 0xC00) — Физическая база окна в секторах по 4 КБ.
Частые вопросы
Как подключить PSRAM к RP2350?
Вторую микросхему подключают к выбору CS1 — это альтернативная функция GPIO, — и её память появляется с адреса 0x1100 0000. Для неё настраивают M1_TIMING, чтение в M1_RFMT и M1_RCMD и запись в M1_WFMT и M1_WCMD; MAX_SELECT ограничивает время активного выбора, как требуют микросхемы PSRAM.
Зачем в QMI трансляция адресов?
Чтобы программа, скомпонованная для адреса 0x1000 0000, выполнялась на месте из любого места флеш-памяти. Регистры ATRANS0–ATRANS7 задают для каждого окна по 4 МБ физическую базу и размер в секторах по 4 КБ; обращение за пределы размера даёт ошибку шины.
Источники
- Raspberry Pi. RP2350 Datasheet (release 8, build 80d627281ed5) — раздел 12.14.6: список регистров, назначение полей, тип доступа и значения после сброса
- 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 — быстрый последовательный выводHSTX_CTRL_CSR, HSTX_CTRL_BITn, HSTX_CTRL_EXPAND_SHIFT, HSTX_CTRL_EXPAND_TMDS
- HSTX_FIFO — FIFO быстрого выводаHSTX_FIFO_STAT, HSTX_FIFO_FIFO
- 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
Статьи и термины
- QSPISPI с четырьмя линиями данных для флеш-памяти и PSRAM
- XIP (execute in place)Выполнение кода из внешней флеш через кэш: устройство, кэш, скорость
- Режимы SPI (CPOL, CPHA)Режимы 0–3: полярность и фаза такта SPI
- RP2350: выводы и функции GPIO30 или 48 GPIO: выводы QFN-60 и QFN-80, функции F0–F11, АЦП, 5 В, токи