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

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

Регистры GP-SPI2 и GP-SPI3 ESP32-S3: фазы транзакции, частота SCLK, режимы 0–3, буфер на 64 байта, режимы по 1, 2, 4 и — только у SPI2 — 8 линиям, ведомый режим и прерывания передачи.

SPI0 и SPI1 ESP32-S3 обслуживают флеш-память и PSRAM; для внешних устройств есть GP-SPI2 по адресу 0x6002 4000 и GP-SPI3 по адресу 0x6002 5000. Набор регистров у них общий, макросы ESP-IDF принимают номер контроллера 2 или 3: SPI_CMD_REG(2). Поля восьмилинейного режима (FREAD_OCT, FWRITE_OCT, OPI_MODE и другие), выводы CS3…CS5 и сегментная передача с буфером CONF есть только у SPI2; у SPI3 на их месте зарезервированные биты.

Транзакция описывается регистрами SPI_USER_REG (какие фазы есть), SPI_USER1_REG и SPI_USER2_REG (длины адреса, паузы и команды минус 1), SPI_MS_DLEN_REG (длина данных в битах минус 1). Частота ведущего — f_SCLK = f_mst / ((CLKCNT_N + 1) · (CLKDIV_PRE + 1)), где f_mst — такт модуля: PLL_F80M_CLK или XTAL_CLK по биту MST_CLK_SEL регистра SPI_CLK_GATE_REG; бит CLK_EQU_SYSCLK = 1 выдаёт SCLK без деления. Ведущий — до 80 МГц, ведомый — до 60 МГц.

Регистры настройки переходят из домена APB в домен такта SPI после записи 1 в бит UPDATE регистра SPI_CMD_REG (только в ведущем режиме); транзакцию запускает бит USR, он сбрасывается сам по окончании.

ЭкземплярБазовый адрес
SPI20x6002 4000
SPI30x6002 5000

Пример на 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Порядок битов, полярности линий, режимы по 2, 4 и 8 линиям0x003C 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, полярности, DDR и уровень 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 0003
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_DMA_INT_SET_REG(i)0x0044Программная установка флагов прерываний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Версия блока: дата ревизии аппаратуры0x0210 1190

Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.

SPI_CMD_REG(i) — запуск транзакции и перенос настроек

Смещение 0x0000, после сброса 0x0000 0000. TRM: регистр 30.1.

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

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

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

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

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

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

31302928272625242322212019181716
—WR_BIT_ORDERRD_BIT_ORDER—WP_POLHOLD_POLD_POLQ_POL—FREAD_OCT
1514131211109876543210
FREAD_QUADFREAD_DUAL—FCMD_OCTFCMD_QUADFCMD_DUALFADDR_OCTFADDR_QUADFADDR_DUAL—DUMMY_OUT—
ПолеБитыДоступСбросНазначение
WR_BIT_ORDER26:25R/W0x0Порядок битов при передаче: 0 — старший первым, 1 — младший
RD_BIT_ORDER24:23R/W0x0Порядок битов при приёме: 0 — старший первым, 1 — младший
WP_POL21R/W1Уровень на линии WP в покое
HOLD_POL20R/W1Уровень на линии HOLD в покое
D_POL19R/W1Полярность линии MOSI: 1 — высокий, 0 — низкий
Q_POL18R/W1Полярность линии MISO: 1 — высокий, 0 — низкий
FREAD_OCT16R/W0Только SPI2: приём данных по 8 линиям
FREAD_QUAD15R/W0Приём данных по 4 линиям
FREAD_DUAL14R/W0Приём данных по 2 линиям
FCMD_OCT10R/W0Только SPI2: команда по 8 линиям
FCMD_QUAD9R/W0Команда по 4 линиям
FCMD_DUAL8R/W0Команда по 2 линиям
FADDR_OCT7R/W0Только SPI2: адрес по 8 линиям
FADDR_QUAD6R/W0Адрес по 4 линиям
FADDR_DUAL5R/W0Адрес по 2 линиям
DUMMY_OUT3R/W0SPI2: 1 — выдавать сигналы шины во время паузы DUMMY

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

Смещение 0x000C, после сброса 0x8000 3043. TRM: регистр 30.13.

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

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

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

ПолеБитыДоступСбросНазначение
USR_COMMAND31R/W1В транзакции есть фаза команды
USR_ADDR30R/W0В транзакции есть фаза адреса
USR_DUMMY29R/W0В транзакции есть пауза DUMMY
USR_MISO28R/W0В транзакции есть приём данных
USR_MOSI27R/W0В транзакции есть передача данных
USR_DUMMY_IDLE26R/W0Во время паузы DUMMY такт SCLK не выдаётся
USR_MOSI_HIGHPART25R/W0Данные для передачи берутся из W8…W15
USR_MISO_HIGHPART24R/W0Принятые данные кладутся в W8…W15
SIO17R/W0Трёхпроводный режим: одна линия данных на приём и передачу
USR_CONF_NXT15R/W0Только SPI2: после этой транзакции следует ещё одна сегментная
FWRITE_OCT14R/W0Только SPI2: передача данных по 8 линиям
FWRITE_QUAD13R/W0Передача данных по 4 линиям
FWRITE_DUAL12R/W0Передача данных по 2 линиям
CK_OUT_EDGE9R/W0Фронт выдачи данных; вместе с CK_IDLE_EDGE задаёт режим SPI ведущего
RSCK_I_EDGE8R/W0Ведомый: вместе с TSCK_I_EDGE задаёт режим SPI
CS_SETUP7R/W11 — выдавать CS в состоянии подготовки PREP
CS_HOLD6R/W11 — держать CS в состоянии DONE
TSCK_I_EDGE5R/W0Ведомый: вместе с RSCK_I_EDGE задаёт режим SPI
OPI_MODE4R/W0Только SPI2: режим OPI — все фазы по 8 линиям
QPI_MODE3R/W/SS/SC0Режим QPI — все фазы по 4 линиям
DOUTDIN0R/W0Полный дуплекс: передача и приём одновременно

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

Смещение 0x0014, после сброса 0xB841 0007. TRM: регистр 30.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 после данных в тактах SCLK (вместе с CS_HOLD)
CS_SETUP_TIME21:17R/W0x00Длина состояния PREP в тактах SCLK минус 1 (вместе с CS_SETUP)
MST_WFULL_ERR_END_EN16R/W11 — прервать передачу при переполнении RX AFIFO ведущего
USR_DUMMY_CYCLELEN7:0R/W0x07Длина паузы DUMMY в тактах SCLK минус 1

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

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

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

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

Смещение 0x001C, после сброса 0x0000 0000. TRM: регистр 30.7.

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

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

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

У этого регистра в TRM два рисунка: 30.8 для SPI2 и 30.9 для SPI3. Здесь показан вариант SPI2; у SPI3 нет полей DQS_IDLE_EDGE, CMD_DTR_EN, ADDR_DTR_EN, DATA_DTR_EN, CLK_DATA_DTR_EN и CS3…CS5_DIS, а MASTER_CS_POL занимает биты 9:7. В текстах описаний TRM диапазоны MASTER_CS_POL (0…2 у SPI2, 0…5 у SPI3) переставлены относительно рисунков; страница следует рисункам.

ПолеБитыДоступСбросНазначение
QUAD_DIN_PIN_SWAP31R/W01 — поменять местами входы FSPID и FSPIQ, FSPIWP и FSPIHD
CS_KEEP_ACTIVE30R/W01 — держать CS активным
CK_IDLE_EDGE29R/W0Уровень SCLK в покое: 1 — высокий, 0 — низкий
DQS_IDLE_EDGE24R/W0Только SPI2: уровень SPI_DQS в покое
SLAVE_CS_POL23R/W0Ведомый: 1 — инвертировать вход CS
CMD_DTR_EN19R/W0Только SPI2: фаза команды в режиме DDR
ADDR_DTR_EN18R/W0Только SPI2: фаза адреса в режиме DDR
DATA_DTR_EN17R/W0Только SPI2: фазы данных в режиме DDR
CLK_DATA_DTR_EN16R/W0Только SPI2: DDR для такта, данных и SPI_DQS, а не только для DQS
MASTER_CS_POL12:7R/W0x00Полярность выходов CS ведущего, бит на линию: 0 — активный низкий. У SPI2 — биты 12:7 (CS0…CS5), у SPI3 — биты 9:7 (CS0…CS2)
CK_DIS6R/W01 — не выдавать SCLK
CS5_DIS5R/W1Только SPI2: 1 — не использовать CS5
CS4_DIS4R/W1Только SPI2: 1 — не использовать CS4
CS3_DIS3R/W1Только SPI2: 1 — не использовать CS3
CS2_DIS2R/W11 — не использовать CS2
CS1_DIS1R/W11 — не использовать CS1
CS0_DIS0R/W01 — не использовать CS0

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

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

31302928272625242322212019181716
—TIMING_HCLK_ACTIVE
1514131211109876543210
DIN7_MODEDIN6_MODEDIN5_MODEDIN4_MODEDIN3_MODEDIN2_MODEDIN1_MODEDIN0_MODE
ПолеБитыДоступСбросНазначение
TIMING_HCLK_ACTIVE16R/W0Включить такт компенсации задержек clk_hclk 160 МГц
DIN7_MODE15:14R/W0x0Только SPI2: режим задержки входа D7
DIN6_MODE13:12R/W0x0Только SPI2: режим задержки входа D6
DIN5_MODE11:10R/W0x0Только SPI2: режим задержки входа D5
DIN4_MODE9:8R/W0x0Только SPI2: режим задержки входа D4
DIN3_MODE7:6R/W0x0Режим задержки входа D3, значения как у DIN0_MODE
DIN2_MODE5:4R/W0x0Режим задержки входа D2, значения как у DIN0_MODE
DIN1_MODE3:2R/W0x0Режим задержки входа D1, значения как у DIN0_MODE
DIN0_MODE1:0R/W0x0Вход D0: 0 — без задержки, 1 — задержка по спаду SCLK на DIN0_NUM + 1 тактов, 2 и 3 — по такту clk_hclk на DIN0_NUM + 1 и ещё такт SCLK

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

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

1514131211109876543210
DIN7_NUMDIN6_NUMDIN5_NUMDIN4_NUMDIN3_NUMDIN2_NUMDIN1_NUMDIN0_NUM
ПолеБитыДоступСбросНазначение
DIN7_NUM15:14R/W0x0Только SPI2: задержка входа D7
DIN6_NUM13:12R/W0x0Только SPI2: задержка входа D6
DIN5_NUM11:10R/W0x0Только SPI2: задержка входа D5
DIN4_NUM9:8R/W0x0Только SPI2: задержка входа D4
DIN3_NUM7:6R/W0x0Задержка входа D3 по режиму DIN3_MODE
DIN2_NUM5:4R/W0x0Задержка входа D2 по режиму DIN2_MODE
DIN1_NUM3:2R/W0x0Задержка входа D1 по режиму DIN1_MODE
DIN0_NUM1:0R/W0x0Задержка входа D0 по режиму DIN0_MODE

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

Смещение 0x002C, после сброса 0x0000 0000. TRM: регистр 30.17.

1514131211109876543210
—D_DQS_MODEDOUT7_MODEDOUT6_MODEDOUT5_MODEDOUT4_MODEDOUT3_MODEDOUT2_MODEDOUT1_MODEDOUT0_MODE
ПолеБитыДоступСбросНазначение
D_DQS_MODE8R/W0Только SPI2: режим задержки выхода DQS
DOUT7_MODE7R/W0Только SPI2: режим задержки выхода D7
DOUT6_MODE6R/W0Только SPI2: режим задержки выхода D6
DOUT5_MODE5R/W0Только SPI2: режим задержки выхода D5
DOUT4_MODE4R/W0Только SPI2: режим задержки выхода D4
DOUT3_MODE3R/W0Режим задержки выхода D3
DOUT2_MODE2R/W0Режим задержки выхода D2
DOUT1_MODE1R/W0Режим задержки выхода D1
DOUT0_MODE0R/W0Выход D0: 0 — без задержки, 1 — задержка по спаду SCLK на такт

SPI_DMA_CONF_REG(i) — работа с GDMA, сегментная передача, сброс FIFO

Смещение 0x0030, после сброса 0x0000 0003. TRM: регистр 30.10.

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_INFIFO_FULLDMA_OUTFIFO_EMPTY
ПолеБитыДоступСбросНазначение
DMA_AFIFO_RST31WT0Запись 1 сбрасывает dma_tx_afifo (передача ведомого через DMA)
BUF_AFIFO_RST30WT0Запись 1 сбрасывает buf_tx_afifo (передача из буфера W0…W15)
RX_AFIFO_RST29WT0Запись 1 сбрасывает spi_rx_afifo (приём)
DMA_TX_ENA28R/W01 — передача через GDMA
DMA_RX_ENA27R/W01 — приём через GDMA
RX_EOF_EN21R/W01 — флаг GDMA_IN_SUC_EOF ставится, когда принято MS_DATA_BITLEN + 1 бит; 0 — по событию TRANS_DONE или DMA_SEG_TRANS_DONE
SLV_TX_SEG_TRANS_CLR_EN20R/W0Ведомый: что делать, если буфер передачи GDMA короче данных
SLV_RX_SEG_TRANS_CLR_EN19R/W0Ведомый: что делать, если буфер приёма GDMA короче данных
DMA_SLV_SEG_TRANS_EN18R/W01 — сегментная передача через GDMA в полудуплексе ведомого
DMA_INFIFO_FULL1RO11 — приёмный FIFO GDMA не готов принимать
DMA_OUTFIFO_EMPTY0RO11 — передающий FIFO GDMA не готов передавать

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

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

Флаг SEG_MAGIC_ERR (бит 14) есть только у SPI2. Бит 15 (SLV_BUF_ADDR_ERR в SVD) в TRM зарезервирован и на странице не показан.

ПолеБитыДоступСбросНазначение
APP1_INT_ENA20R/W0Пользовательское прерывание 1: ставится только записью в APP1_INT_SET
APP2_INT_ENA19R/W0Пользовательское прерывание 2: ставится только записью в APP2_INT_SET
MST_TX_AFIFO_REMPTY_ERR_INT_ENA18R/W0Ведущий: чтение из пустого TX AFIFO
MST_RX_AFIFO_WFULL_ERR_INT_ENA17R/W0Ведущий: запись в полный RX AFIFO
SLV_CMD_ERR_INT_ENA16R/W0Ведомый принял неподдерживаемую команду
SEG_MAGIC_ERR_INT_ENA14R/W0Только SPI2: ошибка магического числа в буфере CONF сегментной передачи
DMA_SEG_TRANS_DONE_INT_ENA13R/W0Ведомый: закончена сегментная передача End_SEG_TRANS
TRANS_DONE_INT_ENA12R/W0Передача по шине закончена — в ведущем и ведомом режимах
SLV_WR_BUF_DONE_INT_ENA11R/W0Ведомый: закончена передача Wr_BUF
SLV_RD_BUF_DONE_INT_ENA10R/W0Ведомый: закончена передача Rd_BUF
SLV_WR_DMA_DONE_INT_ENA9R/W0Ведомый: закончена передача Wr_DMA
SLV_RD_DMA_DONE_INT_ENA8R/W0Ведомый: закончена передача Rd_DMA
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Ведомый принял команду En_QPI
SLV_EX_QPI_INT_ENA2R/W0Ведомый принял команду Ex_QPI
DMA_OUTFIFO_EMPTY_ERR_INT_ENA1R/W0Буфер передачи GDMA короче фактически переданных данных
DMA_INFIFO_FULL_ERR_INT_ENA0R/W0Буфер приёма GDMA короче фактически переданных данных

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

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

ПолеБитыДоступСбросНазначение
APP1_INT_CLR20WT0Пользовательское прерывание 1: ставится только записью в APP1_INT_SET
APP2_INT_CLR19WT0Пользовательское прерывание 2: ставится только записью в APP2_INT_SET
MST_TX_AFIFO_REMPTY_ERR_INT_CLR18WT0Ведущий: чтение из пустого TX AFIFO
MST_RX_AFIFO_WFULL_ERR_INT_CLR17WT0Ведущий: запись в полный RX AFIFO
SLV_CMD_ERR_INT_CLR16WT0Ведомый принял неподдерживаемую команду
SEG_MAGIC_ERR_INT_CLR14WT0Только SPI2: ошибка магического числа в буфере CONF сегментной передачи
DMA_SEG_TRANS_DONE_INT_CLR13WT0Ведомый: закончена сегментная передача End_SEG_TRANS
TRANS_DONE_INT_CLR12WT0Передача по шине закончена — в ведущем и ведомом режимах
SLV_WR_BUF_DONE_INT_CLR11WT0Ведомый: закончена передача Wr_BUF
SLV_RD_BUF_DONE_INT_CLR10WT0Ведомый: закончена передача Rd_BUF
SLV_WR_DMA_DONE_INT_CLR9WT0Ведомый: закончена передача Wr_DMA
SLV_RD_DMA_DONE_INT_CLR8WT0Ведомый: закончена передача Rd_DMA
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Ведомый принял команду En_QPI
SLV_EX_QPI_INT_CLR2WT0Ведомый принял команду Ex_QPI
DMA_OUTFIFO_EMPTY_ERR_INT_CLR1WT0Буфер передачи GDMA короче фактически переданных данных
DMA_INFIFO_FULL_ERR_INT_CLR0WT0Буфер приёма GDMA короче фактически переданных данных

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

Смещение 0x003C, после сброса 0x0000 0000. TRM: регистр 30.20.

ПолеБитыДоступСбросНазначение
APP1_INT_RAW20R/WTC/SS0Пользовательское прерывание 1: ставится только записью в APP1_INT_SET
APP2_INT_RAW19R/WTC/SS0Пользовательское прерывание 2: ставится только записью в APP2_INT_SET
MST_TX_AFIFO_REMPTY_ERR_INT_RAW18R/WTC/SS0Ведущий: чтение из пустого TX AFIFO
MST_RX_AFIFO_WFULL_ERR_INT_RAW17R/WTC/SS0Ведущий: запись в полный RX AFIFO
SLV_CMD_ERR_INT_RAW16R/WTC/SS0Ведомый принял неподдерживаемую команду
SEG_MAGIC_ERR_INT_RAW14R/WTC/SS0Только SPI2: ошибка магического числа в буфере CONF сегментной передачи
DMA_SEG_TRANS_DONE_INT_RAW13R/WTC/SS0Ведомый: закончена сегментная передача End_SEG_TRANS
TRANS_DONE_INT_RAW12R/WTC/SS0Передача по шине закончена — в ведущем и ведомом режимах
SLV_WR_BUF_DONE_INT_RAW11R/WTC/SS0Ведомый: закончена передача Wr_BUF
SLV_RD_BUF_DONE_INT_RAW10R/WTC/SS0Ведомый: закончена передача Rd_BUF
SLV_WR_DMA_DONE_INT_RAW9R/WTC/SS0Ведомый: закончена передача Wr_DMA
SLV_RD_DMA_DONE_INT_RAW8R/WTC/SS0Ведомый: закончена передача Rd_DMA
SLV_CMDA_INT_RAW7R/WTC/SS0Ведомый принял команду CMDA
SLV_CMD9_INT_RAW6R/WTC/SS0Ведомый принял команду CMD9
SLV_CMD8_INT_RAW5R/WTC/SS0Ведомый принял команду CMD8
SLV_CMD7_INT_RAW4R/WTC/SS0Ведомый принял команду CMD7
SLV_EN_QPI_INT_RAW3R/WTC/SS0Ведомый принял команду En_QPI
SLV_EX_QPI_INT_RAW2R/WTC/SS0Ведомый принял команду Ex_QPI
DMA_OUTFIFO_EMPTY_ERR_INT_RAW1R/WTC/SS0Буфер передачи GDMA короче фактически переданных данных
DMA_INFIFO_FULL_ERR_INT_RAW0R/WTC/SS0Буфер приёма GDMA короче фактически переданных данных

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

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

ПолеБитыДоступСбросНазначение
APP1_INT_ST20RO0Пользовательское прерывание 1: ставится только записью в APP1_INT_SET
APP2_INT_ST19RO0Пользовательское прерывание 2: ставится только записью в APP2_INT_SET
MST_TX_AFIFO_REMPTY_ERR_INT_ST18RO0Ведущий: чтение из пустого TX AFIFO
MST_RX_AFIFO_WFULL_ERR_INT_ST17RO0Ведущий: запись в полный RX AFIFO
SLV_CMD_ERR_INT_ST16RO0Ведомый принял неподдерживаемую команду
SEG_MAGIC_ERR_INT_ST14RO0Только SPI2: ошибка магического числа в буфере CONF сегментной передачи
DMA_SEG_TRANS_DONE_INT_ST13RO0Ведомый: закончена сегментная передача End_SEG_TRANS
TRANS_DONE_INT_ST12RO0Передача по шине закончена — в ведущем и ведомом режимах
SLV_WR_BUF_DONE_INT_ST11RO0Ведомый: закончена передача Wr_BUF
SLV_RD_BUF_DONE_INT_ST10RO0Ведомый: закончена передача Rd_BUF
SLV_WR_DMA_DONE_INT_ST9RO0Ведомый: закончена передача Wr_DMA
SLV_RD_DMA_DONE_INT_ST8RO0Ведомый: закончена передача Rd_DMA
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Ведомый принял команду En_QPI
SLV_EX_QPI_INT_ST2RO0Ведомый принял команду Ex_QPI
DMA_OUTFIFO_EMPTY_ERR_INT_ST1RO0Буфер передачи GDMA короче фактически переданных данных
DMA_INFIFO_FULL_ERR_INT_ST0RO0Буфер приёма GDMA короче фактически переданных данных

SPI_DMA_INT_SET_REG(i) — программная установка флагов прерываний

Смещение 0x0044, после сброса 0x0000 0000. TRM: регистр 30.22.

ПолеБитыДоступСбросНазначение
APP1_INT_SET20WT0Пользовательское прерывание 1: ставится только записью в APP1_INT_SET
APP2_INT_SET19WT0Пользовательское прерывание 2: ставится только записью в APP2_INT_SET
MST_TX_AFIFO_REMPTY_ERR_INT_SET18WT0Ведущий: чтение из пустого TX AFIFO
MST_RX_AFIFO_WFULL_ERR_INT_SET17WT0Ведущий: запись в полный RX AFIFO
SLV_CMD_ERR_INT_SET16WT0Ведомый принял неподдерживаемую команду
SEG_MAGIC_ERR_INT_SET14WT0Только SPI2: ошибка магического числа в буфере CONF сегментной передачи
DMA_SEG_TRANS_DONE_INT_SET13WT0Ведомый: закончена сегментная передача End_SEG_TRANS
TRANS_DONE_INT_SET12WT0Передача по шине закончена — в ведущем и ведомом режимах
SLV_WR_BUF_DONE_INT_SET11WT0Ведомый: закончена передача Wr_BUF
SLV_RD_BUF_DONE_INT_SET10WT0Ведомый: закончена передача Rd_BUF
SLV_WR_DMA_DONE_INT_SET9WT0Ведомый: закончена передача Wr_DMA
SLV_RD_DMA_DONE_INT_SET8WT0Ведомый: закончена передача Rd_DMA
SLV_CMDA_INT_SET7WT0Ведомый принял команду CMDA
SLV_CMD9_INT_SET6WT0Ведомый принял команду CMD9
SLV_CMD8_INT_SET5WT0Ведомый принял команду CMD8
SLV_CMD7_INT_SET4WT0Ведомый принял команду CMD7
SLV_EN_QPI_INT_SET3WT0Ведомый принял команду En_QPI
SLV_EX_QPI_INT_SET2WT0Ведомый принял команду Ex_QPI
DMA_OUTFIFO_EMPTY_ERR_INT_SET1WT0Буфер передачи GDMA короче фактически переданных данных
DMA_INFIFO_FULL_ERR_INT_SET0WT0Буфер приёма GDMA короче фактически переданных данных

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

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

ПолеБитыДоступСбросНазначение
BUFn31:0R/W/SS0x0000 0000Слово n буфера: 64 байта, байт 0 — биты 7:0 регистра W0

SPI_SLAVE_REG(i) — ведомый режим, режимы такта, программный сброс

Смещение 0x00E0, после сброса 0x0280 0000. TRM: регистр 30.11.

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Только SPI2: 1 — запустить состояние CONF сегментной передачи
SOFT_RESET27WT0Запись 1 сбрасывает линии такта, CS и данных
SLAVE_MODE26R/W01 — ведомый режим, 0 — ведущий
DMA_SEG_MAGIC_VALUE25:22R/W0xAТолько SPI2: магическое число таблицы BM сегментной передачи
SLV_WRBUF_BITLEN_EN11R/W0Ведомый: хранить длину передачи Wr_BUF в SLV_DATA_BITLEN
SLV_RDBUF_BITLEN_EN10R/W0Ведомый: хранить длину передачи Rd_BUF в SLV_DATA_BITLEN
SLV_WRDMA_BITLEN_EN9R/W0Ведомый: хранить длину передачи Wr_DMA в SLV_DATA_BITLEN
SLV_RDDMA_BITLEN_EN8R/W0Ведомый: хранить длину передачи Rd_DMA в SLV_DATA_BITLEN
RSCK_DATA_OUT3R/W0Ведомый: 1 — выдавать данные по фронту RSCK, 0 — по фронту TSCK
CLK_MODE_132R/W0Ведомый: 1 — режимы 1 и 3, 0 — режимы 0 и 2
CLK_MODE1:0R/W0x0SCLK после снятия CS: 0 — выключен, 1 — ещё 1 такт, 2 — ещё 2 такта, 3 — всегда включён

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

Смещение 0x00E4, после сброса 0x0000 0000. TRM: регистр 30.12.

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, после сброса 0x0000 0000. TRM: регистр 30.14.

1514131211109876543210
—MST_CLK_SELMST_CLK_ACTIVECLK_EN
ПолеБитыДоступСбросНазначение
MST_CLK_SEL2R/W0Такт модуля ведущего: 1 — PLL_F80M_CLK, 0 — XTAL_CLK
MST_CLK_ACTIVE1R/W01 — включить такт модуля
CLK_EN0R/W01 — включить такт регистров

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

Смещение 0x00F0, после сброса 0x0210 1190. TRM: регистр 30.39.

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

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

Как запустить передачу через регистры GP-SPI2 ESP32-S3?

Записать данные в 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. Так же поступает драйвер ESP-IDF (spi_ll.h): update = 1, ожидание, затем usr = 1.

Какой режим SPI задают CK_IDLE_EDGE и CK_OUT_EDGE ESP32-S3?

По таблице 30.7-1 TRM для ведущего: режим 0 — CK_IDLE_EDGE = 0, CK_OUT_EDGE = 0; режим 1 — 0 и 1; режим 2 — 1 и 1; режим 3 — 1 и 0. CK_IDLE_EDGE лежит в SPI_MISC_REG и задаёт уровень SCLK в покое, CK_OUT_EDGE — в SPI_USER_REG. Ведомый настраивается иначе: битами TSCK_I_EDGE, RSCK_I_EDGE и CLK_MODE_13 (таблица 30.7-2).

Источники

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

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

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

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