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

Регистры SPI ESP32-C3

Регистры GP-SPI2 ESP32-C3 — единственного SPI для внешних устройств: фазы транзакции (команда, адрес, пауза, данные), частота SCLK, режимы 0–3, буфер данных на 64 байта, ведомый режим и прерывания GDMA.

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 того же регистра, он сбрасывается сам по окончании.

ЭкземплярБазовый адрес
SPI20x6002 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 и Quad0x003C 0000
SPI_CLOCK_REG(i)0x000CДелитель частоты SCLK0x8000 3043
SPI_USER_REG(i)0x0010Фазы транзакции, режим линий данных, фронты0x8000 00C0
SPI_USER1_REG(i)0x0014Длины адреса и паузы, задержки CS0xB841 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 и сброс FIFO0x0000 0000
SPI_DMA_INT_ENA_REG(i)0x0034Разрешение прерываний0x0000 0000
SPI_DMA_INT_CLR_REG(i)0x0038Сброс флагов прерываний записью 10x0000 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Буфер данных, слово n0x0000 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.

31302928272625242322212019181716
—USRUPDATE—CONF_BITLEN
1514131211109876543210
CONF_BITLEN
ПолеБитыДоступСбросНазначение
USR24R/W/SC0Запись 1 запускает транзакцию; бит сбрасывается по её окончании
UPDATE23WT0Запись 1 переносит настройки в домен тактов SPI; сбрасывается сам
CONF_BITLEN17:0R/W0x00000Длина фазы CONF в тактах SPI (сегментная передача)

SPI_ADDR_REG(i) — значение фазы адреса

Смещение 0x0004, адрес 0x6002 4004, после сброса 0x0000 0000. TRM: регистр 27.2.

ПолеБитыДоступСбросНазначение
USR_ADDR_VALUE31:0R/W0x0000 0000Адрес, который передаётся в фазе адреса

SPI_CTRL_REG(i) — порядок битов, полярности линий, режимы Dual и Quad

Смещение 0x0008, адрес 0x6002 4008, после сброса 0x003C 0000. TRM: регистр 27.6.

31302928272625242322212019181716
—WR_BIT_ORDERRD_BIT_ORDER—WP_POLHOLD_POLD_POLQ_POL—
1514131211109876543210
FREAD_QUADFREAD_DUAL—FCMD_QUADFCMD_DUAL—FADDR_QUADFADDR_DUAL—DUMMY_OUT—
ПолеБитыДоступСбросНазначение
WR_BIT_ORDER26R/W0Порядок битов при передаче: 0 — старший первым, 1 — младший
RD_BIT_ORDER25R/W0Порядок битов при приёме: 0 — старший первым, 1 — младший
WP_POL21R/W1
HOLD_POL20R/W1
D_POL19R/W1
Q_POL18R/W1
FREAD_QUAD15R/W0
FREAD_DUAL14R/W0
FCMD_QUAD9R/W0
FCMD_DUAL8R/W0
FADDR_QUAD6R/W0
FADDR_DUAL5R/W0
DUMMY_OUT3R/W0Выдавать уровни на линии во время паузы

SPI_CLOCK_REG(i) — делитель частоты SCLK

Смещение 0x000C, адрес 0x6002 400C, после сброса 0x8000 3043. TRM: регистр 27.12.

31302928272625242322212019181716
CLK_EQU_SYSCLK—CLKDIV_PRECLKCNT_N
1514131211109876543210
CLKCNT_NCLKCNT_HCLKCNT_L
ПолеБитыДоступСбросНазначение
CLK_EQU_SYSCLK31R/W11 — SCLK равен такту модуля без деления
CLKDIV_PRE21:18R/W0x0Предделитель минус 1
CLKCNT_N17:12R/W0x03Делитель минус 1: период SCLK — CLKCNT_N + 1 тактов
CLKCNT_H11:6R/W0x01Длительность высокого уровня SCLK; обычно (CLKCNT_N + 1) / 2 − 1
CLKCNT_L5:0R/W0x03Длительность низкого уровня; записывают равной CLKCNT_N

SPI_USER_REG(i) — фазы транзакции, режим линий данных, фронты

Смещение 0x0010, адрес 0x6002 4010, после сброса 0x8000 00C0. TRM: регистр 27.3.

ПолеБитыДоступСбросНазначение
USR_COMMAND31R/W1В транзакции есть фаза команды
USR_ADDR30R/W0В транзакции есть фаза адреса
USR_DUMMY29R/W0В транзакции есть пауза (dummy)
USR_MISO28R/W0В транзакции есть приём данных
USR_MOSI27R/W0В транзакции есть передача данных
USR_DUMMY_IDLE26R/W0
USR_MOSI_HIGHPART25R/W0
USR_MISO_HIGHPART24R/W0
SIO17R/W0Трёхпроводный режим: одна линия данных на приём и передачу
USR_CONF_NXT15R/W0
FWRITE_QUAD13R/W0
FWRITE_DUAL12R/W0
CK_OUT_EDGE9R/W0Фронт выдачи данных; вместе с CK_IDLE_EDGE задаёт режим SPI
RSCK_I_EDGE8R/W0
CS_SETUP7R/W1Задержка между CS и первым фронтом SCLK
CS_HOLD6R/W1Удержание CS после последнего фронта SCLK
TSCK_I_EDGE5R/W0
QPI_MODE3R/W/SS/SC0Режим QPI: все фазы по четырём линиям
DOUTDIN0R/W0Полный дуплекс: передача и приём одновременно

SPI_USER1_REG(i) — длины адреса и паузы, задержки CS

Смещение 0x0014, адрес 0x6002 4014, после сброса 0xB841 0007. TRM: регистр 27.4.

31302928272625242322212019181716
USR_ADDR_BITLENCS_HOLD_TIMECS_SETUP_TIMEMST_WFULL_ERR_END_EN
1514131211109876543210
—USR_DUMMY_CYCLELEN
ПолеБитыДоступСбросНазначение
USR_ADDR_BITLEN31:27R/W0x17Длина адреса в битах минус 1
CS_HOLD_TIME26:22R/W0x01
CS_SETUP_TIME21:17R/W0x00
MST_WFULL_ERR_END_EN16R/W1
USR_DUMMY_CYCLELEN7:0R/W0x07Длина паузы в тактах SCLK минус 1

SPI_USER2_REG(i) — длина и значение команды

Смещение 0x0018, адрес 0x6002 4018, после сброса 0x7800 0000. TRM: регистр 27.5.

31302928272625242322212019181716
USR_COMMAND_BITLENMST_REMPTY_ERR_END_EN—
1514131211109876543210
USR_COMMAND_VALUE
ПолеБитыДоступСбросНазначение
USR_COMMAND_BITLEN31:28R/W0x7Длина команды в битах минус 1
MST_REMPTY_ERR_END_EN27R/W1
USR_COMMAND_VALUE15:0R/W0x0000Значение команды

SPI_MS_DLEN_REG(i) — длина данных транзакции в битах

Смещение 0x001C, адрес 0x6002 401C, после сброса 0x0000 0000. TRM: регистр 27.7.

ПолеБитыДоступСбросНазначение
MS_DATA_BITLEN17:0R/W0x00000Длина данных ведущего в битах минус 1

SPI_MISC_REG(i) — выводы CS, полярность и уровень SCLK в покое

Смещение 0x0020, адрес 0x6002 4020, после сброса 0x0000 003E. TRM: регистр 27.8.

31302928272625242322212019181716
QUAD_DIN_PIN_SWAPCS_KEEP_ACTIVECK_IDLE_EDGE—SLAVE_CS_POL—
1514131211109876543210
—MASTER_CS_POLCK_DISCS5_DISCS4_DISCS3_DISCS2_DISCS1_DISCS0_DIS
ПолеБитыДоступСбросНазначение
QUAD_DIN_PIN_SWAP31R/W0
CS_KEEP_ACTIVE30R/W0Держать CS активным после транзакции
CK_IDLE_EDGE29R/W0Уровень SCLK в покое (CPOL)
SLAVE_CS_POL23R/W0
MASTER_CS_POL12:7R/W0x00Полярность выходов CS ведущего, бит на линию
CK_DIS6R/W0Не выдавать SCLK
CS5_DIS5R/W1
CS4_DIS4R/W1
CS3_DIS3R/W1
CS2_DIS2R/W1
CS1_DIS1R/W1
CS0_DIS0R/W0Не выдавать CS0

SPI_DIN_MODE_REG(i) — задержка выборки входных линий

Смещение 0x0024, адрес 0x6002 4024, после сброса 0x0000 0000. TRM: регистр 27.14.

31302928272625242322212019181716
—TIMING_HCLK_ACTIVE
1514131211109876543210
—DIN3_MODEDIN2_MODEDIN1_MODEDIN0_MODE
ПолеБитыДоступСброс
TIMING_HCLK_ACTIVE16R/W0
DIN3_MODE7:6R/W0x0
DIN2_MODE5:4R/W0x0
DIN1_MODE3:2R/W0x0
DIN0_MODE1:0R/W0x0

SPI_DIN_NUM_REG(i) — число тактов задержки входных линий

Смещение 0x0028, адрес 0x6002 4028, после сброса 0x0000 0000. TRM: регистр 27.15.

1514131211109876543210
—DIN3_NUMDIN2_NUMDIN1_NUMDIN0_NUM
ПолеБитыДоступСброс
DIN3_NUM7:6R/W0x0
DIN2_NUM5:4R/W0x0
DIN1_NUM3:2R/W0x0
DIN0_NUM1:0R/W0x0

SPI_DOUT_MODE_REG(i) — задержка выходных линий

Смещение 0x002C, адрес 0x6002 402C, после сброса 0x0000 0000. TRM: регистр 27.16.

1514131211109876543210
—DOUT3_MODEDOUT2_MODEDOUT1_MODEDOUT0_MODE
ПолеБитыДоступСброс
DOUT3_MODE3R/W0
DOUT2_MODE2R/W0
DOUT1_MODE1R/W0
DOUT0_MODE0R/W0

SPI_DMA_CONF_REG(i) — работа с GDMA и сброс FIFO

Смещение 0x0030, адрес 0x6002 4030, после сброса 0x0000 0000. TRM: регистр 27.9.

31302928272625242322212019181716
DMA_AFIFO_RSTBUF_AFIFO_RSTRX_AFIFO_RSTDMA_TX_ENADMA_RX_ENA—RX_EOF_ENSLV_TX_SEG_TRANS_CLR_ENSLV_RX_SEG_TRANS_CLR_ENDMA_SLV_SEG_TRANS_EN—
1514131211109876543210
—
ПолеБитыДоступСброс
DMA_AFIFO_RST31WT0
BUF_AFIFO_RST30WT0
RX_AFIFO_RST29WT0
DMA_TX_ENA28R/W0
DMA_RX_ENA27R/W0
RX_EOF_EN21R/W0
SLV_TX_SEG_TRANS_CLR_EN20R/W0
SLV_RX_SEG_TRANS_CLR_EN19R/W0
DMA_SLV_SEG_TRANS_EN18R/W0

SPI_DMA_INT_ENA_REG(i) — разрешение прерываний

Смещение 0x0034, адрес 0x6002 4034, после сброса 0x0000 0000. TRM: регистр 27.17.

ПолеБитыДоступСбросНазначение
APP1_INT_ENA20R/W0Программное прерывание 1: ставится только записью
APP2_INT_ENA19R/W0Программное прерывание 2: ставится только записью
MST_TX_AFIFO_REMPTY_ERR_INT_ENA18R/W0Ведущий: опустел асинхронный TX FIFO
MST_RX_AFIFO_WFULL_ERR_INT_ENA17R/W0Ведущий: переполнился асинхронный RX FIFO
SLV_CMD_ERR_INT_ENA16R/W0Ведомый получил неподдерживаемую команду
SEG_MAGIC_ERR_INT_ENA14R/W0Неверное магическое число в конфигурации сегмента
DMA_SEG_TRANS_DONE_INT_ENA13R/W0Закончена сегментная передача через GDMA
TRANS_DONE_INT_ENA12R/W0Транзакция закончена — главное событие ведущего
SLV_WR_BUF_DONE_INT_ENA11R/W0Ведомый закончил запись буфера (команда WRBUF)
SLV_RD_BUF_DONE_INT_ENA10R/W0Ведомый закончил чтение буфера (команда RDBUF)
SLV_WR_DMA_DONE_INT_ENA9R/W0Ведомый закончил запись через GDMA (команда WRDMA)
SLV_RD_DMA_DONE_INT_ENA8R/W0Ведомый закончил чтение через GDMA (команда RDDMA)
SLV_CMDA_INT_ENA7R/W0Ведомый принял команду CMDA
SLV_CMD9_INT_ENA6R/W0Ведомый принял команду CMD9
SLV_CMD8_INT_ENA5R/W0Ведомый принял команду CMD8
SLV_CMD7_INT_ENA4R/W0Ведомый принял команду CMD7
SLV_EN_QPI_INT_ENA3R/W0Ведомый принял команду входа в режим QPI
SLV_EX_QPI_INT_ENA2R/W0Ведомый принял команду выхода из режима QPI
DMA_OUTFIFO_EMPTY_ERR_INT_ENA1R/W0Ведомый: при передаче через GDMA опустел выходной FIFO
DMA_INFIFO_FULL_ERR_INT_ENA0R/W0Ведомый: при приёме через GDMA переполнился входной FIFO

SPI_DMA_INT_CLR_REG(i) — сброс флагов прерываний записью 1

Смещение 0x0038, адрес 0x6002 4038, после сброса 0x0000 0000. TRM: регистр 27.18.

ПолеБитыДоступСбросНазначение
APP1_INT_CLR20WT0Программное прерывание 1: ставится только записью
APP2_INT_CLR19WT0Программное прерывание 2: ставится только записью
MST_TX_AFIFO_REMPTY_ERR_INT_CLR18WT0Ведущий: опустел асинхронный TX FIFO
MST_RX_AFIFO_WFULL_ERR_INT_CLR17WT0Ведущий: переполнился асинхронный RX FIFO
SLV_CMD_ERR_INT_CLR16WT0Ведомый получил неподдерживаемую команду
SEG_MAGIC_ERR_INT_CLR14WT0Неверное магическое число в конфигурации сегмента
DMA_SEG_TRANS_DONE_INT_CLR13WT0Закончена сегментная передача через GDMA
TRANS_DONE_INT_CLR12WT0Транзакция закончена — главное событие ведущего
SLV_WR_BUF_DONE_INT_CLR11WT0Ведомый закончил запись буфера (команда WRBUF)
SLV_RD_BUF_DONE_INT_CLR10WT0Ведомый закончил чтение буфера (команда RDBUF)
SLV_WR_DMA_DONE_INT_CLR9WT0Ведомый закончил запись через GDMA (команда WRDMA)
SLV_RD_DMA_DONE_INT_CLR8WT0Ведомый закончил чтение через GDMA (команда RDDMA)
SLV_CMDA_INT_CLR7WT0Ведомый принял команду CMDA
SLV_CMD9_INT_CLR6WT0Ведомый принял команду CMD9
SLV_CMD8_INT_CLR5WT0Ведомый принял команду CMD8
SLV_CMD7_INT_CLR4WT0Ведомый принял команду CMD7
SLV_EN_QPI_INT_CLR3WT0Ведомый принял команду входа в режим QPI
SLV_EX_QPI_INT_CLR2WT0Ведомый принял команду выхода из режима QPI
DMA_OUTFIFO_EMPTY_ERR_INT_CLR1WT0Ведомый: при передаче через GDMA опустел выходной FIFO
DMA_INFIFO_FULL_ERR_INT_CLR0WT0Ведомый: при приёме через GDMA переполнился входной FIFO

SPI_DMA_INT_RAW_REG(i) — необработанные флаги прерываний

Смещение 0x003C, адрес 0x6002 403C, после сброса 0x0000 0000. TRM: регистр 27.19.

ПолеБитыДоступСбросНазначение
APP1_INT_RAW20R/W/WTC0Программное прерывание 1: ставится только записью
APP2_INT_RAW19R/W/WTC0Программное прерывание 2: ставится только записью
MST_TX_AFIFO_REMPTY_ERR_INT_RAW18R/W/WTC/SS0Ведущий: опустел асинхронный TX FIFO
MST_RX_AFIFO_WFULL_ERR_INT_RAW17R/W/WTC/SS0Ведущий: переполнился асинхронный RX FIFO
SLV_CMD_ERR_INT_RAW16R/W/WTC/SS0Ведомый получил неподдерживаемую команду
SEG_MAGIC_ERR_INT_RAW14R/W/WTC/SS0Неверное магическое число в конфигурации сегмента
DMA_SEG_TRANS_DONE_INT_RAW13R/W/WTC/SS0Закончена сегментная передача через GDMA
TRANS_DONE_INT_RAW12R/W/WTC/SS0Транзакция закончена — главное событие ведущего
SLV_WR_BUF_DONE_INT_RAW11R/W/WTC/SS0Ведомый закончил запись буфера (команда WRBUF)
SLV_RD_BUF_DONE_INT_RAW10R/W/WTC/SS0Ведомый закончил чтение буфера (команда RDBUF)
SLV_WR_DMA_DONE_INT_RAW9R/W/WTC/SS0Ведомый закончил запись через GDMA (команда WRDMA)
SLV_RD_DMA_DONE_INT_RAW8R/W/WTC/SS0Ведомый закончил чтение через GDMA (команда RDDMA)
SLV_CMDA_INT_RAW7R/W/WTC/SS0Ведомый принял команду CMDA
SLV_CMD9_INT_RAW6R/W/WTC/SS0Ведомый принял команду CMD9
SLV_CMD8_INT_RAW5R/W/WTC/SS0Ведомый принял команду CMD8
SLV_CMD7_INT_RAW4R/W/WTC/SS0Ведомый принял команду CMD7
SLV_EN_QPI_INT_RAW3R/W/WTC/SS0Ведомый принял команду входа в режим QPI
SLV_EX_QPI_INT_RAW2R/W/WTC/SS0Ведомый принял команду выхода из режима QPI
DMA_OUTFIFO_EMPTY_ERR_INT_RAW1R/W/WTC/SS0Ведомый: при передаче через GDMA опустел выходной FIFO
DMA_INFIFO_FULL_ERR_INT_RAW0R/W/WTC/SS0Ведомый: при приёме через GDMA переполнился входной FIFO

SPI_DMA_INT_ST_REG(i) — флаги прерываний после маски разрешения

Смещение 0x0040, адрес 0x6002 4040, после сброса 0x0000 0000. TRM: регистр 27.20.

ПолеБитыДоступСбросНазначение
APP1_INT_ST20RO0Программное прерывание 1: ставится только записью
APP2_INT_ST19RO0Программное прерывание 2: ставится только записью
MST_TX_AFIFO_REMPTY_ERR_INT_ST18RO0Ведущий: опустел асинхронный TX FIFO
MST_RX_AFIFO_WFULL_ERR_INT_ST17RO0Ведущий: переполнился асинхронный RX FIFO
SLV_CMD_ERR_INT_ST16RO0Ведомый получил неподдерживаемую команду
SEG_MAGIC_ERR_INT_ST14RO0Неверное магическое число в конфигурации сегмента
DMA_SEG_TRANS_DONE_INT_ST13RO0Закончена сегментная передача через GDMA
TRANS_DONE_INT_ST12RO0Транзакция закончена — главное событие ведущего
SLV_WR_BUF_DONE_INT_ST11RO0Ведомый закончил запись буфера (команда WRBUF)
SLV_RD_BUF_DONE_INT_ST10RO0Ведомый закончил чтение буфера (команда RDBUF)
SLV_WR_DMA_DONE_INT_ST9RO0Ведомый закончил запись через GDMA (команда WRDMA)
SLV_RD_DMA_DONE_INT_ST8RO0Ведомый закончил чтение через GDMA (команда RDDMA)
SLV_CMDA_INT_ST7RO0Ведомый принял команду CMDA
SLV_CMD9_INT_ST6RO0Ведомый принял команду CMD9
SLV_CMD8_INT_ST5RO0Ведомый принял команду CMD8
SLV_CMD7_INT_ST4RO0Ведомый принял команду CMD7
SLV_EN_QPI_INT_ST3RO0Ведомый принял команду входа в режим QPI
SLV_EX_QPI_INT_ST2RO0Ведомый принял команду выхода из режима QPI
DMA_OUTFIFO_EMPTY_ERR_INT_ST1RO0Ведомый: при передаче через GDMA опустел выходной FIFO
DMA_INFIFO_FULL_ERR_INT_ST0RO0Ведомый: при приёме через GDMA переполнился входной FIFO

SPI_Wn_REG(i) — буфер данных, слово n

16 копий, n = 0…15: смещение 0x0098 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 27.21.

ПолеБитыДоступСбросНазначение
BUFn31:0R/W/SS0x0000 0000Слово n буфера данных: 64 байта на передачу и приём

SPI_SLAVE_REG(i) — ведомый режим и режимы такта

Смещение 0x00E0, адрес 0x6002 40E0, после сброса 0x0280 0000. TRM: регистр 27.10.

31302928272625242322212019181716
—USR_CONFSOFT_RESETSLAVE_MODEDMA_SEG_MAGIC_VALUE—
1514131211109876543210
—SLV_WRBUF_BITLEN_ENSLV_RDBUF_BITLEN_ENSLV_WRDMA_BITLEN_ENSLV_RDDMA_BITLEN_EN—RSCK_DATA_OUTCLK_MODE_13CLK_MODE
ПолеБитыДоступСбросНазначение
USR_CONF28R/W0
SOFT_RESET27WT0Программный сброс части автомата SPI
SLAVE_MODE26R/W01 — ведомый режим, 0 — ведущий
DMA_SEG_MAGIC_VALUE25:22R/W0xA
SLV_WRBUF_BITLEN_EN11R/W0
SLV_RDBUF_BITLEN_EN10R/W0
SLV_WRDMA_BITLEN_EN9R/W0
SLV_RDDMA_BITLEN_EN8R/W0
RSCK_DATA_OUT3R/W0
CLK_MODE_132R/W0
CLK_MODE1:0R/W0x0Режим SCLK в ведомом режиме

SPI_SLAVE1_REG(i) — ведомый: последние команда и адрес, длина данных

Смещение 0x00E4, адрес 0x6002 40E4, после сброса 0x0000 0000. TRM: регистр 27.11.

31302928272625242322212019181716
SLV_LAST_ADDRSLV_LAST_COMMANDSLV_DATA_BITLEN
1514131211109876543210
SLV_DATA_BITLEN
ПолеБитыДоступСброс
SLV_LAST_ADDR31:26R/W/SS0x00
SLV_LAST_COMMAND25:18R/W/SS0x00
SLV_DATA_BITLEN17:0R/W/SS0x00000

SPI_CLK_GATE_REG(i) — тактирование модуля и регистров

Смещение 0x00E8, адрес 0x6002 40E8, после сброса 0x0000 0000. TRM: регистр 27.13.

1514131211109876543210
—MST_CLK_SELMST_CLK_ACTIVECLK_EN
ПолеБитыДоступСброс
MST_CLK_SEL2R/W0
MST_CLK_ACTIVE1R/W0
CLK_EN0R/W0

SPI_DATE_REG(i) — версия блока: дата ревизии аппаратуры

Смещение 0x00F0, адрес 0x6002 40F0, после сброса 0x0200 7220. TRM: регистр 27.37.

ПолеБитыДоступСброс
DATE27:0R/W0x2007220

Частые вопросы

Как запустить передачу через регистры 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.

Источники

  1. Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 27: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
  2. Espressif. SVD svd/esp32c3.svd, версия 18 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
  3. Espressif. ESP-IDF v6.1: заголовки components/soc/esp32c3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT

Нашли ошибку в регистрах?

Другие регистры ESP32-C3

Статьи, инструменты и термины