Регистры I2C ESP32-C3
Регистры I2C ESP32-C3: ведущий и ведомый режимы, список из восьми команд, по которому контроллер сам ведёт транзакцию, тайминги SCL и SDA, FIFO приёма и передачи по 32 байта, фильтры помех, таймауты и флаги прерываний.
Содержание
- Пример на 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
Контроллер 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.
| Экземпляр | Базовый адрес |
|---|---|
| I2C0 | 0x6001 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 | Длительность низкого уровня SCL | 0x0000 0000 |
| I2C_CTR_REG(i) | 0x0004 | Режим, запуск транзакции, порядок битов | 0x0000 020B |
| I2C_SR_REG(i) | 0x0008 | Состояние шины и FIFO | 0x0000 C000 |
| I2C_TO_REG(i) | 0x000C | Таймаут шины | 0x0000 0010 |
| I2C_SLAVE_ADDR_REG(i) | 0x0010 | Адрес контроллера в ведомом режиме | 0x0000 0000 |
| I2C_FIFO_ST_REG(i) | 0x0014 | Указатели FIFO | 0x0000 0000 |
| I2C_FIFO_CONF_REG(i) | 0x0018 | Пороги и сброс FIFO | 0x0000 408B |
| I2C_DATA_REG(i) | 0x001C | Чтение из RX FIFO и запись в TX FIFO | 0x0000 0000 |
| I2C_INT_RAW_REG(i) | 0x0020 | Необработанные флаги прерываний | 0x0000 0002 |
| I2C_INT_CLR_REG(i) | 0x0024 | Сброс флагов прерываний записью 1 | 0x0000 0000 |
| I2C_INT_ENA_REG(i) | 0x0028 | Разрешение прерываний | 0x0000 0000 |
| I2C_INT_STATUS_REG(i) | 0x002C | Флаги прерываний после маски разрешения | 0x0000 0000 |
| I2C_SDA_HOLD_REG(i) | 0x0030 | Удержание SDA после спада SCL | 0x0000 0000 |
| I2C_SDA_SAMPLE_REG(i) | 0x0034 | Момент выборки SDA после фронта SCL | 0x0000 0000 |
| I2C_SCL_HIGH_PERIOD_REG(i) | 0x0038 | Длительность высокого уровня SCL | 0x0000 0000 |
| I2C_SCL_START_HOLD_REG(i) | 0x0040 | Удержание условия START | 0x0000 0008 |
| I2C_SCL_RSTART_SETUP_REG(i) | 0x0044 | Установка повторного START | 0x0000 0008 |
| I2C_SCL_STOP_HOLD_REG(i) | 0x0048 | Удержание условия STOP | 0x0000 0008 |
| I2C_SCL_STOP_SETUP_REG(i) | 0x004C | Установка условия STOP | 0x0000 0008 |
| I2C_FILTER_CFG_REG(i) | 0x0050 | Фильтры помех SCL и SDA | 0x0000 0300 |
| I2C_CLK_CONF_REG(i) | 0x0054 | Источник и делитель такта I2C | 0x0020 0000 |
| I2C_COMDn_REG(i) | 0x0058 + n · 0x0004 | Команда n списка команд | 0x0000 0000 |
| I2C_SCL_ST_TIME_OUT_REG(i) | 0x0078 | Таймаут автомата состояний SCL | 0x0000 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_PERIOD | 8:0 | R/W | 0x000 |
I2C_CTR_REG(i) — режим, запуск транзакции, порядок битов
Смещение 0x0004, адрес 0x6001 3004, после сброса 0x0000 020B. TRM: регистр 28.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 | |
| ADDR_10BIT_RW_CHECK_EN | 13 | R/W | 0 | |
| SLV_TX_AUTO_START_EN | 12 | R/W | 0 | |
| CONF_UPGATE | 11 | WT | 0 | Запись 1 применяет новые настройки таймингов и режима |
| FSM_RST | 10 | WT | 0 | Сброс автомата SCL |
| ARBITRATION_EN | 9 | R/W | 1 | Арбитраж шины для нескольких ведущих |
| CLK_EN | 8 | R/W | 0 | Тактирование регистров |
| RX_LSB_FIRST | 7 | R/W | 0 | Принимать младшим битом вперёд |
| TX_LSB_FIRST | 6 | R/W | 0 | Передавать младшим битом вперёд |
| TRANS_START | 5 | WT | 0 | Запись 1 запускает выполнение списка команд |
| MS_MODE | 4 | R/W | 0 | 1 — ведущий, 0 — ведомый |
| RX_FULL_ACK_LEVEL | 3 | R/W | 1 | |
| SAMPLE_SCL_LEVEL | 2 | R/W | 0 | |
| SCL_FORCE_OUT | 1 | R/W | 1 | Режим выхода SCL: 0 — открытый сток, 1 — прямой выход (direct output) |
| SDA_FORCE_OUT | 0 | R/W | 1 | Режим выхода SDA: 0 — открытый сток, 1 — прямой выход (direct output) |
I2C_SR_REG(i) — состояние шины и FIFO
Смещение 0x0008, адрес 0x6001 3008, после сброса 0x0000 C000. TRM: регистр 28.19.
| 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_MAIN_STATE_LAST | 26:24 | RO | 0x0 | |
| TXFIFO_CNT | 23:18 | RO | 0x00 | Число байтов в TX FIFO |
| STRETCH_CAUSE | 15:14 | RO | 0x3 | |
| RXFIFO_CNT | 13:8 | RO | 0x00 | Число байтов в RX FIFO |
| SLAVE_ADDRESSED | 5 | RO | 0 | Ведомый: принят свой адрес |
| BUS_BUSY | 4 | RO | 0 | Шина занята |
| ARB_LOST | 3 | RO | 0 | Арбитраж проигран |
| SLAVE_RW | 1 | RO | 0 | Ведомый: 1 — ведущий читает, 0 — пишет |
| RESP_REC | 0 | RO | 0 | ACK последнего байта: 0 — ACK, 1 — NACK |
I2C_TO_REG(i) — таймаут шины
Смещение 0x000C, адрес 0x6001 300C, после сброса 0x0000 0010. TRM: регистр 28.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 | Включить таймаут |
| TIME_OUT_VALUE | 4:0 | R/W | 0x10 | Таймаут: 2 в этой степени тактов I2C_SCLK |
I2C_SLAVE_ADDR_REG(i) — адрес контроллера в ведомом режиме
Смещение 0x0010, адрес 0x6001 3010, после сброса 0x0000 0000. TRM: регистр 28.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 | 10-битный адрес |
| SLAVE_ADDR | 14:0 | R/W | 0x0000 | Адрес ведомого: 7 или 10 бит |
I2C_FIFO_ST_REG(i) — указатели FIFO
Смещение 0x0014, адрес 0x6001 3014, после сброса 0x0000 0000. TRM: регистр 28.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(i) — пороги и сброс FIFO
Смещение 0x0018, адрес 0x6001 3018, после сброса 0x0000 408B. TRM: регистр 28.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 | |
| TX_FIFO_RST | 13 | R/W | 0 | Сброс TX FIFO |
| RX_FIFO_RST | 12 | R/W | 0 | Сброс RX FIFO |
| FIFO_ADDR_CFG_EN | 11 | R/W | 0 | |
| NONFIFO_EN | 10 | R/W | 0 | |
| TXFIFO_WM_THRHD | 9:5 | R/W | 0x04 | Порог прерывания TXFIFO_WM |
| RXFIFO_WM_THRHD | 4:0 | R/W | 0x0B | Порог прерывания RXFIFO_WM |
I2C_DATA_REG(i) — чтение из RX FIFO и запись в TX FIFO
Смещение 0x001C, адрес 0x6001 301C, после сброса 0x0000 0000. TRM: регистр 28.21.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| FIFO_RDATA | 7:0 | R/W | 0x00 | Чтение — байт из RX FIFO |
I2C_INT_RAW_REG(i) — необработанные флаги прерываний
Смещение 0x0020, адрес 0x6001 3020, после сброса 0x0000 0002. TRM: регистр 28.22.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_RAW | 17 | R/SS/WTC | 0 | Принят общий вызов (адрес 0x00) |
| 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_ST_TO_I2C в одном состоянии |
| SCL_ST_TO_INT_RAW | 13 | R/SS/WTC | 0 | Автомат состояний SCL завис дольше SCL_ST_TO_I2C |
| RXFIFO_UDF_INT_RAW | 12 | R/SS/WTC | 0 | Чтение из пустого RX FIFO |
| TXFIFO_OVF_INT_RAW | 11 | R/SS/WTC | 0 | TX FIFO переполнен |
| NACK_INT_RAW | 10 | R/SS/WTC | 0 | Получен NACK там, где ожидался ACK |
| TRANS_START_INT_RAW | 9 | R/SS/WTC | 0 | Выполнена команда RSTART или принято условие START |
| TIME_OUT_INT_RAW | 8 | R/SS/WTC | 0 | SCL дольше заданного не меняет уровень |
| 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 | Ведущий проиграл арбитраж шины |
| 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 |
| RXFIFO_WM_INT_RAW | 0 | R/SS/WTC | 0 | Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD |
I2C_INT_CLR_REG(i) — сброс флагов прерываний записью 1
Смещение 0x0024, адрес 0x6001 3024, после сброса 0x0000 0000. TRM: регистр 28.23.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_CLR | 17 | WT | 0 | Принят общий вызов (адрес 0x00) |
| 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_ST_TO_I2C в одном состоянии |
| SCL_ST_TO_INT_CLR | 13 | WT | 0 | Автомат состояний SCL завис дольше SCL_ST_TO_I2C |
| RXFIFO_UDF_INT_CLR | 12 | WT | 0 | Чтение из пустого RX FIFO |
| TXFIFO_OVF_INT_CLR | 11 | WT | 0 | TX FIFO переполнен |
| NACK_INT_CLR | 10 | WT | 0 | Получен NACK там, где ожидался ACK |
| TRANS_START_INT_CLR | 9 | WT | 0 | Выполнена команда RSTART или принято условие START |
| TIME_OUT_INT_CLR | 8 | WT | 0 | SCL дольше заданного не меняет уровень |
| 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 | Ведущий проиграл арбитраж шины |
| 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 |
| RXFIFO_WM_INT_CLR | 0 | WT | 0 | Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD |
I2C_INT_ENA_REG(i) — разрешение прерываний
Смещение 0x0028, адрес 0x6001 3028, после сброса 0x0000 0000. TRM: регистр 28.24.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_ENA | 17 | R/W | 0 | Принят общий вызов (адрес 0x00) |
| 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_ST_TO_I2C в одном состоянии |
| SCL_ST_TO_INT_ENA | 13 | R/W | 0 | Автомат состояний SCL завис дольше SCL_ST_TO_I2C |
| RXFIFO_UDF_INT_ENA | 12 | R/W | 0 | Чтение из пустого RX FIFO |
| TXFIFO_OVF_INT_ENA | 11 | R/W | 0 | TX FIFO переполнен |
| NACK_INT_ENA | 10 | R/W | 0 | Получен NACK там, где ожидался ACK |
| TRANS_START_INT_ENA | 9 | R/W | 0 | Выполнена команда RSTART или принято условие START |
| TIME_OUT_INT_ENA | 8 | R/W | 0 | SCL дольше заданного не меняет уровень |
| 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 | Ведущий проиграл арбитраж шины |
| 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 |
| RXFIFO_WM_INT_ENA | 0 | R/W | 0 | Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD |
I2C_INT_STATUS_REG(i) — флаги прерываний после маски разрешения
Смещение 0x002C, адрес 0x6001 302C, после сброса 0x0000 0000. TRM: регистр 28.25.
| Поле | Биты | Доступ | Сброс | Назначение |
|---|---|---|---|---|
| GENERAL_CALL_INT_ST | 17 | RO | 0 | Принят общий вызов (адрес 0x00) |
| 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_ST_TO_I2C в одном состоянии |
| SCL_ST_TO_INT_ST | 13 | RO | 0 | Автомат состояний SCL завис дольше SCL_ST_TO_I2C |
| RXFIFO_UDF_INT_ST | 12 | RO | 0 | Чтение из пустого RX FIFO |
| TXFIFO_OVF_INT_ST | 11 | RO | 0 | TX FIFO переполнен |
| NACK_INT_ST | 10 | RO | 0 | Получен NACK там, где ожидался ACK |
| TRANS_START_INT_ST | 9 | RO | 0 | Выполнена команда RSTART или принято условие START |
| TIME_OUT_INT_ST | 8 | RO | 0 | SCL дольше заданного не меняет уровень |
| 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 | Ведущий проиграл арбитраж шины |
| 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 |
| RXFIFO_WM_INT_ST | 0 | RO | 0 | Заполнение RX FIFO дошло до порога RXFIFO_WM_THRHD |
I2C_SDA_HOLD_REG(i) — удержание SDA после спада SCL
Смещение 0x0030, адрес 0x6001 3030, после сброса 0x0000 0000. TRM: регистр 28.2.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SDA_HOLD_TIME | 8:0 | R/W | 0x000 |
I2C_SDA_SAMPLE_REG(i) — момент выборки SDA после фронта SCL
Смещение 0x0034, адрес 0x6001 3034, после сброса 0x0000 0000. TRM: регистр 28.3.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SDA_SAMPLE_TIME | 8:0 | R/W | 0x000 |
I2C_SCL_HIGH_PERIOD_REG(i) — длительность высокого уровня SCL
Смещение 0x0038, адрес 0x6001 3038, после сброса 0x0000 0000. TRM: регистр 28.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_HIGH_PERIOD | 8:0 | R/W | 0x000 |
I2C_SCL_START_HOLD_REG(i) — удержание условия START
Смещение 0x0040, адрес 0x6001 3040, после сброса 0x0000 0008. TRM: регистр 28.5.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SCL_START_HOLD_TIME | 8:0 | R/W | 0x008 |
I2C_SCL_RSTART_SETUP_REG(i) — установка повторного START
Смещение 0x0044, адрес 0x6001 3044, после сброса 0x0000 0008. TRM: регистр 28.6.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SCL_RSTART_SETUP_TIME | 8:0 | R/W | 0x008 |
I2C_SCL_STOP_HOLD_REG(i) — удержание условия STOP
Смещение 0x0048, адрес 0x6001 3048, после сброса 0x0000 0008. TRM: регистр 28.7.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SCL_STOP_HOLD_TIME | 8:0 | R/W | 0x008 |
I2C_SCL_STOP_SETUP_REG(i) — установка условия STOP
Смещение 0x004C, адрес 0x6001 304C, после сброса 0x0000 0008. TRM: регистр 28.8.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SCL_STOP_SETUP_TIME | 8:0 | R/W | 0x008 |
I2C_FILTER_CFG_REG(i) — фильтры помех SCL и SDA
Смещение 0x0050, адрес 0x6001 3050, после сброса 0x0000 0300. TRM: регистр 28.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 |
| SCL_FILTER_EN | 8 | R/W | 1 |
| SDA_FILTER_THRES | 7:4 | R/W | 0x0 |
| SCL_FILTER_THRES | 3:0 | R/W | 0x0 |
I2C_CLK_CONF_REG(i) — источник и делитель такта I2C
Смещение 0x0054, адрес 0x6001 3054, после сброса 0x0020 0000. TRM: регистр 28.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 | Включить такт 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 + SCLK_DIV_A / SCLK_DIV_B |
I2C_COMDn_REG(i) — команда n списка команд
8 копий, n = 0…7: смещение 0x0058 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 28.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 | Команда выполнена; сбрасывают программно |
| COMMANDn | 13:0 | R/W | 0x0000 | Команда: код операции в битах 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_I2C | 4:0 | R/W | 0x10 |
I2C_SCL_MAIN_ST_TIME_OUT_REG(i) — таймаут главного автомата
Смещение 0x007C, адрес 0x6001 307C, после сброса 0x0000 0010. TRM: регистр 28.10.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| SCL_MAIN_ST_TO_I2C | 4:0 | R/W | 0x10 |
I2C_SCL_SP_CONF_REG(i) — восстановление зависшей шины
Смещение 0x0080, адрес 0x6001 3080, после сброса 0x0000 0000. TRM: регистр 28.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 |
| SCL_PD_EN | 6 | R/W | 0 |
| SCL_RST_SLV_NUM | 5:1 | R/W | 0x00 |
| SCL_RST_SLV_EN | 0 | R/W/SC | 0 |
I2C_SCL_STRETCH_CONF_REG(i) — растягивание SCL в ведомом режиме
Смещение 0x0084, адрес 0x6001 3084, после сброса 0x0000 0000. TRM: регистр 28.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 |
| SLAVE_BYTE_ACK_CTL_EN | 12 | R/W | 0 |
| SLAVE_SCL_STRETCH_CLR | 11 | WT | 0 |
| SLAVE_SCL_STRETCH_EN | 10 | R/W | 0 |
| STRETCH_PROTECT_NUM | 9:0 | R/W | 0x000 |
I2C_DATE_REG(i) — версия блока: дата ревизии аппаратуры
Смещение 0x00F8, адрес 0x6001 30F8, после сброса 0x2007 0201. TRM: регистр 28.34.
| Поле | Биты | Доступ | Сброс |
|---|---|---|---|
| DATE | 31:0 | R/W | 0x2007 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).
Источники
- Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 28: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
- Espressif. SVD svd/esp32c3.svd, версия 18 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
- Espressif. ESP-IDF v6.1: заголовки components/soc/esp32c3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT
Нашли ошибку в регистрах?
Другие регистры ESP32-C3
- Все регистры ESP32-C3Блоки периферии и базовые адреса
- GPIO — выводы общего назначения и матрица GPIOGPIO_BT_SELECT_REG, GPIO_OUT_REG, GPIO_OUT_W1TS_REG, GPIO_OUT_W1TC_REG
- IO MUX — мультиплексор функций и электрические настройки выводовPIN_CTRL, IO_MUX_GPIOn_REG, IO_MUX_DATE_REG
- UART — универсальный асинхронный приёмопередатчикUART_FIFO_REG, UART_INT_RAW_REG, UART_INT_ST_REG, UART_INT_ENA_REG
- SPI — контроллер SPI общего назначения GP-SPI2SPI_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_T0CONFIG_REG, TIMG_T0LO_REG, TIMG_T0HI_REG, TIMG_T0UPDATE_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 — управление питанием, сном и RTCRTC_CNTL_OPTIONS0_REG, RTC_CNTL_SLP_TIMER0_REG, RTC_CNTL_SLP_TIMER1_REG, RTC_CNTL_TIME_UPDATE_REG
- АЦП — 12-битный SAR АЦП и датчик температурыAPB_SARADC_CTRL_REG, APB_SARADC_CTRL2_REG, APB_SARADC_FILTER_CTRL1_REG, APB_SARADC_SAR_PATT_TABn_REG
- USB Serial/JTAG — встроенный USB-порт: виртуальный COM-порт и 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_PWR_INTR_MAP_REG, INTERRUPT_CORE0_I2C_MST_INT_MAP_REG, INTERRUPT_CORE0_SLCn_INTR_MAP_REG, INTERRUPT_CORE0_APB_CTRL_INTR_MAP_REG