Регистры I2C ESP32-S3
Регистры I2C ESP32-S3: ведущий и ведомый режимы, список из восьми команд, по которому контроллер сам ведёт транзакцию, тайминги SCL и SDA, RAM приёма и передачи по 32 байта, фильтры помех, таймауты и флаги прерываний — для I2C0 и I2C1.
Содержание
- Пример на C
- Регистры блока
- I2C_SCL_LOW_PERIOD_REG
- I2C_CTR_REG
- I2C_SR_REG
- I2C_TO_REG
- I2C_SLAVE_ADDR_REG
- I2C_FIFO_ST_REG
- I2C_FIFO_CONF_REG
- I2C_DATA_REG
- I2C_INT_RAW_REG
- I2C_INT_CLR_REG
- I2C_INT_ENA_REG
- I2C_INT_STATUS_REG
- I2C_SDA_HOLD_REG
- I2C_SDA_SAMPLE_REG
- I2C_SCL_HIGH_PERIOD_REG
- I2C_SCL_START_HOLD_REG
- I2C_SCL_RSTART_SETUP_REG
- I2C_SCL_STOP_HOLD_REG
- I2C_SCL_STOP_SETUP_REG
- I2C_FILTER_CFG_REG
- I2C_CLK_CONF_REG
- I2C_COMDn_REG
- I2C_SCL_ST_TIME_OUT_REG
- I2C_SCL_MAIN_ST_TIME_OUT_REG
- I2C_SCL_SP_CONF_REG
- I2C_SCL_STRETCH_CONF_REG
- I2C_DATE_REG
У ESP32-S3 два контроллера I2C: I2C0 по адресу 0x6001 3000 и I2C1 по адресу 0x6002 7000, набор регистров у них общий. Ведущий не управляет шиной побитно: программа записывает в COMD0…COMD7 команды RSTART, WRITE, READ, STOP и END с числом байтов и настройкой ACK, кладёт адрес и данные в TX RAM и запускает выполнение битом TRANS_START регистра I2C_CTR_REG.
Тайминги задаются в тактах I2C_SCLK. Его источник выбирает бит SCLK_SEL регистра I2C_CLK_CONF_REG (0 — XTAL_CLK 40 МГц, 1 — RC_FAST_CLK 17,5 МГц), делитель по разделу 27.4.1 TRM — SCLK_DIV_NUM + 1 + SCLK_DIV_A / SCLK_DIV_B; I2C_SCLK должен быть быстрее SCL более чем в 20 раз. По TRM t_LOW = (SCL_LOW_PERIOD + 1) тактов, t_HIGH = (SCL_HIGH_PERIOD + 1), а частота f_SCL = f_I2C_SCLK / (SCL_LOW_PERIOD + SCL_HIGH_PERIOD + SCL_WAIT_HIGH_PERIOD + 3).
Настройки режима, таймингов, фильтров и таймаутов — синхронные (таблица 27.4-1 TRM): они попадают в домен I2C_SCLK после записи 1 в бит CONF_UPGATE регистра I2C_CTR_REG. Макросы регистров I2C в ESP-IDF v6.1 для ESP32-S3 не принимают номер контроллера и ссылаются на DR_REG_I2C_BASE, который в заголовках reg_base.h и soc.h не определён: драйвер работает через структуры I2C0 и I2C1, а для макросов базу задают сами.
| Экземпляр | Базовый адрес |
|---|---|
| I2C0 | 0x6001 3000 |
| I2C1 | 0x6002 7000 |
Пример на C
I2C0: состояние шины и сброс флагов (soc/i2c_reg.h). Макросы доступа 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.
// Одно определение базы — один контроллер на файл: I2C0 здесь, для I2C1 — DR_REG_I2C1_EXT_BASE
#ifndef DR_REG_I2C_BASE
#define DR_REG_I2C_BASE DR_REG_I2C_EXT_BASE
#endif
#include "soc/i2c_reg.h"
uint32_t sr = REG_READ(I2C_SR_REG);
bool busy = sr & I2C_BUS_BUSY; // шина занята
uint32_t rx = REG_GET_FIELD(I2C_SR_REG, I2C_RXFIFO_CNT); // байтов в RX FIFO
if (REG_READ(I2C_INT_RAW_REG) & I2C_NACK_INT_RAW) {
// устройство ответило не тем ACK
}
REG_WRITE(I2C_INT_CLR_REG, I2C_TRANS_COMPLETE_INT_CLR | I2C_NACK_INT_CLR);Регистры блока
| Регистр (ESP-IDF) | Смещение | Назначение | После сброса |
|---|---|---|---|
| I2C_SCL_LOW_PERIOD_REG | 0x0000 | Длительность низкого уровня SCL | 0x0000 0000 |
| I2C_CTR_REG | 0x0004 | Режим, запуск, порядок битов, синхронизация настроек | 0x0000 020B |
| I2C_SR_REG | 0x0008 | Состояние шины, FIFO и автоматов | 0x0000 C000 |
| I2C_TO_REG | 0x000C | Таймаут SCL | 0x0000 0010 |
| I2C_SLAVE_ADDR_REG | 0x0010 | Адрес контроллера в ведомом режиме | 0x0000 0000 |
| I2C_FIFO_ST_REG | 0x0014 | Указатели FIFO | 0x0000 0000 |
| I2C_FIFO_CONF_REG | 0x0018 | Пороги, режим и сброс FIFO | 0x0000 408B |
| I2C_DATA_REG | 0x001C | Чтение из RX FIFO и запись в TX FIFO | 0x0000 0000 |
| I2C_INT_RAW_REG | 0x0020 | Необработанные флаги прерываний | 0x0000 0002 |
| I2C_INT_CLR_REG | 0x0024 | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| I2C_INT_ENA_REG | 0x0028 | Разрешение прерываний | 0x0000 0000 |
| I2C_INT_STATUS_REG | 0x002C | Флаги прерываний после маски разрешения | 0x0000 0000 |
| I2C_SDA_HOLD_REG | 0x0030 | Удержание SDA после спада SCL | 0x0000 0000 |
| I2C_SDA_SAMPLE_REG | 0x0034 | Момент выборки SDA после фронта SCL | 0x0000 0000 |
| I2C_SCL_HIGH_PERIOD_REG | 0x0038 | Длительность высокого уровня SCL и ожидание его подъёма | 0x0000 0000 |
| I2C_SCL_START_HOLD_REG | 0x0040 | Удержание условия START | 0x0000 0008 |
| I2C_SCL_RSTART_SETUP_REG | 0x0044 | Установка повторного START | 0x0000 0008 |
| I2C_SCL_STOP_HOLD_REG | 0x0048 | Пауза после условия STOP | 0x0000 0008 |
| I2C_SCL_STOP_SETUP_REG | 0x004C | Установка условия STOP | 0x0000 0008 |
| I2C_FILTER_CFG_REG | 0x0050 | Фильтры помех SCL и SDA | 0x0000 0300 |
| I2C_CLK_CONF_REG | 0x0054 | Источник и делитель такта I2C_SCLK | 0x0020 0000 |
| I2C_COMDn_REG | 0x0058 + n · 0x0004 | Команда n списка команд | 0x0000 0000 |
| I2C_SCL_ST_TIME_OUT_REG | 0x0078 | Таймаут автомата SCL_FSM | 0x0000 0010 |
| I2C_SCL_MAIN_ST_TIME_OUT_REG | 0x007C | Таймаут главного автомата SCL_MAIN_FSM | 0x0000 0010 |
| I2C_SCL_SP_CONF_REG | 0x0080 | Импульсы SCL для освобождения шины, удержание линий | 0x0000 0000 |
| I2C_SCL_STRETCH_CONF_REG | 0x0084 | Растягивание SCL и ACK в ведомом режиме | 0x0000 0000 |
| I2C_DATE_REG | 0x00F8 | Версия блока: дата ревизии аппаратуры | 0x2007 0201 |
Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.
I2C_SCL_LOW_PERIOD_REG — длительность низкого уровня SCL
Смещение 0x0000, после сброса 0x0000 0000. TRM: регистр 27.1.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_LOW_PERIOD | 8:0 | R/W | 0x000 | Низкий уровень SCL ведущего: SCL_LOW_PERIOD + 1 тактов I2C_SCLK |
I2C_CTR_REG — режим, запуск, порядок битов, синхронизация настроек
Смещение 0x0004, после сброса 0x0000 020B. TRM: регистр 27.11.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | ADDR_BROADCASTING_EN | ADDR_10BIT_RW_CHECK_EN | SLV_TX_AUTO_START_EN | CONF_UPGATE | FSM_RST | ARBITRATION_EN | CLK_EN | RX_LSB_FIRST | TX_LSB_FIRST | TRANS_START | MS_MODE | RX_FULL_ACK_LEVEL | SAMPLE_SCL_LEVEL | SCL_FORCE_OUT | SDA_FORCE_OUT |
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| ADDR_BROADCASTING_EN | 14 | R/W | 0 | 1 — отвечать на общий вызов по 7-битному адресу |
| ADDR_10BIT_RW_CHECK_EN | 13 | R/W | 0 | 1 — проверять бит R/W 10-битного адреса по протоколу |
| SLV_TX_AUTO_START_EN | 12 | R/W | 0 | Ведомый: 1 — начинать передачу сразу после совпадения адреса |
| CONF_UPGATE | 11 | WT | 0 | Запись 1 переносит синхронные настройки в домен I2C_SCLK |
| FSM_RST | 10 | WT | 0 | Запись 1 сбрасывает автомат SCL_FSM |
| ARBITRATION_EN | 9 | R/W | 1 | 1 — арбитраж шины |
| CLK_EN | 8 | R/W | 0 | 1 — такт APB регистров всегда включён, 0 — отключается для экономии |
| RX_LSB_FIRST | 7 | R/W | 0 | Приём: 0 — старшим битом вперёд, 1 — младшим |
| TX_LSB_FIRST | 6 | R/W | 0 | Передача: 0 — старшим битом вперёд, 1 — младшим |
| TRANS_START | 5 | WT | 0 | Запись 1 запускает выполнение списка команд с COMD0 |
| MS_MODE | 4 | R/W | 0 | 1 — ведущий, 0 — ведомый |
| RX_FULL_ACK_LEVEL | 3 | R/W | 1 | ACK, который выдаёт ведущий, когда RXFIFO_CNT дошёл до порога |
| SAMPLE_SCL_LEVEL | 2 | R/W | 0 | Выборка SDA: 0 — при высоком SCL, 1 — при низком |
| SCL_FORCE_OUT | 1 | R/W | 1 | Режим выхода SCL: 0 — открытый сток, 1 — прямой выход |
| SDA_FORCE_OUT | 0 | R/W | 1 | Режим выхода SDA: 0 — открытый сток, 1 — прямой выход |
I2C_SR_REG — состояние шины, FIFO и автоматов
Смещение 0x0008, после сброса 0x0000 C000. TRM: регистр 27.19.
В текстах описаний полей TRM у RXFIFO_CNT и TXFIFO_CNT значения переставлены («число байтов к передаче» у RXFIFO_CNT); страница описывает поля по именам, как их читает драйвер ESP-IDF.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SCL_STATE_LAST | — | SCL_MAIN_STATE_LAST | TXFIFO_CNT | — | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| STRETCH_CAUSE | RXFIFO_CNT | — | SLAVE_ADDRESSED | BUS_BUSY | ARB_LOST | — | SLAVE_RW | RESP_REC | |||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_STATE_LAST | 30:28 | RO | 0x0 | Автомат SCL: 0 — покой, 1 — старт, 2 — спад, 3 — низкий, 4 — фронт, 5 — высокий, 6 — стоп |
| SCL_MAIN_STATE_LAST | 26:24 | RO | 0x0 | Главный автомат: 0 — покой, 1 — сдвиг адреса, 2 — ACK адреса, 3 — приём, 4 — передача, 5 — выдача ACK, 6 — ожидание ACK |
| TXFIFO_CNT | 23:18 | RO | 0x00 | Число байтов в TX FIFO |
| STRETCH_CAUSE | 15:14 | RO | 0x3 | Ведомый, причина растягивания SCL: 0 — ведущий начал чтение, 1 — TX FIFO пуст, 2 — RX FIFO полон |
| RXFIFO_CNT | 13:8 | RO | 0x00 | Число байтов в RX FIFO |
| SLAVE_ADDRESSED | 5 | RO | 0 | Ведомый: принят свой адрес |
| BUS_BUSY | 4 | RO | 0 | 1 — шина занята передачей, 0 — свободна |
| ARB_LOST | 3 | RO | 0 | 1 — контроллер потерял управление SCL |
| SLAVE_RW | 1 | RO | 0 | Ведомый: 0 — ведущий пишет, 1 — читает |
| RESP_REC | 0 | RO | 0 | Принятый ACK: 0 — ACK, 1 — NACK |
I2C_TO_REG — таймаут SCL
Смещение 0x000C, после сброса 0x0000 0010. TRM: регистр 27.12.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | TIME_OUT_EN | TIME_OUT_VALUE | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| TIME_OUT_EN | 5 | R/W | 0 | 1 — включить таймаут SCL |
| TIME_OUT_VALUE | 4:0 | R/W | 0x10 | Таймаут: 2 в степени TIME_OUT_VALUE тактов I2C_SCLK |
I2C_SLAVE_ADDR_REG — адрес контроллера в ведомом режиме
Смещение 0x0010, после сброса 0x0000 0000. TRM: регистр 27.13.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| ADDR_10BIT_EN | — | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SLAVE_ADDR | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| ADDR_10BIT_EN | 31 | R/W | 0 | 1 — 10-битная адресация |
| SLAVE_ADDR | 14:0 | R/W | 0x0000 | Адрес контроллера в ведомом режиме |
I2C_FIFO_ST_REG — указатели FIFO
Смещение 0x0014, после сброса 0x0000 0000. TRM: регистр 27.20.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SLAVE_RW_POINT | — | TXFIFO_WADDR | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TXFIFO_WADDR | TXFIFO_RADDR | RXFIFO_WADDR | RXFIFO_RADDR | ||||||||||||
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SLAVE_RW_POINT | 29:22 | RO | 0x00 |
| TXFIFO_WADDR | 19:15 | RO | 0x00 |
| TXFIFO_RADDR | 14:10 | RO | 0x00 |
| RXFIFO_WADDR | 9:5 | RO | 0x00 |
| RXFIFO_RADDR | 4:0 | RO | 0x00 |
I2C_FIFO_CONF_REG — пороги, режим и сброс FIFO
Смещение 0x0018, после сброса 0x0000 408B. TRM: регистр 27.14.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | FIFO_PRT_EN | TX_FIFO_RST | RX_FIFO_RST | FIFO_ADDR_CFG_EN | NONFIFO_EN | TXFIFO_WM_THRHD | RXFIFO_WM_THRHD | ||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| FIFO_PRT_EN | 14 | R/W | 1 | 1 — указатели FIFO в режиме без FIFO и флаги переполнения и порогов |
| TX_FIFO_RST | 13 | R/W | 0 | 1 — сброс TX FIFO |
| RX_FIFO_RST | 12 | R/W | 0 | 1 — сброс RX FIFO |
| FIFO_ADDR_CFG_EN | 11 | R/W | 0 | Ведомый: 1 — байт после адреса задаёт смещение в RAM |
| NONFIFO_EN | 10 | R/W | 0 | 1 — доступ к RAM по APB без FIFO |
| TXFIFO_WM_THRHD | 9:5 | R/W | 0x04 | Порог прерывания TXFIFO_WM |
| RXFIFO_WM_THRHD | 4:0 | R/W | 0x0B | Порог прерывания RXFIFO_WM |
I2C_DATA_REG — чтение из RX FIFO и запись в TX FIFO
Смещение 0x001C, после сброса 0x0000 0000. TRM: регистр 27.21.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| FIFO_RDATA | 7:0 | R/W | 0x00 | Чтение — байт из RX FIFO, запись — байт в TX FIFO |
I2C_INT_RAW_REG — необработанные флаги прерываний
Смещение 0x0020, после сброса 0x0000 0002. TRM: регистр 27.22.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_RAW | 17 | R/SS/WTC | 0 | Принят общий вызов (7-битный адрес 0) |
| SLAVE_STRETCH_INT_RAW | 16 | R/SS/WTC | 0 | Ведомый растягивает SCL по одному из четырёх событий |
| DET_START_INT_RAW | 15 | R/SS/WTC | 0 | Ведущий или ведомый обнаружил условие START |
| SCL_MAIN_ST_TO_INT_RAW | 14 | R/SS/WTC | 0 | Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние |
| SCL_ST_TO_INT_RAW | 13 | R/SS/WTC | 0 | Автомат SCL_FSM слишком долго не меняет состояние |
| RXFIFO_UDF_INT_RAW | 12 | R/SS/WTC | 0 | Чтение по APB из пустого RX FIFO |
| TXFIFO_OVF_INT_RAW | 11 | R/SS/WTC | 0 | Запись по APB в полный TX FIFO |
| NACK_INT_RAW | 10 | R/SS/WTC | 0 | Ведущий получил не тот ACK, что ожидал, или ведомый получил 1 |
| TRANS_START_INT_RAW | 9 | R/SS/WTC | 0 | Контроллер выдал условие START |
| TIME_OUT_INT_RAW | 8 | R/SS/WTC | 0 | SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень |
| TRANS_COMPLETE_INT_RAW | 7 | R/SS/WTC | 0 | Обнаружено условие STOP |
| MST_TXFIFO_UDF_INT_RAW | 6 | R/SS/WTC | 0 | TX FIFO ведущего опустел |
| ARBITRATION_LOST_INT_RAW | 5 | R/SS/WTC | 0 | Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL |
| BYTE_TRANS_DONE_INT_RAW | 4 | R/SS/WTC | 0 | Передан или принят байт |
| END_DETECT_INT_RAW | 3 | R/SS/WTC | 0 | Выполнена команда END |
| RXFIFO_OVF_INT_RAW | 2 | R/SS/WTC | 0 | RX FIFO переполнен |
| TXFIFO_WM_INT_RAW | 1 | R/SS/WTC | 1 | Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
| RXFIFO_WM_INT_RAW | 0 | R/SS/WTC | 0 | Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
I2C_INT_CLR_REG — сброс флагов прерываний записью 1
Смещение 0x0024, после сброса 0x0000 0000. TRM: регистр 27.23.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_CLR | 17 | WT | 0 | Принят общий вызов (7-битный адрес 0) |
| SLAVE_STRETCH_INT_CLR | 16 | WT | 0 | Ведомый растягивает SCL по одному из четырёх событий |
| DET_START_INT_CLR | 15 | WT | 0 | Ведущий или ведомый обнаружил условие START |
| SCL_MAIN_ST_TO_INT_CLR | 14 | WT | 0 | Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние |
| SCL_ST_TO_INT_CLR | 13 | WT | 0 | Автомат SCL_FSM слишком долго не меняет состояние |
| RXFIFO_UDF_INT_CLR | 12 | WT | 0 | Чтение по APB из пустого RX FIFO |
| TXFIFO_OVF_INT_CLR | 11 | WT | 0 | Запись по APB в полный TX FIFO |
| NACK_INT_CLR | 10 | WT | 0 | Ведущий получил не тот ACK, что ожидал, или ведомый получил 1 |
| TRANS_START_INT_CLR | 9 | WT | 0 | Контроллер выдал условие START |
| TIME_OUT_INT_CLR | 8 | WT | 0 | SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень |
| TRANS_COMPLETE_INT_CLR | 7 | WT | 0 | Обнаружено условие STOP |
| MST_TXFIFO_UDF_INT_CLR | 6 | WT | 0 | TX FIFO ведущего опустел |
| ARBITRATION_LOST_INT_CLR | 5 | WT | 0 | Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL |
| BYTE_TRANS_DONE_INT_CLR | 4 | WT | 0 | Передан или принят байт |
| END_DETECT_INT_CLR | 3 | WT | 0 | Выполнена команда END |
| RXFIFO_OVF_INT_CLR | 2 | WT | 0 | RX FIFO переполнен |
| TXFIFO_WM_INT_CLR | 1 | WT | 0 | Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
| RXFIFO_WM_INT_CLR | 0 | WT | 0 | Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
I2C_INT_ENA_REG — разрешение прерываний
Смещение 0x0028, после сброса 0x0000 0000. TRM: регистр 27.24.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_ENA | 17 | R/W | 0 | Принят общий вызов (7-битный адрес 0) |
| SLAVE_STRETCH_INT_ENA | 16 | R/W | 0 | Ведомый растягивает SCL по одному из четырёх событий |
| DET_START_INT_ENA | 15 | R/W | 0 | Ведущий или ведомый обнаружил условие START |
| SCL_MAIN_ST_TO_INT_ENA | 14 | R/W | 0 | Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние |
| SCL_ST_TO_INT_ENA | 13 | R/W | 0 | Автомат SCL_FSM слишком долго не меняет состояние |
| RXFIFO_UDF_INT_ENA | 12 | R/W | 0 | Чтение по APB из пустого RX FIFO |
| TXFIFO_OVF_INT_ENA | 11 | R/W | 0 | Запись по APB в полный TX FIFO |
| NACK_INT_ENA | 10 | R/W | 0 | Ведущий получил не тот ACK, что ожидал, или ведомый получил 1 |
| TRANS_START_INT_ENA | 9 | R/W | 0 | Контроллер выдал условие START |
| TIME_OUT_INT_ENA | 8 | R/W | 0 | SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень |
| TRANS_COMPLETE_INT_ENA | 7 | R/W | 0 | Обнаружено условие STOP |
| MST_TXFIFO_UDF_INT_ENA | 6 | R/W | 0 | TX FIFO ведущего опустел |
| ARBITRATION_LOST_INT_ENA | 5 | R/W | 0 | Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL |
| BYTE_TRANS_DONE_INT_ENA | 4 | R/W | 0 | Передан или принят байт |
| END_DETECT_INT_ENA | 3 | R/W | 0 | Выполнена команда END |
| RXFIFO_OVF_INT_ENA | 2 | R/W | 0 | RX FIFO переполнен |
| TXFIFO_WM_INT_ENA | 1 | R/W | 0 | Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
| RXFIFO_WM_INT_ENA | 0 | R/W | 0 | Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
I2C_INT_STATUS_REG — флаги прерываний после маски разрешения
Смещение 0x002C, после сброса 0x0000 0000. TRM: регистр 27.25.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_ST | 17 | RO | 0 | Принят общий вызов (7-битный адрес 0) |
| SLAVE_STRETCH_INT_ST | 16 | RO | 0 | Ведомый растягивает SCL по одному из четырёх событий |
| DET_START_INT_ST | 15 | RO | 0 | Ведущий или ведомый обнаружил условие START |
| SCL_MAIN_ST_TO_INT_ST | 14 | RO | 0 | Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние |
| SCL_ST_TO_INT_ST | 13 | RO | 0 | Автомат SCL_FSM слишком долго не меняет состояние |
| RXFIFO_UDF_INT_ST | 12 | RO | 0 | Чтение по APB из пустого RX FIFO |
| TXFIFO_OVF_INT_ST | 11 | RO | 0 | Запись по APB в полный TX FIFO |
| NACK_INT_ST | 10 | RO | 0 | Ведущий получил не тот ACK, что ожидал, или ведомый получил 1 |
| TRANS_START_INT_ST | 9 | RO | 0 | Контроллер выдал условие START |
| TIME_OUT_INT_ST | 8 | RO | 0 | SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень |
| TRANS_COMPLETE_INT_ST | 7 | RO | 0 | Обнаружено условие STOP |
| MST_TXFIFO_UDF_INT_ST | 6 | RO | 0 | TX FIFO ведущего опустел |
| ARBITRATION_LOST_INT_ST | 5 | RO | 0 | Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL |
| BYTE_TRANS_DONE_INT_ST | 4 | RO | 0 | Передан или принят байт |
| END_DETECT_INT_ST | 3 | RO | 0 | Выполнена команда END |
| RXFIFO_OVF_INT_ST | 2 | RO | 0 | RX FIFO переполнен |
| TXFIFO_WM_INT_ST | 1 | RO | 0 | Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
| RXFIFO_WM_INT_ST | 0 | RO | 0 | Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1) |
I2C_SDA_HOLD_REG — удержание SDA после спада SCL
Смещение 0x0030, после сброса 0x0000 0000. TRM: регистр 27.2.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SDA_HOLD_TIME | 8:0 | R/W | 0x000 | Удержание данных после спада SCL в тактах I2C_SCLK (t_HD;DAT = значение + 1) |
I2C_SDA_SAMPLE_REG — момент выборки SDA после фронта SCL
Смещение 0x0034, после сброса 0x0000 0000. TRM: регистр 27.3.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SDA_SAMPLE_TIME | 8:0 | R/W | 0x000 | Задержка выборки SDA после фронта SCL в тактах I2C_SCLK |
I2C_SCL_HIGH_PERIOD_REG — длительность высокого уровня SCL и ожидание его подъёма
Смещение 0x0038, после сброса 0x0000 0000. TRM: регистр 27.4.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SCL_WAIT_HIGH_PERIOD | SCL_HIGH_PERIOD | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_WAIT_HIGH_PERIOD | 15:9 | R/W | 0x00 | Ожидание подъёма SCL ведущим в тактах I2C_SCLK (t_r = значение + 1 по TRM) |
| SCL_HIGH_PERIOD | 8:0 | R/W | 0x000 | Высокий уровень SCL ведущего в тактах I2C_SCLK |
I2C_SCL_START_HOLD_REG — удержание условия START
Смещение 0x0040, после сброса 0x0000 0008. TRM: регистр 27.5.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_START_HOLD_TIME | 8:0 | R/W | 0x008 | От спада SDA до спада SCL при START: значение + 1 тактов |
I2C_SCL_RSTART_SETUP_REG — установка повторного START
Смещение 0x0044, после сброса 0x0000 0008. TRM: регистр 27.6.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_RSTART_SETUP_TIME | 8:0 | R/W | 0x008 | Установка повторного START: значение + 1 тактов |
I2C_SCL_STOP_HOLD_REG — пауза после условия STOP
Смещение 0x0048, после сброса 0x0000 0008. TRM: регистр 27.7.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_STOP_HOLD_TIME | 8:0 | R/W | 0x008 | Пауза после STOP (t_BUF): значение + 1 тактов |
I2C_SCL_STOP_SETUP_REG — установка условия STOP
Смещение 0x004C, после сброса 0x0000 0008. TRM: регистр 27.8.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_STOP_SETUP_TIME | 8:0 | R/W | 0x008 | Установка STOP: значение + 1 тактов |
I2C_FILTER_CFG_REG — фильтры помех SCL и SDA
Смещение 0x0050, после сброса 0x0000 0300. TRM: регистр 27.15.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SDA_FILTER_EN | SCL_FILTER_EN | SDA_FILTER_THRES | SCL_FILTER_THRES | |||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SDA_FILTER_EN | 9 | R/W | 1 | 1 — фильтр SDA |
| SCL_FILTER_EN | 8 | R/W | 1 | 1 — фильтр SCL |
| SDA_FILTER_THRES | 7:4 | R/W | 0x0 | Импульсы на SDA короче стольких тактов I2C_SCLK отбрасываются |
| SCL_FILTER_THRES | 3:0 | R/W | 0x0 | Импульсы на SCL короче стольких тактов I2C_SCLK отбрасываются |
I2C_CLK_CONF_REG — источник и делитель такта I2C_SCLK
Смещение 0x0054, после сброса 0x0020 0000. TRM: регистр 27.16.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| — | SCLK_ACTIVE | SCLK_SEL | SCLK_DIV_B | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SCLK_DIV_B | SCLK_DIV_A | SCLK_DIV_NUM | |||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCLK_ACTIVE | 21 | R/W | 1 | 1 — включить такт I2C_SCLK |
| SCLK_SEL | 20 | R/W | 0 | Источник такта: 0 — XTAL_CLK, 1 — RC_FAST_CLK |
| SCLK_DIV_B | 19:14 | R/W | 0x00 | Знаменатель дробной части делителя |
| SCLK_DIV_A | 13:8 | R/W | 0x00 | Числитель дробной части делителя |
| SCLK_DIV_NUM | 7:0 | R/W | 0x00 | Целая часть делителя минус 1: делитель = SCLK_DIV_NUM + 1 + A / B |
I2C_COMDn_REG — команда n списка команд
8 копий, n = 0…7: смещение 0x0058 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 27.26.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| COMMANDn_DONE | — | ||||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | COMMANDn | ||||||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| COMMANDn_DONE | 31 | R/W/SS | 0 | 1 — команда выполнена; перед записью новых команд сбрасывают программно |
| COMMANDn | 13:0 | R/W | 0x0000 | Команда: биты 13:11 — код (1 WRITE, 2 STOP, 3 READ, 4 END, 6 RSTART), бит 10 — выдаваемый ACK, бит 9 — ожидаемый ACK, бит 8 — проверка ACK, биты 7:0 — число байтов |
I2C_SCL_ST_TIME_OUT_REG — таймаут автомата SCL_FSM
Смещение 0x0078, после сброса 0x0000 0010. TRM: регистр 27.9.
TRM расходится сам с собой: в описании поля — «не больше 23», в разделе 27.4.8 — не больше 22, и порог там равен 2 в степени SCL_ST_TO_I2C тактов I2C_SCLK.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_ST_TO_I2C | 4:0 | R/W | 0x10 | Порог таймаута автомата SCL_FSM; по описанию поля — не больше 23 |
I2C_SCL_MAIN_ST_TIME_OUT_REG — таймаут главного автомата SCL_MAIN_FSM
Смещение 0x007C, после сброса 0x0000 0010. TRM: регистр 27.10.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SCL_MAIN_ST_TO_I2C | 4:0 | R/W | 0x10 | Порог таймаута главного автомата SCL_MAIN_FSM |
I2C_SCL_SP_CONF_REG — импульсы SCL для освобождения шины, удержание линий
Смещение 0x0080, после сброса 0x0000 0000. TRM: регистр 27.17.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SDA_PD_EN | SCL_PD_EN | SCL_RST_SLV_NUM | SCL_RST_SLV_EN | |||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SDA_PD_EN | 7 | R/W | 0 | 1 — отключить выход SDA; вместе с SDA_FORCE_OUT = 1 держит SDA в нуле |
| SCL_PD_EN | 6 | R/W | 0 | 1 — отключить выход SCL; вместе с SCL_FORCE_OUT = 1 держит SCL в нуле |
| SCL_RST_SLV_NUM | 5:1 | R/W | 0x00 | Число импульсов SCL для освобождения шины |
| SCL_RST_SLV_EN | 0 | R/W/SC | 0 | Запись 1 в покое ведущего выдаёт SCL_RST_SLV_NUM импульсов SCL |
I2C_SCL_STRETCH_CONF_REG — растягивание SCL и ACK в ведомом режиме
Смещение 0x0084, после сброса 0x0000 0000. TRM: регистр 27.18.
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| — | SLAVE_BYTE_ACK_LVL | SLAVE_BYTE_ACK_CTL_EN | SLAVE_SCL_STRETCH_CLR | SLAVE_SCL_STRETCH_EN | STRETCH_PROTECT_NUM | ||||||||||
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| SLAVE_BYTE_ACK_LVL | 13 | R/W | 0 | Уровень ACK, который выдаёт ведомый при SLAVE_BYTE_ACK_CTL_EN |
| SLAVE_BYTE_ACK_CTL_EN | 12 | R/W | 0 | 1 — ведомый сам задаёт уровень ACK |
| SLAVE_SCL_STRETCH_CLR | 11 | WT | 0 | Запись 1 снимает растягивание SCL |
| SLAVE_SCL_STRETCH_EN | 10 | R/W | 0 | 1 — ведомый растягивает SCL; причина — в STRETCH_CAUSE |
| STRETCH_PROTECT_NUM | 9:0 | R/W | 0x000 | Задержка отпускания SCL после растягивания |
I2C_DATE_REG — версия блока: дата ревизии аппаратуры
Смещение 0x00F8, после сброса 0x2007 0201. TRM: регистр 27.34.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 31:0 | R/W | 0x2007 0201 |
Частые вопросы
Как устроен регистр команды I2C_COMDn ESP32-S3?
По полям ESP-IDF (i2c_ll.h, тип i2c_ll_hw_cmd_t): биты 7:0 — число байтов 1…255, бит 8 — ack_check_en, бит 9 — ожидаемый ACK, бит 10 — выдаваемый ACK, биты 13:11 — код операции (1 — WRITE, 2 — STOP, 3 — READ, 4 — END, 6 — RSTART по разделу 27.4.9 TRM), бит 31 — флаг выполнения. Последовательность обязана кончаться командой STOP или END.
Почему частота SCL I2C ESP32-S3 отличается от расчёта по TRM?
По TRM время высокого уровня — SCL_HIGH_PERIOD + 1 такт плюс ожидание подъёма линии SCL_WAIT_HIGH_PERIOD. Драйвер ESP-IDF (i2c_ll_master_set_bus_timing) вычитает единицу из SCL_LOW_PERIOD, SDA_HOLD_TIME и SDA_SAMPLE_TIME, а SCL_HIGH_PERIOD и SCL_WAIT_HIGH_PERIOD пишет без вычитания: по комментарию в коде так частота точнее совпадает с измеренной. На фактическую частоту влияет и время нарастания фронта при выбранных подтяжках.
Источники
- Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 27: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32s3.svd, версия 21 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32s3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32-S3
- Все регистры ESP32-S3Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_BT_SELECT_REG, GPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_REG
- SPI — контроллеры SPI общего назначения GP-SPI2 и GP-SPI3SPI_CMD_REG, SPI_ADDR_REG, SPI_CTRL_REG, SPI_CLOCK_REG
- LEDC — контроллер ШИМ для светодиодов и не толькоLEDC_LSCHn_CONF0_REG, LEDC_LSCHn_HPOINT_REG, LEDC_LSCHn_DUTY_REG, LEDC_LSCHn_CONF1_REG
- TIMG — группа таймеров: таймеры общего назначения и сторожTIMG_TnCONFIG_REG, TIMG_TnLO_REG, TIMG_TnHI_REG, TIMG_TnUPDATE_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 — управление питанием, сном и RTC-доменомRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- APB_SARADC — цифровой контроллер АЦПAPB_SARADC_CTRL_REG, APB_SARADC_CTRL2_REG, APB_SARADC_FILTER_CTRL1_REG, APB_SARADC_SAR1_PATT_TABn_REG
- SENS — RTC-контроллеры АЦП, датчиков касания и температурыSENS_SAR_READER1_CTRL_REG, SENS_SAR_MEAS1_CTRL2_REG, SENS_SAR_MEAS1_MUX_REG, SENS_SAR_ATTENn_REG
- USB Serial/JTAG — встроенный USB-переходник на последовательный порт и 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_MAC_INTR_MAP_REG, INTERRUPT_CORE0_MAC_NMI_MAP_REG, INTERRUPT_CORE0_PWR_INTR_MAP_REG, INTERRUPT_CORE0_BB_INT_MAP_REG