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

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

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

Контроллер I2C0 ESP32-C3 находится по адресу 0x6001 3000. Ведущий не управляет шиной побитно: программа записывает в регистры COMD0…COMD7 последовательность команд — RSTART, WRITE, READ, STOP, END — с числом байтов и ожидаемым ACK, кладёт данные в TX FIFO и запускает выполнение битом TRANS_START регистра I2C_CTR_REG.

Тайминги задаются в тактах I2C_SCLK, источник которого выбирает CLK_CONF (XTAL_CLK 40 МГц или RC_FAST_CLK) с дробным делителем SCLK_DIV_NUM + 1 + SCLK_DIV_A / SCLK_DIV_B: длительности низкого и высокого уровней SCL, удержания и установки START, STOP и данных. Изменения таймингов и режимов применяются после записи 1 в бит CONF_UPGATE.

ЭкземплярБазовый адрес
I2C00x6001 3000

Пример на 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.

#include "soc/i2c_reg.h"

uint32_t sr = REG_READ(I2C_SR_REG(0));
bool busy = sr & I2C_BUS_BUSY;                             // идёт транзакция
uint32_t rx = REG_GET_FIELD(I2C_SR_REG(0), I2C_RXFIFO_CNT); // байтов в RX FIFO

if (REG_READ(I2C_INT_RAW_REG(0)) & I2C_NACK_INT_RAW) {
    // устройство не ответило
}
REG_WRITE(I2C_INT_CLR_REG(0), I2C_TRANS_COMPLETE_INT_CLR | I2C_NACK_INT_CLR);

Регистры блока

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
I2C_SCL_LOW_PERIOD_REG(i)0x0000Длительность низкого уровня SCL0x0000 0000
I2C_CTR_REG(i)0x0004Режим, запуск транзакции, порядок битов0x0000 020B
I2C_SR_REG(i)0x0008Состояние шины и FIFO0x0000 C000
I2C_TO_REG(i)0x000CТаймаут шины0x0000 0010
I2C_SLAVE_ADDR_REG(i)0x0010Адрес контроллера в ведомом режиме0x0000 0000
I2C_FIFO_ST_REG(i)0x0014Указатели FIFO0x0000 0000
I2C_FIFO_CONF_REG(i)0x0018Пороги и сброс FIFO0x0000 408B
I2C_DATA_REG(i)0x001CЧтение из RX FIFO и запись в TX FIFO0x0000 0000
I2C_INT_RAW_REG(i)0x0020Необработанные флаги прерываний0x0000 0002
I2C_INT_CLR_REG(i)0x0024Сброс флагов прерываний записью 10x0000 0000
I2C_INT_ENA_REG(i)0x0028Разрешение прерываний0x0000 0000
I2C_INT_STATUS_REG(i)0x002CФлаги прерываний после маски разрешения0x0000 0000
I2C_SDA_HOLD_REG(i)0x0030Удержание SDA после спада SCL0x0000 0000
I2C_SDA_SAMPLE_REG(i)0x0034Момент выборки SDA после фронта SCL0x0000 0000
I2C_SCL_HIGH_PERIOD_REG(i)0x0038Длительность высокого уровня SCL0x0000 0000
I2C_SCL_START_HOLD_REG(i)0x0040Удержание условия START0x0000 0008
I2C_SCL_RSTART_SETUP_REG(i)0x0044Установка повторного START0x0000 0008
I2C_SCL_STOP_HOLD_REG(i)0x0048Удержание условия STOP0x0000 0008
I2C_SCL_STOP_SETUP_REG(i)0x004CУстановка условия STOP0x0000 0008
I2C_FILTER_CFG_REG(i)0x0050Фильтры помех SCL и SDA0x0000 0300
I2C_CLK_CONF_REG(i)0x0054Источник и делитель такта I2C0x0020 0000
I2C_COMDn_REG(i)0x0058 + n · 0x0004Команда n списка команд0x0000 0000
I2C_SCL_ST_TIME_OUT_REG(i)0x0078Таймаут автомата состояний SCL0x0000 0010
I2C_SCL_MAIN_ST_TIME_OUT_REG(i)0x007CТаймаут главного автомата0x0000 0010
I2C_SCL_SP_CONF_REG(i)0x0080Восстановление зависшей шины0x0000 0000
I2C_SCL_STRETCH_CONF_REG(i)0x0084Растягивание SCL в ведомом режиме0x0000 0000
I2C_DATE_REG(i)0x00F8Версия блока: дата ревизии аппаратуры0x2007 0201

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

I2C_SCL_LOW_PERIOD_REG(i) — длительность низкого уровня SCL

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

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

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

Смещение 0x0004, адрес 0x6001 3004, после сброса 0x0000 020B. TRM: регистр 28.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/W0
ADDR_10BIT_RW_CHECK_EN13R/W0
SLV_TX_AUTO_START_EN12R/W0
CONF_UPGATE11WT0Запись 1 применяет новые настройки таймингов и режима
FSM_RST10WT0Сброс автомата SCL
ARBITRATION_EN9R/W1Арбитраж шины для нескольких ведущих
CLK_EN8R/W0Тактирование регистров
RX_LSB_FIRST7R/W0Принимать младшим битом вперёд
TX_LSB_FIRST6R/W0Передавать младшим битом вперёд
TRANS_START5WT0Запись 1 запускает выполнение списка команд
MS_MODE4R/W01 — ведущий, 0 — ведомый
RX_FULL_ACK_LEVEL3R/W1
SAMPLE_SCL_LEVEL2R/W0
SCL_FORCE_OUT1R/W1Режим выхода SCL: 0 — открытый сток, 1 — прямой выход (direct output)
SDA_FORCE_OUT0R/W1Режим выхода SDA: 0 — открытый сток, 1 — прямой выход (direct output)

I2C_SR_REG(i) — состояние шины и FIFO

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

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_MAIN_STATE_LAST26:24RO0x0
TXFIFO_CNT23:18RO0x00Число байтов в TX FIFO
STRETCH_CAUSE15:14RO0x3
RXFIFO_CNT13:8RO0x00Число байтов в RX FIFO
SLAVE_ADDRESSED5RO0Ведомый: принят свой адрес
BUS_BUSY4RO0Шина занята
ARB_LOST3RO0Арбитраж проигран
SLAVE_RW1RO0Ведомый: 1 — ведущий читает, 0 — пишет
RESP_REC0RO0ACK последнего байта: 0 — ACK, 1 — NACK

I2C_TO_REG(i) — таймаут шины

Смещение 0x000C, адрес 0x6001 300C, после сброса 0x0000 0010. TRM: регистр 28.12.

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

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

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

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

I2C_FIFO_ST_REG(i) — указатели FIFO

Смещение 0x0014, адрес 0x6001 3014, после сброса 0x0000 0000. TRM: регистр 28.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(i) — пороги и сброс FIFO

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

1514131211109876543210
—FIFO_PRT_ENTX_FIFO_RSTRX_FIFO_RSTFIFO_ADDR_CFG_ENNONFIFO_ENTXFIFO_WM_THRHDRXFIFO_WM_THRHD
ПолеБитыДоступСбросНазначение
FIFO_PRT_EN14R/W1
TX_FIFO_RST13R/W0Сброс TX FIFO
RX_FIFO_RST12R/W0Сброс RX FIFO
FIFO_ADDR_CFG_EN11R/W0
NONFIFO_EN10R/W0
TXFIFO_WM_THRHD9:5R/W0x04Порог прерывания TXFIFO_WM
RXFIFO_WM_THRHD4:0R/W0x0BПорог прерывания RXFIFO_WM

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

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

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

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_RAW17R/SS/WTC0Принят общий вызов (адрес 0x00)
SLAVE_STRETCH_INT_RAW16R/SS/WTC0Ведомый растягивает SCL
DET_START_INT_RAW15R/SS/WTC0Ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_RAW14R/SS/WTC0Главный автомат дольше SCL_MAIN_ST_TO_I2C в одном состоянии
SCL_ST_TO_INT_RAW13R/SS/WTC0Автомат состояний SCL завис дольше SCL_ST_TO_I2C
RXFIFO_UDF_INT_RAW12R/SS/WTC0Чтение из пустого RX FIFO
TXFIFO_OVF_INT_RAW11R/SS/WTC0TX FIFO переполнен
NACK_INT_RAW10R/SS/WTC0Получен NACK там, где ожидался ACK
TRANS_START_INT_RAW9R/SS/WTC0Выполнена команда RSTART или принято условие START
TIME_OUT_INT_RAW8R/SS/WTC0SCL дольше заданного не меняет уровень
TRANS_COMPLETE_INT_RAW7R/SS/WTC0Выполнена команда STOP: транзакция закончена
MST_TXFIFO_UDF_INT_RAW6R/SS/WTC0TX FIFO ведущего опустел во время передачи
ARBITRATION_LOST_INT_RAW5R/SS/WTC0Ведущий проиграл арбитраж шины
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
RXFIFO_WM_INT_RAW0R/SS/WTC0Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_CLR17WT0Принят общий вызов (адрес 0x00)
SLAVE_STRETCH_INT_CLR16WT0Ведомый растягивает SCL
DET_START_INT_CLR15WT0Ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_CLR14WT0Главный автомат дольше SCL_MAIN_ST_TO_I2C в одном состоянии
SCL_ST_TO_INT_CLR13WT0Автомат состояний SCL завис дольше SCL_ST_TO_I2C
RXFIFO_UDF_INT_CLR12WT0Чтение из пустого RX FIFO
TXFIFO_OVF_INT_CLR11WT0TX FIFO переполнен
NACK_INT_CLR10WT0Получен NACK там, где ожидался ACK
TRANS_START_INT_CLR9WT0Выполнена команда RSTART или принято условие START
TIME_OUT_INT_CLR8WT0SCL дольше заданного не меняет уровень
TRANS_COMPLETE_INT_CLR7WT0Выполнена команда STOP: транзакция закончена
MST_TXFIFO_UDF_INT_CLR6WT0TX FIFO ведущего опустел во время передачи
ARBITRATION_LOST_INT_CLR5WT0Ведущий проиграл арбитраж шины
BYTE_TRANS_DONE_INT_CLR4WT0Передан или принят один байт
END_DETECT_INT_CLR3WT0Выполнена команда END списка команд
RXFIFO_OVF_INT_CLR2WT0RX FIFO переполнен
TXFIFO_WM_INT_CLR1WT0В TX FIFO осталось меньше байтов, чем TXFIFO_WM_THRHD
RXFIFO_WM_INT_CLR0WT0Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_ENA17R/W0Принят общий вызов (адрес 0x00)
SLAVE_STRETCH_INT_ENA16R/W0Ведомый растягивает SCL
DET_START_INT_ENA15R/W0Ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_ENA14R/W0Главный автомат дольше SCL_MAIN_ST_TO_I2C в одном состоянии
SCL_ST_TO_INT_ENA13R/W0Автомат состояний SCL завис дольше SCL_ST_TO_I2C
RXFIFO_UDF_INT_ENA12R/W0Чтение из пустого RX FIFO
TXFIFO_OVF_INT_ENA11R/W0TX FIFO переполнен
NACK_INT_ENA10R/W0Получен NACK там, где ожидался ACK
TRANS_START_INT_ENA9R/W0Выполнена команда RSTART или принято условие START
TIME_OUT_INT_ENA8R/W0SCL дольше заданного не меняет уровень
TRANS_COMPLETE_INT_ENA7R/W0Выполнена команда STOP: транзакция закончена
MST_TXFIFO_UDF_INT_ENA6R/W0TX FIFO ведущего опустел во время передачи
ARBITRATION_LOST_INT_ENA5R/W0Ведущий проиграл арбитраж шины
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
RXFIFO_WM_INT_ENA0R/W0Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD

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

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

ПолеБитыДоступСбросНазначение
GENERAL_CALL_INT_ST17RO0Принят общий вызов (адрес 0x00)
SLAVE_STRETCH_INT_ST16RO0Ведомый растягивает SCL
DET_START_INT_ST15RO0Ведомый обнаружил условие START
SCL_MAIN_ST_TO_INT_ST14RO0Главный автомат дольше SCL_MAIN_ST_TO_I2C в одном состоянии
SCL_ST_TO_INT_ST13RO0Автомат состояний SCL завис дольше SCL_ST_TO_I2C
RXFIFO_UDF_INT_ST12RO0Чтение из пустого RX FIFO
TXFIFO_OVF_INT_ST11RO0TX FIFO переполнен
NACK_INT_ST10RO0Получен NACK там, где ожидался ACK
TRANS_START_INT_ST9RO0Выполнена команда RSTART или принято условие START
TIME_OUT_INT_ST8RO0SCL дольше заданного не меняет уровень
TRANS_COMPLETE_INT_ST7RO0Выполнена команда STOP: транзакция закончена
MST_TXFIFO_UDF_INT_ST6RO0TX FIFO ведущего опустел во время передачи
ARBITRATION_LOST_INT_ST5RO0Ведущий проиграл арбитраж шины
BYTE_TRANS_DONE_INT_ST4RO0Передан или принят один байт
END_DETECT_INT_ST3RO0Выполнена команда END списка команд
RXFIFO_OVF_INT_ST2RO0RX FIFO переполнен
TXFIFO_WM_INT_ST1RO0В TX FIFO осталось меньше байтов, чем TXFIFO_WM_THRHD
RXFIFO_WM_INT_ST0RO0Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD

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

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

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

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

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

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

I2C_SCL_HIGH_PERIOD_REG(i) — длительность высокого уровня SCL

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

1514131211109876543210
SCL_WAIT_HIGH_PERIODSCL_HIGH_PERIOD
ПолеБитыДоступСброс
SCL_WAIT_HIGH_PERIOD15:9R/W0x00
SCL_HIGH_PERIOD8:0R/W0x000

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

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

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

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

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

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

I2C_SCL_STOP_HOLD_REG(i) — удержание условия STOP

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

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

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

Смещение 0x004C, адрес 0x6001 304C, после сброса 0x0000 0008. TRM: регистр 28.8.

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

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

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

1514131211109876543210
—SDA_FILTER_ENSCL_FILTER_ENSDA_FILTER_THRESSCL_FILTER_THRES
ПолеБитыДоступСброс
SDA_FILTER_EN9R/W1
SCL_FILTER_EN8R/W1
SDA_FILTER_THRES7:4R/W0x0
SCL_FILTER_THRES3:0R/W0x0

I2C_CLK_CONF_REG(i) — источник и делитель такта I2C

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

31302928272625242322212019181716
—SCLK_ACTIVESCLK_SELSCLK_DIV_B
1514131211109876543210
SCLK_DIV_BSCLK_DIV_ASCLK_DIV_NUM
ПолеБитыДоступСбросНазначение
SCLK_ACTIVE21R/W1Включить такт 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 + SCLK_DIV_A / SCLK_DIV_B

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

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

31302928272625242322212019181716
COMMANDn_DONE—
1514131211109876543210
—COMMANDn
ПолеБитыДоступСбросНазначение
COMMANDn_DONE31R/W/SS0Команда выполнена; сбрасывают программно
COMMANDn13:0R/W0x0000Команда: код операции в битах 13:11 (RSTART, WRITE, READ, STOP, END), ACK в битах 10:8, число байтов в битах 7:0

I2C_SCL_ST_TIME_OUT_REG(i) — таймаут автомата состояний SCL

Смещение 0x0078, адрес 0x6001 3078, после сброса 0x0000 0010. TRM: регистр 28.9.

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

I2C_SCL_MAIN_ST_TIME_OUT_REG(i) — таймаут главного автомата

Смещение 0x007C, адрес 0x6001 307C, после сброса 0x0000 0010. TRM: регистр 28.10.

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

I2C_SCL_SP_CONF_REG(i) — восстановление зависшей шины

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

1514131211109876543210
—SDA_PD_ENSCL_PD_ENSCL_RST_SLV_NUMSCL_RST_SLV_EN
ПолеБитыДоступСброс
SDA_PD_EN7R/W0
SCL_PD_EN6R/W0
SCL_RST_SLV_NUM5:1R/W0x00
SCL_RST_SLV_EN0R/W/SC0

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

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

1514131211109876543210
—SLAVE_BYTE_ACK_LVLSLAVE_BYTE_ACK_CTL_ENSLAVE_SCL_STRETCH_CLRSLAVE_SCL_STRETCH_ENSTRETCH_PROTECT_NUM
ПолеБитыДоступСброс
SLAVE_BYTE_ACK_LVL13R/W0
SLAVE_BYTE_ACK_CTL_EN12R/W0
SLAVE_SCL_STRETCH_CLR11WT0
SLAVE_SCL_STRETCH_EN10R/W0
STRETCH_PROTECT_NUM9:0R/W0x000

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

Смещение 0x00F8, адрес 0x6001 30F8, после сброса 0x2007 0201. TRM: регистр 28.34.

ПолеБитыДоступСброс
DATE31:0R/W0x2007 0201

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

Как устроен список команд I2C в ESP32-C3?

Каждый регистр COMDn хранит одну команду: код операции в битах 13:11 (RSTART, WRITE, READ, STOP, END), ожидаемый и выдаваемый ACK и число байтов 0…255 в битах 7:0. Контроллер выполняет команды по порядку и отмечает выполненные битом COMMANDn_DONE. Длинную транзакцию разбивают на части командой END и продолжают после прерывания END_DETECT.

Какие значения писать в SCL_LOW_PERIOD и SCL_HIGH_PERIOD для 100 кГц?

Период SCL — сумма низкого и высокого уровней в тактах I2C_SCLK плюс задержки фильтра и синхронизации. При XTAL_CLK 40 МГц и SCLK_DIV_NUM = 0 (делитель 1) на 100 кГц приходится 400 тактов, примерно поровну между низким и высоким уровнем. Точные значения с учётом подъёма линии считает слой HAL драйвера I2C в ESP-IDF (hal/i2c_ll.h).

Источники

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

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