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

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

Регистры I2C ESP32-S3: ведущий и ведомый режимы, список из восьми команд, по которому контроллер сам ведёт транзакцию, тайминги SCL и SDA, RAM приёма и передачи по 32 байта, фильтры помех, таймауты и флаги прерываний — для I2C0 и I2C1.

У 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, а для макросов базу задают сами.

ЭкземплярБазовый адрес
I2C00x6001 3000
I2C10x6002 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_REG0x0000Длительность низкого уровня SCL0x0000 0000
I2C_CTR_REG0x0004Режим, запуск, порядок битов, синхронизация настроек0x0000 020B
I2C_SR_REG0x0008Состояние шины, FIFO и автоматов0x0000 C000
I2C_TO_REG0x000CТаймаут SCL0x0000 0010
I2C_SLAVE_ADDR_REG0x0010Адрес контроллера в ведомом режиме0x0000 0000
I2C_FIFO_ST_REG0x0014Указатели FIFO0x0000 0000
I2C_FIFO_CONF_REG0x0018Пороги, режим и сброс FIFO0x0000 408B
I2C_DATA_REG0x001CЧтение из RX FIFO и запись в TX FIFO0x0000 0000
I2C_INT_RAW_REG0x0020Необработанные флаги прерываний0x0000 0002
I2C_INT_CLR_REG0x0024Сброс флагов прерываний записью 10x0000 0000
I2C_INT_ENA_REG0x0028Разрешение прерываний0x0000 0000
I2C_INT_STATUS_REG0x002CФлаги прерываний после маски разрешения0x0000 0000
I2C_SDA_HOLD_REG0x0030Удержание SDA после спада SCL0x0000 0000
I2C_SDA_SAMPLE_REG0x0034Момент выборки SDA после фронта SCL0x0000 0000
I2C_SCL_HIGH_PERIOD_REG0x0038Длительность высокого уровня SCL и ожидание его подъёма0x0000 0000
I2C_SCL_START_HOLD_REG0x0040Удержание условия START0x0000 0008
I2C_SCL_RSTART_SETUP_REG0x0044Установка повторного START0x0000 0008
I2C_SCL_STOP_HOLD_REG0x0048Пауза после условия STOP0x0000 0008
I2C_SCL_STOP_SETUP_REG0x004CУстановка условия STOP0x0000 0008
I2C_FILTER_CFG_REG0x0050Фильтры помех SCL и SDA0x0000 0300
I2C_CLK_CONF_REG0x0054Источник и делитель такта I2C_SCLK0x0020 0000
I2C_COMDn_REG0x0058 + n · 0x0004Команда n списка команд0x0000 0000
I2C_SCL_ST_TIME_OUT_REG0x0078Таймаут автомата SCL_FSM0x0000 0010
I2C_SCL_MAIN_ST_TIME_OUT_REG0x007CТаймаут главного автомата SCL_MAIN_FSM0x0000 0010
I2C_SCL_SP_CONF_REG0x0080Импульсы SCL для освобождения шины, удержание линий0x0000 0000
I2C_SCL_STRETCH_CONF_REG0x0084Растягивание SCL и ACK в ведомом режиме0x0000 0000
I2C_DATE_REG0x00F8Версия блока: дата ревизии аппаратуры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_PERIOD8:0R/W0x000Низкий уровень SCL ведущего: SCL_LOW_PERIOD + 1 тактов I2C_SCLK

I2C_CTR_REG — режим, запуск, порядок битов, синхронизация настроек

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

1514131211109876543210
—ADDR_BROADCASTING_ENADDR_10BIT_RW_CHECK_ENSLV_TX_AUTO_START_ENCONF_UPGATEFSM_RSTARBITRATION_ENCLK_ENRX_LSB_FIRSTTX_LSB_FIRSTTRANS_STARTMS_MODERX_FULL_ACK_LEVELSAMPLE_SCL_LEVELSCL_FORCE_OUTSDA_FORCE_OUT
ПолеБитыДоступСбросНазначение
ADDR_BROADCASTING_EN14R/W01 — отвечать на общий вызов по 7-битному адресу
ADDR_10BIT_RW_CHECK_EN13R/W01 — проверять бит R/W 10-битного адреса по протоколу
SLV_TX_AUTO_START_EN12R/W0Ведомый: 1 — начинать передачу сразу после совпадения адреса
CONF_UPGATE11WT0Запись 1 переносит синхронные настройки в домен I2C_SCLK
FSM_RST10WT0Запись 1 сбрасывает автомат SCL_FSM
ARBITRATION_EN9R/W11 — арбитраж шины
CLK_EN8R/W01 — такт APB регистров всегда включён, 0 — отключается для экономии
RX_LSB_FIRST7R/W0Приём: 0 — старшим битом вперёд, 1 — младшим
TX_LSB_FIRST6R/W0Передача: 0 — старшим битом вперёд, 1 — младшим
TRANS_START5WT0Запись 1 запускает выполнение списка команд с COMD0
MS_MODE4R/W01 — ведущий, 0 — ведомый
RX_FULL_ACK_LEVEL3R/W1ACK, который выдаёт ведущий, когда RXFIFO_CNT дошёл до порога
SAMPLE_SCL_LEVEL2R/W0Выборка SDA: 0 — при высоком SCL, 1 — при низком
SCL_FORCE_OUT1R/W1Режим выхода SCL: 0 — открытый сток, 1 — прямой выход
SDA_FORCE_OUT0R/W1Режим выхода SDA: 0 — открытый сток, 1 — прямой выход

I2C_SR_REG — состояние шины, FIFO и автоматов

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

В текстах описаний полей TRM у RXFIFO_CNT и TXFIFO_CNT значения переставлены («число байтов к передаче» у RXFIFO_CNT); страница описывает поля по именам, как их читает драйвер ESP-IDF.

31302928272625242322212019181716
—SCL_STATE_LAST—SCL_MAIN_STATE_LASTTXFIFO_CNT—
1514131211109876543210
STRETCH_CAUSERXFIFO_CNT—SLAVE_ADDRESSEDBUS_BUSYARB_LOST—SLAVE_RWRESP_REC
ПолеБитыДоступСбросНазначение
SCL_STATE_LAST30:28RO0x0Автомат SCL: 0 — покой, 1 — старт, 2 — спад, 3 — низкий, 4 — фронт, 5 — высокий, 6 — стоп
SCL_MAIN_STATE_LAST26:24RO0x0Главный автомат: 0 — покой, 1 — сдвиг адреса, 2 — ACK адреса, 3 — приём, 4 — передача, 5 — выдача ACK, 6 — ожидание ACK
TXFIFO_CNT23:18RO0x00Число байтов в TX FIFO
STRETCH_CAUSE15:14RO0x3Ведомый, причина растягивания SCL: 0 — ведущий начал чтение, 1 — TX FIFO пуст, 2 — RX FIFO полон
RXFIFO_CNT13:8RO0x00Число байтов в RX FIFO
SLAVE_ADDRESSED5RO0Ведомый: принят свой адрес
BUS_BUSY4RO01 — шина занята передачей, 0 — свободна
ARB_LOST3RO01 — контроллер потерял управление SCL
SLAVE_RW1RO0Ведомый: 0 — ведущий пишет, 1 — читает
RESP_REC0RO0Принятый ACK: 0 — ACK, 1 — NACK

I2C_TO_REG — таймаут SCL

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

1514131211109876543210
—TIME_OUT_ENTIME_OUT_VALUE
ПолеБитыДоступСбросНазначение
TIME_OUT_EN5R/W01 — включить таймаут SCL
TIME_OUT_VALUE4:0R/W0x10Таймаут: 2 в степени TIME_OUT_VALUE тактов I2C_SCLK

I2C_SLAVE_ADDR_REG — адрес контроллера в ведомом режиме

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

31302928272625242322212019181716
ADDR_10BIT_EN—
1514131211109876543210
—SLAVE_ADDR
ПолеБитыДоступСбросНазначение
ADDR_10BIT_EN31R/W01 — 10-битная адресация
SLAVE_ADDR14:0R/W0x0000Адрес контроллера в ведомом режиме

I2C_FIFO_ST_REG — указатели FIFO

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

31302928272625242322212019181716
—SLAVE_RW_POINT—TXFIFO_WADDR
1514131211109876543210
TXFIFO_WADDRTXFIFO_RADDRRXFIFO_WADDRRXFIFO_RADDR
ПолеБитыДоступСброс
SLAVE_RW_POINT29:22RO0x00
TXFIFO_WADDR19:15RO0x00
TXFIFO_RADDR14:10RO0x00
RXFIFO_WADDR9:5RO0x00
RXFIFO_RADDR4:0RO0x00

I2C_FIFO_CONF_REG — пороги, режим и сброс FIFO

Смещение 0x0018, после сброса 0x0000 408B. TRM: регистр 27.14.

1514131211109876543210
—FIFO_PRT_ENTX_FIFO_RSTRX_FIFO_RSTFIFO_ADDR_CFG_ENNONFIFO_ENTXFIFO_WM_THRHDRXFIFO_WM_THRHD
ПолеБитыДоступСбросНазначение
FIFO_PRT_EN14R/W11 — указатели FIFO в режиме без FIFO и флаги переполнения и порогов
TX_FIFO_RST13R/W01 — сброс TX FIFO
RX_FIFO_RST12R/W01 — сброс RX FIFO
FIFO_ADDR_CFG_EN11R/W0Ведомый: 1 — байт после адреса задаёт смещение в RAM
NONFIFO_EN10R/W01 — доступ к RAM по APB без FIFO
TXFIFO_WM_THRHD9:5R/W0x04Порог прерывания TXFIFO_WM
RXFIFO_WM_THRHD4:0R/W0x0BПорог прерывания RXFIFO_WM

I2C_DATA_REG — чтение из RX FIFO и запись в TX FIFO

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

ПолеБитыДоступСбросНазначение
FIFO_RDATA7:0R/W0x00Чтение — байт из RX FIFO, запись — байт в TX FIFO

I2C_INT_RAW_REG — необработанные флаги прерываний

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_RAW17R/SS/WTC0Принят общий вызов (7-битный адрес 0)
SLAVE_STRETCH_INT_RAW16R/SS/WTC0Ведомый растягивает SCL по одному из четырёх событий
DET_START_INT_RAW15R/SS/WTC0Ведущий или ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_RAW14R/SS/WTC0Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние
SCL_ST_TO_INT_RAW13R/SS/WTC0Автомат SCL_FSM слишком долго не меняет состояние
RXFIFO_UDF_INT_RAW12R/SS/WTC0Чтение по APB из пустого RX FIFO
TXFIFO_OVF_INT_RAW11R/SS/WTC0Запись по APB в полный TX FIFO
NACK_INT_RAW10R/SS/WTC0Ведущий получил не тот ACK, что ожидал, или ведомый получил 1
TRANS_START_INT_RAW9R/SS/WTC0Контроллер выдал условие START
TIME_OUT_INT_RAW8R/SS/WTC0SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень
TRANS_COMPLETE_INT_RAW7R/SS/WTC0Обнаружено условие STOP
MST_TXFIFO_UDF_INT_RAW6R/SS/WTC0TX FIFO ведущего опустел
ARBITRATION_LOST_INT_RAW5R/SS/WTC0Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL
BYTE_TRANS_DONE_INT_RAW4R/SS/WTC0Передан или принят байт
END_DETECT_INT_RAW3R/SS/WTC0Выполнена команда END
RXFIFO_OVF_INT_RAW2R/SS/WTC0RX FIFO переполнен
TXFIFO_WM_INT_RAW1R/SS/WTC1Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)
RXFIFO_WM_INT_RAW0R/SS/WTC0Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_CLR17WT0Принят общий вызов (7-битный адрес 0)
SLAVE_STRETCH_INT_CLR16WT0Ведомый растягивает SCL по одному из четырёх событий
DET_START_INT_CLR15WT0Ведущий или ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_CLR14WT0Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние
SCL_ST_TO_INT_CLR13WT0Автомат SCL_FSM слишком долго не меняет состояние
RXFIFO_UDF_INT_CLR12WT0Чтение по APB из пустого RX FIFO
TXFIFO_OVF_INT_CLR11WT0Запись по APB в полный TX FIFO
NACK_INT_CLR10WT0Ведущий получил не тот ACK, что ожидал, или ведомый получил 1
TRANS_START_INT_CLR9WT0Контроллер выдал условие START
TIME_OUT_INT_CLR8WT0SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень
TRANS_COMPLETE_INT_CLR7WT0Обнаружено условие STOP
MST_TXFIFO_UDF_INT_CLR6WT0TX FIFO ведущего опустел
ARBITRATION_LOST_INT_CLR5WT0Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL
BYTE_TRANS_DONE_INT_CLR4WT0Передан или принят байт
END_DETECT_INT_CLR3WT0Выполнена команда END
RXFIFO_OVF_INT_CLR2WT0RX FIFO переполнен
TXFIFO_WM_INT_CLR1WT0Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)
RXFIFO_WM_INT_CLR0WT0Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)

I2C_INT_ENA_REG — разрешение прерываний

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_ENA17R/W0Принят общий вызов (7-битный адрес 0)
SLAVE_STRETCH_INT_ENA16R/W0Ведомый растягивает SCL по одному из четырёх событий
DET_START_INT_ENA15R/W0Ведущий или ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_ENA14R/W0Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние
SCL_ST_TO_INT_ENA13R/W0Автомат SCL_FSM слишком долго не меняет состояние
RXFIFO_UDF_INT_ENA12R/W0Чтение по APB из пустого RX FIFO
TXFIFO_OVF_INT_ENA11R/W0Запись по APB в полный TX FIFO
NACK_INT_ENA10R/W0Ведущий получил не тот ACK, что ожидал, или ведомый получил 1
TRANS_START_INT_ENA9R/W0Контроллер выдал условие START
TIME_OUT_INT_ENA8R/W0SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень
TRANS_COMPLETE_INT_ENA7R/W0Обнаружено условие STOP
MST_TXFIFO_UDF_INT_ENA6R/W0TX FIFO ведущего опустел
ARBITRATION_LOST_INT_ENA5R/W0Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL
BYTE_TRANS_DONE_INT_ENA4R/W0Передан или принят байт
END_DETECT_INT_ENA3R/W0Выполнена команда END
RXFIFO_OVF_INT_ENA2R/W0RX FIFO переполнен
TXFIFO_WM_INT_ENA1R/W0Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)
RXFIFO_WM_INT_ENA0R/W0Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_ST17RO0Принят общий вызов (7-битный адрес 0)
SLAVE_STRETCH_INT_ST16RO0Ведомый растягивает SCL по одному из четырёх событий
DET_START_INT_ST15RO0Ведущий или ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_ST14RO0Главный автомат SCL_MAIN_FSM слишком долго не меняет состояние
SCL_ST_TO_INT_ST13RO0Автомат SCL_FSM слишком долго не меняет состояние
RXFIFO_UDF_INT_ST12RO0Чтение по APB из пустого RX FIFO
TXFIFO_OVF_INT_ST11RO0Запись по APB в полный TX FIFO
NACK_INT_ST10RO0Ведущий получил не тот ACK, что ожидал, или ведомый получил 1
TRANS_START_INT_ST9RO0Контроллер выдал условие START
TIME_OUT_INT_ST8RO0SCL во время передачи дольше 2^TIME_OUT_VALUE тактов не меняет уровень
TRANS_COMPLETE_INT_ST7RO0Обнаружено условие STOP
MST_TXFIFO_UDF_INT_ST6RO0TX FIFO ведущего опустел
ARBITRATION_LOST_INT_ST5RO0Арбитраж проигран: уровень SDA не совпал с выданным при высоком SCL
BYTE_TRANS_DONE_INT_ST4RO0Передан или принят байт
END_DETECT_INT_ST3RO0Выполнена команда END
RXFIFO_OVF_INT_ST2RO0RX FIFO переполнен
TXFIFO_WM_INT_ST1RO0Указатели TX FIFO меньше порога TXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)
RXFIFO_WM_INT_ST0RO0Указатели RX FIFO больше порога RXFIFO_WM_THRHD (при FIFO_PRT_EN = 1)

I2C_SDA_HOLD_REG — удержание SDA после спада SCL

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

ПолеБитыДоступСбросНазначение
SDA_HOLD_TIME8:0R/W0x000Удержание данных после спада SCL в тактах I2C_SCLK (t_HD;DAT = значение + 1)

I2C_SDA_SAMPLE_REG — момент выборки SDA после фронта SCL

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

ПолеБитыДоступСбросНазначение
SDA_SAMPLE_TIME8:0R/W0x000Задержка выборки SDA после фронта SCL в тактах I2C_SCLK

I2C_SCL_HIGH_PERIOD_REG — длительность высокого уровня SCL и ожидание его подъёма

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

1514131211109876543210
SCL_WAIT_HIGH_PERIODSCL_HIGH_PERIOD
ПолеБитыДоступСбросНазначение
SCL_WAIT_HIGH_PERIOD15:9R/W0x00Ожидание подъёма SCL ведущим в тактах I2C_SCLK (t_r = значение + 1 по TRM)
SCL_HIGH_PERIOD8:0R/W0x000Высокий уровень SCL ведущего в тактах I2C_SCLK

I2C_SCL_START_HOLD_REG — удержание условия START

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

ПолеБитыДоступСбросНазначение
SCL_START_HOLD_TIME8:0R/W0x008От спада SDA до спада SCL при START: значение + 1 тактов

I2C_SCL_RSTART_SETUP_REG — установка повторного START

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

ПолеБитыДоступСбросНазначение
SCL_RSTART_SETUP_TIME8:0R/W0x008Установка повторного START: значение + 1 тактов

I2C_SCL_STOP_HOLD_REG — пауза после условия STOP

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

ПолеБитыДоступСбросНазначение
SCL_STOP_HOLD_TIME8:0R/W0x008Пауза после STOP (t_BUF): значение + 1 тактов

I2C_SCL_STOP_SETUP_REG — установка условия STOP

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

ПолеБитыДоступСбросНазначение
SCL_STOP_SETUP_TIME8:0R/W0x008Установка STOP: значение + 1 тактов

I2C_FILTER_CFG_REG — фильтры помех SCL и SDA

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

1514131211109876543210
—SDA_FILTER_ENSCL_FILTER_ENSDA_FILTER_THRESSCL_FILTER_THRES
ПолеБитыДоступСбросНазначение
SDA_FILTER_EN9R/W11 — фильтр SDA
SCL_FILTER_EN8R/W11 — фильтр SCL
SDA_FILTER_THRES7:4R/W0x0Импульсы на SDA короче стольких тактов I2C_SCLK отбрасываются
SCL_FILTER_THRES3:0R/W0x0Импульсы на SCL короче стольких тактов I2C_SCLK отбрасываются

I2C_CLK_CONF_REG — источник и делитель такта I2C_SCLK

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

31302928272625242322212019181716
—SCLK_ACTIVESCLK_SELSCLK_DIV_B
1514131211109876543210
SCLK_DIV_BSCLK_DIV_ASCLK_DIV_NUM
ПолеБитыДоступСбросНазначение
SCLK_ACTIVE21R/W11 — включить такт I2C_SCLK
SCLK_SEL20R/W0Источник такта: 0 — XTAL_CLK, 1 — RC_FAST_CLK
SCLK_DIV_B19:14R/W0x00Знаменатель дробной части делителя
SCLK_DIV_A13:8R/W0x00Числитель дробной части делителя
SCLK_DIV_NUM7:0R/W0x00Целая часть делителя минус 1: делитель = SCLK_DIV_NUM + 1 + A / B

I2C_COMDn_REG — команда n списка команд

8 копий, n = 0…7: смещение 0x0058 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 27.26.

31302928272625242322212019181716
COMMANDn_DONE—
1514131211109876543210
—COMMANDn
ПолеБитыДоступСбросНазначение
COMMANDn_DONE31R/W/SS01 — команда выполнена; перед записью новых команд сбрасывают программно
COMMANDn13:0R/W0x0000Команда: биты 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_I2C4:0R/W0x10Порог таймаута автомата SCL_FSM; по описанию поля — не больше 23

I2C_SCL_MAIN_ST_TIME_OUT_REG — таймаут главного автомата SCL_MAIN_FSM

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

ПолеБитыДоступСбросНазначение
SCL_MAIN_ST_TO_I2C4:0R/W0x10Порог таймаута главного автомата SCL_MAIN_FSM

I2C_SCL_SP_CONF_REG — импульсы SCL для освобождения шины, удержание линий

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

1514131211109876543210
—SDA_PD_ENSCL_PD_ENSCL_RST_SLV_NUMSCL_RST_SLV_EN
ПолеБитыДоступСбросНазначение
SDA_PD_EN7R/W01 — отключить выход SDA; вместе с SDA_FORCE_OUT = 1 держит SDA в нуле
SCL_PD_EN6R/W01 — отключить выход SCL; вместе с SCL_FORCE_OUT = 1 держит SCL в нуле
SCL_RST_SLV_NUM5:1R/W0x00Число импульсов SCL для освобождения шины
SCL_RST_SLV_EN0R/W/SC0Запись 1 в покое ведущего выдаёт SCL_RST_SLV_NUM импульсов SCL

I2C_SCL_STRETCH_CONF_REG — растягивание SCL и ACK в ведомом режиме

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

1514131211109876543210
—SLAVE_BYTE_ACK_LVLSLAVE_BYTE_ACK_CTL_ENSLAVE_SCL_STRETCH_CLRSLAVE_SCL_STRETCH_ENSTRETCH_PROTECT_NUM
ПолеБитыДоступСбросНазначение
SLAVE_BYTE_ACK_LVL13R/W0Уровень ACK, который выдаёт ведомый при SLAVE_BYTE_ACK_CTL_EN
SLAVE_BYTE_ACK_CTL_EN12R/W01 — ведомый сам задаёт уровень ACK
SLAVE_SCL_STRETCH_CLR11WT0Запись 1 снимает растягивание SCL
SLAVE_SCL_STRETCH_EN10R/W01 — ведомый растягивает SCL; причина — в STRETCH_CAUSE
STRETCH_PROTECT_NUM9:0R/W0x000Задержка отпускания SCL после растягивания

I2C_DATE_REG — версия блока: дата ревизии аппаратуры

Смещение 0x00F8, после сброса 0x2007 0201. TRM: регистр 27.34.

ПолеБитыДоступСброс
DATE31:0R/W0x2007 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 пишет без вычитания: по комментарию в коде так частота точнее совпадает с измеренной. На фактическую частоту влияет и время нарастания фронта при выбранных подтяжках.

Источники

  1. Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 27: таблица 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

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