Регистры SPI ESP32-C3
Регистры GP-SPI2 ESP32-C3 — единственного SPI для внешних устройств: фазы транзакции (команда, адрес, пауза, данные), частота SCLK, режимы 0–3, буфер данных на 64 байта, ведомый режим и прерывания GDMA.
Содержание
- Пример на C
- Регистры блока
- SPI_CMD_REG
- SPI_ADDR_REG
- SPI_CTRL_REG
- SPI_CLOCK_REG
- SPI_USER_REG
- SPI_USER1_REG
- SPI_USER2_REG
- SPI_MS_DLEN_REG
- SPI_MISC_REG
- SPI_DIN_MODE_REG
- SPI_DIN_NUM_REG
- SPI_DOUT_MODE_REG
- SPI_DMA_CONF_REG
- SPI_DMA_INT_ENA_REG
- SPI_DMA_INT_CLR_REG
- SPI_DMA_INT_RAW_REG
- SPI_DMA_INT_ST_REG
- SPI_Wn_REG
- SPI_SLAVE_REG
- SPI_SLAVE1_REG
- SPI_CLK_GATE_REG
- SPI_DATE_REG
SPI0 и SPI1 ESP32-C3 обслуживают флеш-память и для программ недоступны; к датчикам, дисплеям и другим микросхемам подключают GP-SPI2 по адресу 0x6002 4000. Он работает ведущим и ведомым, по одной, двум или четырём линиям данных, данные берёт из буфера W0…W15 (64 байта) или через GDMA.
Транзакция описывается регистрами SPI_USER_REG (какие фазы есть), SPI_USER1_REG и SPI_USER2_REG (длины адреса, паузы и команды), SPI_MS_DLEN_REG (длина данных в битах минус 1). Частота ведущего — f_spi = f_src / ((CLKDIV_PRE + 1) · (CLKCNT_N + 1)), где f_src — такт модуля, обычно 80 МГц; полярность и фаза задаются битами CK_IDLE_EDGE регистра SPI_MISC_REG и CK_OUT_EDGE регистра SPI_USER_REG.
Настройки попадают в домен тактов SPI только после записи 1 в бит UPDATE регистра SPI_CMD_REG; транзакцию запускает бит USR того же регистра, он сбрасывается сам по окончании.
| Экземпляр | Базовый адрес |
|---|---|
| SPI2 | 0x6002 4000 |
Пример на C
GP-SPI2: передать 4 байта ведущим (soc/spi_reg.h, экземпляр 2). Макросы доступа REG_WRITE, REG_READ, REG_SET_BIT, REG_CLR_BIT, REG_GET_BIT, REG_SET_FIELD и REG_GET_FIELD объявлены в soc/soc.h ESP-IDF; поле задаётся именем макроса без суффикса, маска и сдвиг берутся из его вариантов _V и _S.
#include "soc/spi_reg.h"
REG_SET_BIT(SPI_USER_REG(2), SPI_USR_MOSI); // есть фаза данных MOSI
REG_CLR_BIT(SPI_USER_REG(2), SPI_USR_COMMAND); // без команды
REG_CLR_BIT(SPI_USER_REG(2), SPI_USR_ADDR); // без адреса
REG_SET_FIELD(SPI_MS_DLEN_REG(2), SPI_MS_DATA_BITLEN, 32 - 1);
REG_WRITE(SPI_W0_REG(2), 0x44332211); // первым уходит 0x11
REG_SET_BIT(SPI_CMD_REG(2), SPI_UPDATE); // перенести настройки
while (REG_GET_BIT(SPI_CMD_REG(2), SPI_UPDATE)) {}
REG_SET_BIT(SPI_CMD_REG(2), SPI_USR); // старт транзакции
while (REG_GET_BIT(SPI_CMD_REG(2), SPI_USR)) {}Регистры блока
| Регистр (ESP-IDF) | Смещение | Назначение | После сброса |
|---|---|---|---|
| SPI_CMD_REG(i) | 0x0000 | Запуск транзакции и перенос настроек | 0x0000 0000 |
| SPI_ADDR_REG(i) | 0x0004 | Значение фазы адреса | 0x0000 0000 |
| SPI_CTRL_REG(i) | 0x0008 | Порядок битов, полярности линий, режимы Dual и Quad | 0x003C 0000 |
| SPI_CLOCK_REG(i) | 0x000C | Делитель частоты SCLK | 0x8000 3043 |
| SPI_USER_REG(i) | 0x0010 | Фазы транзакции, режим линий данных, фронты | 0x8000 00C0 |
| SPI_USER1_REG(i) | 0x0014 | Длины адреса и паузы, задержки CS | 0xB841 0007 |
| SPI_USER2_REG(i) | 0x0018 | Длина и значение команды | 0x7800 0000 |
| SPI_MS_DLEN_REG(i) | 0x001C | Длина данных транзакции в битах | 0x0000 0000 |
| SPI_MISC_REG(i) | 0x0020 | Выводы CS, полярность и уровень SCLK в покое | 0x0000 003E |
| SPI_DIN_MODE_REG(i) | 0x0024 | Задержка выборки входных линий | 0x0000 0000 |
| SPI_DIN_NUM_REG(i) | 0x0028 | Число тактов задержки входных линий | 0x0000 0000 |
| SPI_DOUT_MODE_REG(i) | 0x002C | Задержка выходных линий | 0x0000 0000 |
| SPI_DMA_CONF_REG(i) | 0x0030 | Работа с GDMA и сброс FIFO | 0x0000 0000 |
| SPI_DMA_INT_ENA_REG(i) | 0x0034 | Разрешение прерываний | 0x0000 0000 |
| SPI_DMA_INT_CLR_REG(i) | 0x0038 | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| SPI_DMA_INT_RAW_REG(i) | 0x003C | Необработанные флаги прерываний | 0x0000 0000 |
| SPI_DMA_INT_ST_REG(i) | 0x0040 | Флаги прерываний после маски разрешения | 0x0000 0000 |
| SPI_Wn_REG(i) | 0x0098 + n · 0x0004 | Буфер данных, слово n | 0x0000 0000 |
| SPI_SLAVE_REG(i) | 0x00E0 | Ведомый режим и режимы такта | 0x0280 0000 |
| SPI_SLAVE1_REG(i) | 0x00E4 | Ведомый: последние команда и адрес, длина данных | 0x0000 0000 |
| SPI_CLK_GATE_REG(i) | 0x00E8 | Тактирование модуля и регистров | 0x0000 0000 |
| SPI_DATE_REG(i) | 0x00F0 | Версия блока: дата ревизии аппаратуры | 0x0200 7220 |
Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.
SPI_CMD_REG(i) — запуск транзакции и перенос настроек
Смещение 0x0000, адрес 0x6002 4000, после сброса 0x0000 0000. TRM: регистр 27.1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | USR | UPDATE | — | CONF_BITLEN | |||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CONF_BITLEN | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR | 24 | R/W/SC | 0 | Запись 1 запускает транзакцию; бит сбрасывается по её окончании |
| UPDATE | 23 | WT | 0 | Запись 1 переносит настройки в домен тактов SPI; сбрасывается сам |
| CONF_BITLEN | 17:0 | R/W | 0x00000 | Длина фазы CONF в тактах SPI (сегментная передача) |
SPI_ADDR_REG(i) — значение фазы адреса
Смещение 0x0004, адрес 0x6002 4004, после сброса 0x0000 0000. TRM: регистр 27.2.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR_ADDR_VALUE | 31:0 | R/W | 0x0000 0000 | Адрес, который передаётся в фазе адреса |
SPI_CTRL_REG(i) — порядок битов, полярности линий, режимы Dual и Quad
Смещение 0x0008, адрес 0x6002 4008, после сброса 0x003C 0000. TRM: регистр 27.6.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | WR_BIT_ORDER | RD_BIT_ORDER | — | WP_POL | HOLD_POL | D_POL | Q_POL | — | |||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| FREAD_QUAD | FREAD_DUAL | — | FCMD_QUAD | FCMD_DUAL | — | FADDR_QUAD | FADDR_DUAL | — | DUMMY_OUT | — | |||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| WR_BIT_ORDER | 26 | R/W | 0 | Порядок битов при передаче: 0 — старший первым, 1 — младший |
| RD_BIT_ORDER | 25 | R/W | 0 | Порядок битов при приёме: 0 — старший первым, 1 — младший |
| WP_POL | 21 | R/W | 1 | |
| HOLD_POL | 20 | R/W | 1 | |
| D_POL | 19 | R/W | 1 | |
| Q_POL | 18 | R/W | 1 | |
| FREAD_QUAD | 15 | R/W | 0 | |
| FREAD_DUAL | 14 | R/W | 0 | |
| FCMD_QUAD | 9 | R/W | 0 | |
| FCMD_DUAL | 8 | R/W | 0 | |
| FADDR_QUAD | 6 | R/W | 0 | |
| FADDR_DUAL | 5 | R/W | 0 | |
| DUMMY_OUT | 3 | R/W | 0 | Выдавать уровни на линии во время паузы |
SPI_CLOCK_REG(i) — делитель частоты SCLK
Смещение 0x000C, адрес 0x6002 400C, после сброса 0x8000 3043. TRM: регистр 27.12.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| CLK_EQU_SYSCLK | — | CLKDIV_PRE | CLKCNT_N | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| CLKCNT_N | CLKCNT_H | CLKCNT_L | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| CLK_EQU_SYSCLK | 31 | R/W | 1 | 1 — SCLK равен такту модуля без деления |
| CLKDIV_PRE | 21:18 | R/W | 0x0 | Предделитель минус 1 |
| CLKCNT_N | 17:12 | R/W | 0x03 | Делитель минус 1: период SCLK — CLKCNT_N + 1 тактов |
| CLKCNT_H | 11:6 | R/W | 0x01 | Длительность высокого уровня SCLK; обычно (CLKCNT_N + 1) / 2 − 1 |
| CLKCNT_L | 5:0 | R/W | 0x03 | Длительность низкого уровня; записывают равной CLKCNT_N |
SPI_USER_REG(i) — фазы транзакции, режим линий данных, фронты
Смещение 0x0010, адрес 0x6002 4010, после сброса 0x8000 00C0. TRM: регистр 27.3.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR_COMMAND | 31 | R/W | 1 | В транзакции есть фаза команды |
| USR_ADDR | 30 | R/W | 0 | В транзакции есть фаза адреса |
| USR_DUMMY | 29 | R/W | 0 | В транзакции есть пауза (dummy) |
| USR_MISO | 28 | R/W | 0 | В транзакции есть приём данных |
| USR_MOSI | 27 | R/W | 0 | В транзакции есть передача данных |
| USR_DUMMY_IDLE | 26 | R/W | 0 | |
| USR_MOSI_HIGHPART | 25 | R/W | 0 | |
| USR_MISO_HIGHPART | 24 | R/W | 0 | |
| SIO | 17 | R/W | 0 | Трёхпроводный режим: одна линия данных на приём и передачу |
| USR_CONF_NXT | 15 | R/W | 0 | |
| FWRITE_QUAD | 13 | R/W | 0 | |
| FWRITE_DUAL | 12 | R/W | 0 | |
| CK_OUT_EDGE | 9 | R/W | 0 | Фронт выдачи данных; вместе с CK_IDLE_EDGE задаёт режим SPI |
| RSCK_I_EDGE | 8 | R/W | 0 | |
| CS_SETUP | 7 | R/W | 1 | Задержка между CS и первым фронтом SCLK |
| CS_HOLD | 6 | R/W | 1 | Удержание CS после последнего фронта SCLK |
| TSCK_I_EDGE | 5 | R/W | 0 | |
| QPI_MODE | 3 | R/W/SS/SC | 0 | Режим QPI: все фазы по четырём линиям |
| DOUTDIN | 0 | R/W | 0 | Полный дуплекс: передача и приём одновременно |
SPI_USER1_REG(i) — длины адреса и паузы, задержки CS
Смещение 0x0014, адрес 0x6002 4014, после сброса 0xB841 0007. TRM: регистр 27.4.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| USR_ADDR_BITLEN | CS_HOLD_TIME | CS_SETUP_TIME | MST_WFULL_ERR_END_EN | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | USR_DUMMY_CYCLELEN | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR_ADDR_BITLEN | 31:27 | R/W | 0x17 | Длина адреса в битах минус 1 |
| CS_HOLD_TIME | 26:22 | R/W | 0x01 | |
| CS_SETUP_TIME | 21:17 | R/W | 0x00 | |
| MST_WFULL_ERR_END_EN | 16 | R/W | 1 | |
| USR_DUMMY_CYCLELEN | 7:0 | R/W | 0x07 | Длина паузы в тактах SCLK минус 1 |
SPI_USER2_REG(i) — длина и значение команды
Смещение 0x0018, адрес 0x6002 4018, после сброса 0x7800 0000. TRM: регистр 27.5.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| USR_COMMAND_BITLEN | MST_REMPTY_ERR_END_EN | — | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| USR_COMMAND_VALUE | |||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR_COMMAND_BITLEN | 31:28 | R/W | 0x7 | Длина команды в битах минус 1 |
| MST_REMPTY_ERR_END_EN | 27 | R/W | 1 | |
| USR_COMMAND_VALUE | 15:0 | R/W | 0x0000 | Значение команды |
SPI_MS_DLEN_REG(i) — длина данных транзакции в битах
Смещение 0x001C, адрес 0x6002 401C, после сброса 0x0000 0000. TRM: регистр 27.7.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| MS_DATA_BITLEN | 17:0 | R/W | 0x00000 | Длина данных ведущего в битах минус 1 |
SPI_MISC_REG(i) — выводы CS, полярность и уровень SCLK в покое
Смещение 0x0020, адрес 0x6002 4020, после сброса 0x0000 003E. TRM: регистр 27.8.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| QUAD_DIN_PIN_SWAP | CS_KEEP_ACTIVE | CK_IDLE_EDGE | — | SLAVE_CS_POL | — | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | MASTER_CS_POL | CK_DIS | CS5_DIS | CS4_DIS | CS3_DIS | CS2_DIS | CS1_DIS | CS0_DIS | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| QUAD_DIN_PIN_SWAP | 31 | R/W | 0 | |
| CS_KEEP_ACTIVE | 30 | R/W | 0 | Держать CS активным после транзакции |
| CK_IDLE_EDGE | 29 | R/W | 0 | Уровень SCLK в покое (CPOL) |
| SLAVE_CS_POL | 23 | R/W | 0 | |
| MASTER_CS_POL | 12:7 | R/W | 0x00 | Полярность выходов CS ведущего, бит на линию |
| CK_DIS | 6 | R/W | 0 | Не выдавать SCLK |
| CS5_DIS | 5 | R/W | 1 | |
| CS4_DIS | 4 | R/W | 1 | |
| CS3_DIS | 3 | R/W | 1 | |
| CS2_DIS | 2 | R/W | 1 | |
| CS1_DIS | 1 | R/W | 1 | |
| CS0_DIS | 0 | R/W | 0 | Не выдавать CS0 |
SPI_DIN_MODE_REG(i) — задержка выборки входных линий
Смещение 0x0024, адрес 0x6002 4024, после сброса 0x0000 0000. TRM: регистр 27.14.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | TIMING_HCLK_ACTIVE | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DIN3_MODE | DIN2_MODE | DIN1_MODE | DIN0_MODE | |||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| TIMING_HCLK_ACTIVE | 16 | R/W | 0 |
| DIN3_MODE | 7:6 | R/W | 0x0 |
| DIN2_MODE | 5:4 | R/W | 0x0 |
| DIN1_MODE | 3:2 | R/W | 0x0 |
| DIN0_MODE | 1:0 | R/W | 0x0 |
SPI_DIN_NUM_REG(i) — число тактов задержки входных линий
Смещение 0x0028, адрес 0x6002 4028, после сброса 0x0000 0000. TRM: регистр 27.15.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DIN3_NUM | DIN2_NUM | DIN1_NUM | DIN0_NUM | |||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DIN3_NUM | 7:6 | R/W | 0x0 |
| DIN2_NUM | 5:4 | R/W | 0x0 |
| DIN1_NUM | 3:2 | R/W | 0x0 |
| DIN0_NUM | 1:0 | R/W | 0x0 |
SPI_DOUT_MODE_REG(i) — задержка выходных линий
Смещение 0x002C, адрес 0x6002 402C, после сброса 0x0000 0000. TRM: регистр 27.16.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | DOUT3_MODE | DOUT2_MODE | DOUT1_MODE | DOUT0_MODE | |||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DOUT3_MODE | 3 | R/W | 0 |
| DOUT2_MODE | 2 | R/W | 0 |
| DOUT1_MODE | 1 | R/W | 0 |
| DOUT0_MODE | 0 | R/W | 0 |
SPI_DMA_CONF_REG(i) — работа с GDMA и сброс FIFO
Смещение 0x0030, адрес 0x6002 4030, после сброса 0x0000 0000. TRM: регистр 27.9.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| DMA_AFIFO_RST | BUF_AFIFO_RST | RX_AFIFO_RST | DMA_TX_ENA | DMA_RX_ENA | — | RX_EOF_EN | SLV_TX_SEG_TRANS_CLR_EN | SLV_RX_SEG_TRANS_CLR_EN | DMA_SLV_SEG_TRANS_EN | — | |||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | |||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DMA_AFIFO_RST | 31 | WT | 0 |
| BUF_AFIFO_RST | 30 | WT | 0 |
| RX_AFIFO_RST | 29 | WT | 0 |
| DMA_TX_ENA | 28 | R/W | 0 |
| DMA_RX_ENA | 27 | R/W | 0 |
| RX_EOF_EN | 21 | R/W | 0 |
| SLV_TX_SEG_TRANS_CLR_EN | 20 | R/W | 0 |
| SLV_RX_SEG_TRANS_CLR_EN | 19 | R/W | 0 |
| DMA_SLV_SEG_TRANS_EN | 18 | R/W | 0 |
SPI_DMA_INT_ENA_REG(i) — разрешение прерываний
Смещение 0x0034, адрес 0x6002 4034, после сброса 0x0000 0000. TRM: регистр 27.17.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APP1_INT_ENA | 20 | R/W | 0 | Программное прерывание 1: ставится только записью |
| APP2_INT_ENA | 19 | R/W | 0 | Программное прерывание 2: ставится только записью |
| MST_TX_AFIFO_REMPTY_ERR_INT_ENA | 18 | R/W | 0 | Ведущий: опустел асинхронный TX FIFO |
| MST_RX_AFIFO_WFULL_ERR_INT_ENA | 17 | R/W | 0 | Ведущий: переполнился асинхронный RX FIFO |
| SLV_CMD_ERR_INT_ENA | 16 | R/W | 0 | Ведомый получил неподдерживаемую команду |
| SEG_MAGIC_ERR_INT_ENA | 14 | R/W | 0 | Неверное магическое число в конфигурации сегмента |
| DMA_SEG_TRANS_DONE_INT_ENA | 13 | R/W | 0 | Закончена сегментная передача через GDMA |
| TRANS_DONE_INT_ENA | 12 | R/W | 0 | Транзакция закончена — главное событие ведущего |
| SLV_WR_BUF_DONE_INT_ENA | 11 | R/W | 0 | Ведомый закончил запись буфера (команда WRBUF) |
| SLV_RD_BUF_DONE_INT_ENA | 10 | R/W | 0 | Ведомый закончил чтение буфера (команда RDBUF) |
| SLV_WR_DMA_DONE_INT_ENA | 9 | R/W | 0 | Ведомый закончил запись через GDMA (команда WRDMA) |
| SLV_RD_DMA_DONE_INT_ENA | 8 | R/W | 0 | Ведомый закончил чтение через GDMA (команда RDDMA) |
| SLV_CMDA_INT_ENA | 7 | R/W | 0 | Ведомый принял команду CMDA |
| SLV_CMD9_INT_ENA | 6 | R/W | 0 | Ведомый принял команду CMD9 |
| SLV_CMD8_INT_ENA | 5 | R/W | 0 | Ведомый принял команду CMD8 |
| SLV_CMD7_INT_ENA | 4 | R/W | 0 | Ведомый принял команду CMD7 |
| SLV_EN_QPI_INT_ENA | 3 | R/W | 0 | Ведомый принял команду входа в режим QPI |
| SLV_EX_QPI_INT_ENA | 2 | R/W | 0 | Ведомый принял команду выхода из режима QPI |
| DMA_OUTFIFO_EMPTY_ERR_INT_ENA | 1 | R/W | 0 | Ведомый: при передаче через GDMA опустел выходной FIFO |
| DMA_INFIFO_FULL_ERR_INT_ENA | 0 | R/W | 0 | Ведомый: при приёме через GDMA переполнился входной FIFO |
SPI_DMA_INT_CLR_REG(i) — сброс флагов прерываний записью 1
Смещение 0x0038, адрес 0x6002 4038, после сброса 0x0000 0000. TRM: регистр 27.18.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APP1_INT_CLR | 20 | WT | 0 | Программное прерывание 1: ставится только записью |
| APP2_INT_CLR | 19 | WT | 0 | Программное прерывание 2: ставится только записью |
| MST_TX_AFIFO_REMPTY_ERR_INT_CLR | 18 | WT | 0 | Ведущий: опустел асинхронный TX FIFO |
| MST_RX_AFIFO_WFULL_ERR_INT_CLR | 17 | WT | 0 | Ведущий: переполнился асинхронный RX FIFO |
| SLV_CMD_ERR_INT_CLR | 16 | WT | 0 | Ведомый получил неподдерживаемую команду |
| SEG_MAGIC_ERR_INT_CLR | 14 | WT | 0 | Неверное магическое число в конфигурации сегмента |
| DMA_SEG_TRANS_DONE_INT_CLR | 13 | WT | 0 | Закончена сегментная передача через GDMA |
| TRANS_DONE_INT_CLR | 12 | WT | 0 | Транзакция закончена — главное событие ведущего |
| SLV_WR_BUF_DONE_INT_CLR | 11 | WT | 0 | Ведомый закончил запись буфера (команда WRBUF) |
| SLV_RD_BUF_DONE_INT_CLR | 10 | WT | 0 | Ведомый закончил чтение буфера (команда RDBUF) |
| SLV_WR_DMA_DONE_INT_CLR | 9 | WT | 0 | Ведомый закончил запись через GDMA (команда WRDMA) |
| SLV_RD_DMA_DONE_INT_CLR | 8 | WT | 0 | Ведомый закончил чтение через GDMA (команда RDDMA) |
| SLV_CMDA_INT_CLR | 7 | WT | 0 | Ведомый принял команду CMDA |
| SLV_CMD9_INT_CLR | 6 | WT | 0 | Ведомый принял команду CMD9 |
| SLV_CMD8_INT_CLR | 5 | WT | 0 | Ведомый принял команду CMD8 |
| SLV_CMD7_INT_CLR | 4 | WT | 0 | Ведомый принял команду CMD7 |
| SLV_EN_QPI_INT_CLR | 3 | WT | 0 | Ведомый принял команду входа в режим QPI |
| SLV_EX_QPI_INT_CLR | 2 | WT | 0 | Ведомый принял команду выхода из режима QPI |
| DMA_OUTFIFO_EMPTY_ERR_INT_CLR | 1 | WT | 0 | Ведомый: при передаче через GDMA опустел выходной FIFO |
| DMA_INFIFO_FULL_ERR_INT_CLR | 0 | WT | 0 | Ведомый: при приёме через GDMA переполнился входной FIFO |
SPI_DMA_INT_RAW_REG(i) — необработанные флаги прерываний
Смещение 0x003C, адрес 0x6002 403C, после сброса 0x0000 0000. TRM: регистр 27.19.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APP1_INT_RAW | 20 | R/W/WTC | 0 | Программное прерывание 1: ставится только записью |
| APP2_INT_RAW | 19 | R/W/WTC | 0 | Программное прерывание 2: ставится только записью |
| MST_TX_AFIFO_REMPTY_ERR_INT_RAW | 18 | R/W/WTC/SS | 0 | Ведущий: опустел асинхронный TX FIFO |
| MST_RX_AFIFO_WFULL_ERR_INT_RAW | 17 | R/W/WTC/SS | 0 | Ведущий: переполнился асинхронный RX FIFO |
| SLV_CMD_ERR_INT_RAW | 16 | R/W/WTC/SS | 0 | Ведомый получил неподдерживаемую команду |
| SEG_MAGIC_ERR_INT_RAW | 14 | R/W/WTC/SS | 0 | Неверное магическое число в конфигурации сегмента |
| DMA_SEG_TRANS_DONE_INT_RAW | 13 | R/W/WTC/SS | 0 | Закончена сегментная передача через GDMA |
| TRANS_DONE_INT_RAW | 12 | R/W/WTC/SS | 0 | Транзакция закончена — главное событие ведущего |
| SLV_WR_BUF_DONE_INT_RAW | 11 | R/W/WTC/SS | 0 | Ведомый закончил запись буфера (команда WRBUF) |
| SLV_RD_BUF_DONE_INT_RAW | 10 | R/W/WTC/SS | 0 | Ведомый закончил чтение буфера (команда RDBUF) |
| SLV_WR_DMA_DONE_INT_RAW | 9 | R/W/WTC/SS | 0 | Ведомый закончил запись через GDMA (команда WRDMA) |
| SLV_RD_DMA_DONE_INT_RAW | 8 | R/W/WTC/SS | 0 | Ведомый закончил чтение через GDMA (команда RDDMA) |
| SLV_CMDA_INT_RAW | 7 | R/W/WTC/SS | 0 | Ведомый принял команду CMDA |
| SLV_CMD9_INT_RAW | 6 | R/W/WTC/SS | 0 | Ведомый принял команду CMD9 |
| SLV_CMD8_INT_RAW | 5 | R/W/WTC/SS | 0 | Ведомый принял команду CMD8 |
| SLV_CMD7_INT_RAW | 4 | R/W/WTC/SS | 0 | Ведомый принял команду CMD7 |
| SLV_EN_QPI_INT_RAW | 3 | R/W/WTC/SS | 0 | Ведомый принял команду входа в режим QPI |
| SLV_EX_QPI_INT_RAW | 2 | R/W/WTC/SS | 0 | Ведомый принял команду выхода из режима QPI |
| DMA_OUTFIFO_EMPTY_ERR_INT_RAW | 1 | R/W/WTC/SS | 0 | Ведомый: при передаче через GDMA опустел выходной FIFO |
| DMA_INFIFO_FULL_ERR_INT_RAW | 0 | R/W/WTC/SS | 0 | Ведомый: при приёме через GDMA переполнился входной FIFO |
SPI_DMA_INT_ST_REG(i) — флаги прерываний после маски разрешения
Смещение 0x0040, адрес 0x6002 4040, после сброса 0x0000 0000. TRM: регистр 27.20.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| APP1_INT_ST | 20 | RO | 0 | Программное прерывание 1: ставится только записью |
| APP2_INT_ST | 19 | RO | 0 | Программное прерывание 2: ставится только записью |
| MST_TX_AFIFO_REMPTY_ERR_INT_ST | 18 | RO | 0 | Ведущий: опустел асинхронный TX FIFO |
| MST_RX_AFIFO_WFULL_ERR_INT_ST | 17 | RO | 0 | Ведущий: переполнился асинхронный RX FIFO |
| SLV_CMD_ERR_INT_ST | 16 | RO | 0 | Ведомый получил неподдерживаемую команду |
| SEG_MAGIC_ERR_INT_ST | 14 | RO | 0 | Неверное магическое число в конфигурации сегмента |
| DMA_SEG_TRANS_DONE_INT_ST | 13 | RO | 0 | Закончена сегментная передача через GDMA |
| TRANS_DONE_INT_ST | 12 | RO | 0 | Транзакция закончена — главное событие ведущего |
| SLV_WR_BUF_DONE_INT_ST | 11 | RO | 0 | Ведомый закончил запись буфера (команда WRBUF) |
| SLV_RD_BUF_DONE_INT_ST | 10 | RO | 0 | Ведомый закончил чтение буфера (команда RDBUF) |
| SLV_WR_DMA_DONE_INT_ST | 9 | RO | 0 | Ведомый закончил запись через GDMA (команда WRDMA) |
| SLV_RD_DMA_DONE_INT_ST | 8 | RO | 0 | Ведомый закончил чтение через GDMA (команда RDDMA) |
| SLV_CMDA_INT_ST | 7 | RO | 0 | Ведомый принял команду CMDA |
| SLV_CMD9_INT_ST | 6 | RO | 0 | Ведомый принял команду CMD9 |
| SLV_CMD8_INT_ST | 5 | RO | 0 | Ведомый принял команду CMD8 |
| SLV_CMD7_INT_ST | 4 | RO | 0 | Ведомый принял команду CMD7 |
| SLV_EN_QPI_INT_ST | 3 | RO | 0 | Ведомый принял команду входа в режим QPI |
| SLV_EX_QPI_INT_ST | 2 | RO | 0 | Ведомый принял команду выхода из режима QPI |
| DMA_OUTFIFO_EMPTY_ERR_INT_ST | 1 | RO | 0 | Ведомый: при передаче через GDMA опустел выходной FIFO |
| DMA_INFIFO_FULL_ERR_INT_ST | 0 | RO | 0 | Ведомый: при приёме через GDMA переполнился входной FIFO |
SPI_Wn_REG(i) — буфер данных, слово n
16 копий, n = 0…15: смещение 0x0098 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 27.21.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| BUFn | 31:0 | R/W/SS | 0x0000 0000 | Слово n буфера данных: 64 байта на передачу и приём |
SPI_SLAVE_REG(i) — ведомый режим и режимы такта
Смещение 0x00E0, адрес 0x6002 40E0, после сброса 0x0280 0000. TRM: регистр 27.10.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | USR_CONF | SOFT_RESET | SLAVE_MODE | DMA_SEG_MAGIC_VALUE | — | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SLV_WRBUF_BITLEN_EN | SLV_RDBUF_BITLEN_EN | SLV_WRDMA_BITLEN_EN | SLV_RDDMA_BITLEN_EN | — | RSCK_DATA_OUT | CLK_MODE_13 | CLK_MODE | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| USR_CONF | 28 | R/W | 0 | |
| SOFT_RESET | 27 | WT | 0 | Программный сброс части автомата SPI |
| SLAVE_MODE | 26 | R/W | 0 | 1 — ведомый режим, 0 — ведущий |
| DMA_SEG_MAGIC_VALUE | 25:22 | R/W | 0xA | |
| SLV_WRBUF_BITLEN_EN | 11 | R/W | 0 | |
| SLV_RDBUF_BITLEN_EN | 10 | R/W | 0 | |
| SLV_WRDMA_BITLEN_EN | 9 | R/W | 0 | |
| SLV_RDDMA_BITLEN_EN | 8 | R/W | 0 | |
| RSCK_DATA_OUT | 3 | R/W | 0 | |
| CLK_MODE_13 | 2 | R/W | 0 | |
| CLK_MODE | 1:0 | R/W | 0x0 | Режим SCLK в ведомом режиме |
SPI_SLAVE1_REG(i) — ведомый: последние команда и адрес, длина данных
Смещение 0x00E4, адрес 0x6002 40E4, после сброса 0x0000 0000. TRM: регистр 27.11.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| SLV_LAST_ADDR | SLV_LAST_COMMAND | SLV_DATA_BITLEN | |||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SLV_DATA_BITLEN | |||||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SLV_LAST_ADDR | 31:26 | R/W/SS | 0x00 |
| SLV_LAST_COMMAND | 25:18 | R/W/SS | 0x00 |
| SLV_DATA_BITLEN | 17:0 | R/W/SS | 0x00000 |
SPI_CLK_GATE_REG(i) — тактирование модуля и регистров
Смещение 0x00E8, адрес 0x6002 40E8, после сброса 0x0000 0000. TRM: регистр 27.13.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | MST_CLK_SEL | MST_CLK_ACTIVE | CLK_EN | ||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| MST_CLK_SEL | 2 | R/W | 0 |
| MST_CLK_ACTIVE | 1 | R/W | 0 |
| CLK_EN | 0 | R/W | 0 |
SPI_DATE_REG(i) — версия блока: дата ревизии аппаратуры
Смещение 0x00F0, адрес 0x6002 40F0, после сброса 0x0200 7220. TRM: регистр 27.37.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 27:0 | R/W | 0x2007220 |
Частые вопросы
Как запустить передачу через регистры GP-SPI2 ESP32-C3?
Записать данные в W0…W15, длину в битах минус 1 в SPI_MS_DLEN_REG, установить USR_MOSI в SPI_USER_REG, затем записать 1 в SPI_UPDATE и дождаться его сброса, и наконец записать 1 в SPI_USR. Окончание видно по сбросу SPI_USR или по флагу TRANS_DONE в SPI_DMA_INT_RAW_REG.
Какой режим SPI задают CK_IDLE_EDGE и CK_OUT_EDGE?
CK_IDLE_EDGE — уровень SCLK в покое (CPOL), CK_OUT_EDGE вместе с ним определяет фронт выдачи данных (CPHA): режим 0 — оба бита 0, режим 1 — CK_OUT_EDGE = 1, режим 2 — CK_IDLE_EDGE = 1 и CK_OUT_EDGE = 1, режим 3 — CK_IDLE_EDGE = 1, CK_OUT_EDGE = 0.
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 27: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32c3.svd, версия 18 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32c3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32-C3
- Все регистры ESP32-C3Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_BT_SELECT_REG, GPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG, IO_MUX_DATE_REG
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_REG
- I2C — контроллер шины I2CI2C_SCL_LOW_PERIOD_REG, I2C_CTR_REG, I2C_SR_REG, I2C_TO_REG
- LEDC — контроллер ШИМ для светодиодов и не толькоLEDC_LSCHn_CONF0_REG, LEDC_LSCHn_HPOINT_REG, LEDC_LSCHn_DUTY_REG, LEDC_LSCHn_CONF1_REG
- TIMG — группа таймеров: таймер общего назначения и сторожTIMG_T0CONFIG_REG, TIMG_T0LO_REG, TIMG_T0HI_REG, TIMG_T0UPDATE_REG
- RMT — контроллер инфракрасного пульта и импульсных протоколовRMT_CHnDATA_REG, RMT_CHnCONF0_REG, RMT_CHnCONF0_REG, RMT_CHnCONF1_REG
- SYSTIMER — системный таймерSYSTIMER_CONF_REG, SYSTIMER_UNITn_OP_REG, SYSTIMER_UNITn_LOAD_HI_REG, SYSTIMER_UNITn_LOAD_LO_REG
- RTC_CNTL — управление питанием, сном и RTCRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- АЦП — 12-битный SAR АЦП и датчик температурыAPB_SARADC_CTRL_REG, APB_SARADC_CTRL2_REG, APB_SARADC_FILTER_CTRL1_REG, APB_SARADC_SAR_PATT_TABn_REG
- USB Serial/JTAG — встроенный USB-порт: виртуальный COM-порт и JTAGUSB_SERIAL_JTAG_EP1_REG, USB_SERIAL_JTAG_EP1_CONF_REG, USB_SERIAL_JTAG_INT_RAW_REG, USB_SERIAL_JTAG_INT_ST_REG
- eFuse — однократно программируемая память настроек и ключейEFUSE_RD_WR_DIS_REG, EFUSE_RD_REPEAT_DATA0_REG, EFUSE_RD_REPEAT_DATA1_REG, EFUSE_RD_REPEAT_DATA2_REG
- INTERRUPT — матрица прерыванийINTERRUPT_CORE0_PWR_INTR_MAP_REG, INTERRUPT_CORE0_I2C_MST_INT_MAP_REG, INTERRUPT_CORE0_SLCn_INTR_MAP_REG, INTERRUPT_CORE0_APB_CTRL_INTR_MAP_REG