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

Регистры USB Serial/JTAG ESP32-S3

Регистры USB Serial/JTAG ESP32-S3: обмен данными последовательного порта CDC-ACM через конечную точку EP1, настройки встроенного USB PHY — подтяжки, пороги, перестановка D+ и D− — состояния конечных точек, FIFO JTAG и флаги прерываний.

Контроллер по адресу 0x6003 8000 — USB-устройство Full-speed (12 Мбит/с) с жёстко заданной функцией: последовательный порт CDC-ACM и JTAG-адаптер для отладки ядер. Он подключается к хосту выводами GPIO19 (USB_D−) и GPIO20 (USB_D+) через встроенный PHY, который делит с USB OTG; выбор задают eFuse или регистр RTC_CNTL_RTC_USB_CONF_REG.

Программа передаёт байты, записывая их в поле RDWR_BYTE регистра USB_SERIAL_JTAG_EP1_REG, пока установлен SERIAL_IN_EP_DATA_FREE, и отправляет пакет записью 1 в WR_DONE; размер пакета — до 64 байт. Принятые байты читаются из того же поля, когда установлен SERIAL_OUT_EP_DATA_AVAIL.

В регистре USB_SERIAL_JTAG_CONF0_REG при VREF_OVERRIDE = 1 задаются пороги приёмника: VREFH (биты 4:3) — верхний порог 1,76…2 В, VREFL (биты 6:5) — нижний 0,8…1,04 В, шаг 80 мВ. У ESP32-S3 TRM, SVD и ESP-IDF здесь согласны, в отличие от ESP32-C3, где имена полей переставлены.

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

Пример на C

Отправить строку в порт CDC (soc/usb_serial_jtag_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/usb_serial_jtag_reg.h"

const char *s = "Hello\r\n";
while (*s && REG_GET_BIT(USB_SERIAL_JTAG_EP1_CONF_REG, USB_SERIAL_JTAG_SERIAL_IN_EP_DATA_FREE)) {
    REG_WRITE(USB_SERIAL_JTAG_EP1_REG, *s++);       // байт в буфер IN
}
REG_WRITE(USB_SERIAL_JTAG_EP1_CONF_REG, USB_SERIAL_JTAG_WR_DONE);  // отправить пакет

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
USB_SERIAL_JTAG_EP1_REG0x0000Данные последовательного порта: запись в IN, чтение из OUT0x0000 0000
USB_SERIAL_JTAG_EP1_CONF_REG0x0004Буферы последовательного порта: свободно, есть данные, отправить0x0000 0002
USB_SERIAL_JTAG_INT_RAW_REG0x0008Необработанные флаги прерываний0x0000 0008
USB_SERIAL_JTAG_INT_ST_REG0x000CФлаги прерываний после маски разрешения0x0000 0000
USB_SERIAL_JTAG_INT_ENA_REG0x0010Разрешение прерываний0x0000 0000
USB_SERIAL_JTAG_INT_CLR_REG0x0014Сброс флагов прерываний записью 10x0000 0000
USB_SERIAL_JTAG_CONF0_REG0x0018USB PHY: подтяжки, пороги, перестановка D+ и D−0x0000 4200
USB_SERIAL_JTAG_TEST_REG0x001CТестовый режим выводов USB0x0000 0000
USB_SERIAL_JTAG_JFIFO_ST_REG0x0020Состояние FIFO JTAG0x0000 0044
USB_SERIAL_JTAG_FRAM_NUM_REG0x0024Номер последнего кадра SOF0x0000 0000
USB_SERIAL_JTAG_IN_EPn_ST_REG0x0028 + n · 0x0004Состояние конечной точки IN n0x0000 0001
USB_SERIAL_JTAG_OUT_EP0_ST_REG0x0038Состояние конечной точки OUT 00x0000 0000
USB_SERIAL_JTAG_OUT_EP1_ST_REG0x003CСостояние конечной точки OUT 1 (данные CDC от хоста)0x0000 0000
USB_SERIAL_JTAG_OUT_EP2_ST_REG0x0040Состояние конечной точки OUT 20x0000 0000
USB_SERIAL_JTAG_MISC_CONF_REG0x0044Тактирование регистров0x0000 0000
USB_SERIAL_JTAG_MEM_CONF_REG0x0048Питание и тактирование памяти USB0x0000 0002
USB_SERIAL_JTAG_DATE_REG0x0080Версия блока: дата ревизии аппаратуры0x0210 1200

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

USB_SERIAL_JTAG_EP1_REG — данные последовательного порта: запись в IN, чтение из OUT

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

ПолеБитыДоступСбросНазначение
RDWR_BYTE7:0R/W0x00Запись — байт в буфер IN (до 64 байт), чтение — байт из буфера OUT

USB_SERIAL_JTAG_EP1_CONF_REG — буферы последовательного порта: свободно, есть данные, отправить

Смещение 0x0004, адрес 0x6003 8004, после сброса 0x0000 0002. TRM: регистр 33.2.

1514131211109876543210
—SERIAL_OUT_EP_DATA_AVAILSERIAL_IN_EP_DATA_FREEWR_DONE
ПолеБитыДоступСбросНазначение
SERIAL_OUT_EP_DATA_AVAIL2RO01 — в буфере OUT есть принятые данные
SERIAL_IN_EP_DATA_FREE1RO11 — в буфер IN можно писать; после WR_DONE 0, пока хост не заберёт данные
WR_DONE0WT0Запись 1 — данные в буфере IN готовы к отправке

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

Смещение 0x0008, адрес 0x6003 8008, после сброса 0x0000 0008. TRM: регистр 33.6.

1514131211109876543210
—OUT_EP2_ZERO_PAYLOAD_INT_RAWOUT_EP1_ZERO_PAYLOAD_INT_RAWUSB_BUS_RESET_INT_RAWIN_TOKEN_REC_IN_EP1_INT_RAWSTUFF_ERR_INT_RAWCRC16_ERR_INT_RAWCRC5_ERR_INT_RAWPID_ERR_INT_RAWSERIAL_IN_EMPTY_INT_RAWSERIAL_OUT_RECV_PKT_INT_RAWSOF_INT_RAWJTAG_IN_FLUSH_INT_RAW
ПолеБитыДоступСбросНазначение
OUT_EP2_ZERO_PAYLOAD_INT_RAW11R/WTC/SS0Точка OUT 2 приняла пакет нулевой длины
OUT_EP1_ZERO_PAYLOAD_INT_RAW10R/WTC/SS0Точка OUT 1 приняла пакет нулевой длины
USB_BUS_RESET_INT_RAW9R/WTC/SS0Сброс шины USB
IN_TOKEN_REC_IN_EP1_INT_RAW8R/WTC/SS0Принят токен IN для точки 1
STUFF_ERR_INT_RAW7R/WTC/SS0Ошибка битстаффинга
CRC16_ERR_INT_RAW6R/WTC/SS0Ошибка CRC16
CRC5_ERR_INT_RAW5R/WTC/SS0Ошибка CRC5
PID_ERR_INT_RAW4R/WTC/SS0Ошибка PID
SERIAL_IN_EMPTY_INT_RAW3R/WTC/SS1Точка IN последовательного порта пуста
SERIAL_OUT_RECV_PKT_INT_RAW2R/W0Точка OUT последовательного порта приняла пакет
SOF_INT_RAW1R/WTC/SS0Принят кадр SOF
JTAG_IN_FLUSH_INT_RAW0R/W0Получена команда flush для точки IN 2 JTAG

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

Смещение 0x000C, адрес 0x6003 800C, после сброса 0x0000 0000. TRM: регистр 33.7.

1514131211109876543210
—OUT_EP2_ZERO_PAYLOAD_INT_STOUT_EP1_ZERO_PAYLOAD_INT_STUSB_BUS_RESET_INT_STIN_TOKEN_REC_IN_EP1_INT_STSTUFF_ERR_INT_STCRC16_ERR_INT_STCRC5_ERR_INT_STPID_ERR_INT_STSERIAL_IN_EMPTY_INT_STSERIAL_OUT_RECV_PKT_INT_STSOF_INT_STJTAG_IN_FLUSH_INT_ST
ПолеБитыДоступСбросНазначение
OUT_EP2_ZERO_PAYLOAD_INT_ST11RO0Точка OUT 2 приняла пакет нулевой длины
OUT_EP1_ZERO_PAYLOAD_INT_ST10RO0Точка OUT 1 приняла пакет нулевой длины
USB_BUS_RESET_INT_ST9RO0Сброс шины USB
IN_TOKEN_REC_IN_EP1_INT_ST8RO0Принят токен IN для точки 1
STUFF_ERR_INT_ST7RO0Ошибка битстаффинга
CRC16_ERR_INT_ST6RO0Ошибка CRC16
CRC5_ERR_INT_ST5RO0Ошибка CRC5
PID_ERR_INT_ST4RO0Ошибка PID
SERIAL_IN_EMPTY_INT_ST3RO0Точка IN последовательного порта пуста
SERIAL_OUT_RECV_PKT_INT_ST2RO0Точка OUT последовательного порта приняла пакет
SOF_INT_ST1RO0Принят кадр SOF
JTAG_IN_FLUSH_INT_ST0RO0Получена команда flush для точки IN 2 JTAG

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

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

1514131211109876543210
—OUT_EP2_ZERO_PAYLOAD_INT_ENAOUT_EP1_ZERO_PAYLOAD_INT_ENAUSB_BUS_RESET_INT_ENAIN_TOKEN_REC_IN_EP1_INT_ENASTUFF_ERR_INT_ENACRC16_ERR_INT_ENACRC5_ERR_INT_ENAPID_ERR_INT_ENASERIAL_IN_EMPTY_INT_ENASERIAL_OUT_RECV_PKT_INT_ENASOF_INT_ENAJTAG_IN_FLUSH_INT_ENA
ПолеБитыДоступСбросНазначение
OUT_EP2_ZERO_PAYLOAD_INT_ENA11R/W0Точка OUT 2 приняла пакет нулевой длины
OUT_EP1_ZERO_PAYLOAD_INT_ENA10R/W0Точка OUT 1 приняла пакет нулевой длины
USB_BUS_RESET_INT_ENA9R/W0Сброс шины USB
IN_TOKEN_REC_IN_EP1_INT_ENA8R/W0Принят токен IN для точки 1
STUFF_ERR_INT_ENA7R/W0Ошибка битстаффинга
CRC16_ERR_INT_ENA6R/W0Ошибка CRC16
CRC5_ERR_INT_ENA5R/W0Ошибка CRC5
PID_ERR_INT_ENA4R/W0Ошибка PID
SERIAL_IN_EMPTY_INT_ENA3R/W0Точка IN последовательного порта пуста
SERIAL_OUT_RECV_PKT_INT_ENA2R/W0Точка OUT последовательного порта приняла пакет
SOF_INT_ENA1R/W0Принят кадр SOF
JTAG_IN_FLUSH_INT_ENA0R/W0Получена команда flush для точки IN 2 JTAG

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

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

1514131211109876543210
—OUT_EP2_ZERO_PAYLOAD_INT_CLROUT_EP1_ZERO_PAYLOAD_INT_CLRUSB_BUS_RESET_INT_CLRIN_TOKEN_REC_IN_EP1_INT_CLRSTUFF_ERR_INT_CLRCRC16_ERR_INT_CLRCRC5_ERR_INT_CLRPID_ERR_INT_CLRSERIAL_IN_EMPTY_INT_CLRSERIAL_OUT_RECV_PKT_INT_CLRSOF_INT_CLRJTAG_IN_FLUSH_INT_CLR
ПолеБитыДоступСбросНазначение
OUT_EP2_ZERO_PAYLOAD_INT_CLR11WT0Точка OUT 2 приняла пакет нулевой длины
OUT_EP1_ZERO_PAYLOAD_INT_CLR10WT0Точка OUT 1 приняла пакет нулевой длины
USB_BUS_RESET_INT_CLR9WT0Сброс шины USB
IN_TOKEN_REC_IN_EP1_INT_CLR8WT0Принят токен IN для точки 1
STUFF_ERR_INT_CLR7WT0Ошибка битстаффинга
CRC16_ERR_INT_CLR6WT0Ошибка CRC16
CRC5_ERR_INT_CLR5WT0Ошибка CRC5
PID_ERR_INT_CLR4WT0Ошибка PID
SERIAL_IN_EMPTY_INT_CLR3WT0Точка IN последовательного порта пуста
SERIAL_OUT_RECV_PKT_INT_CLR2WO0Точка OUT последовательного порта приняла пакет
SOF_INT_CLR1WT0Принят кадр SOF
JTAG_IN_FLUSH_INT_CLR0WO0Получена команда flush для точки IN 2 JTAG

USB_SERIAL_JTAG_CONF0_REG — uSB PHY: подтяжки, пороги, перестановка D+ и D−

Смещение 0x0018, адрес 0x6003 8018, после сброса 0x0000 4200. TRM: регистр 33.3.

31302928272625242322212019181716
—USB_JTAG_BRIDGE_EN
1514131211109876543210
PHY_TX_EDGE_SELUSB_PAD_ENABLEPULLUP_VALUEDM_PULLDOWNDM_PULLUPDP_PULLDOWNDP_PULLUPPAD_PULL_OVERRIDEVREF_OVERRIDEVREFLVREFHEXCHG_PINSEXCHG_PINS_OVERRIDEPHY_SEL
ПолеБитыДоступСбросНазначение
USB_JTAG_BRIDGE_EN16R/W01 — JTAG отключён от ядер, сигналы MTMS, MTDI, MTCK и MTDO идут через матрицу GPIO
PHY_TX_EDGE_SEL15R/W0Выдача передатчика: 0 — по спаду такта, 1 — по фронту
USB_PAD_ENABLE14R/W11 — выводы работают как USB
PULLUP_VALUE13R/W0Подтяжка: 0 — 2,2 кОм, 1 — 1,1 кОм (в главе 10 TRM — 2,4 и 1,2 кОм)
DM_PULLDOWN12R/W0Подтяжка D− к земле (при PAD_PULL_OVERRIDE)
DM_PULLUP11R/W0Подтяжка D− к питанию (при PAD_PULL_OVERRIDE)
DP_PULLDOWN10R/W0Подтяжка D+ к земле (при PAD_PULL_OVERRIDE)
DP_PULLUP9R/W1Подтяжка D+ к питанию (при PAD_PULL_OVERRIDE); после сброса 1
PAD_PULL_OVERRIDE8R/W01 — подтяжками D+ и D− управляет программа
VREF_OVERRIDE7R/W01 — пороги приёмника задаются программно
VREFL6:5R/W0x0Нижний порог одиночного входа 0,8…1,04 В, шаг 80 мВ
VREFH4:3R/W0x0Верхний порог одиночного входа 1,76…2 В, шаг 80 мВ
EXCHG_PINS2R/W01 — поменять D+ и D− местами
EXCHG_PINS_OVERRIDE1R/W01 — перестановкой D+ и D− управляет программа
PHY_SEL0R/W0PHY: 0 — встроенный, 1 — внешний

USB_SERIAL_JTAG_TEST_REG — тестовый режим выводов USB

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

1514131211109876543210
—TEST_RX_DMTEST_RX_DPTEST_RX_RCVTEST_TX_DMTEST_TX_DPTEST_USB_OETEST_ENABLE
ПолеБитыДоступСбросНазначение
TEST_RX_DM6RO0Вход D− в тесте
TEST_RX_DP5RO0Вход D+ в тесте
TEST_RX_RCV4RO0Дифференциальный вход в тесте
TEST_TX_DM3R/W0Уровень D− в тесте
TEST_TX_DP2R/W0Уровень D+ в тесте
TEST_USB_OE1R/W0Разрешение выхода выводов USB в тесте
TEST_ENABLE0R/W01 — тестовый режим выводов USB

USB_SERIAL_JTAG_JFIFO_ST_REG — состояние FIFO JTAG

Смещение 0x0020, адрес 0x6003 8020, после сброса 0x0000 0044. TRM: регистр 33.11.

1514131211109876543210
—OUT_FIFO_RESETIN_FIFO_RESETOUT_FIFO_FULLOUT_FIFO_EMPTYOUT_FIFO_CNTIN_FIFO_FULLIN_FIFO_EMPTYIN_FIFO_CNT
ПолеБитыДоступСбросНазначение
OUT_FIFO_RESET9R/W0Запись 1 сбрасывает FIFO OUT JTAG
IN_FIFO_RESET8R/W0Запись 1 сбрасывает FIFO IN JTAG
OUT_FIFO_FULL7RO01 — FIFO OUT JTAG полон
OUT_FIFO_EMPTY6RO11 — FIFO OUT JTAG пуст
OUT_FIFO_CNT5:4RO0x0Счётчик FIFO OUT JTAG
IN_FIFO_FULL3RO01 — FIFO IN JTAG полон
IN_FIFO_EMPTY2RO11 — FIFO IN JTAG пуст
IN_FIFO_CNT1:0RO0x0Счётчик FIFO IN JTAG

USB_SERIAL_JTAG_FRAM_NUM_REG — номер последнего кадра SOF

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

ПолеБитыДоступСбросНазначение
SOF_FRAME_INDEX10:0RO0x000Номер кадра из последнего SOF

USB_SERIAL_JTAG_IN_EPn_ST_REG — состояние конечной точки IN n

4 копии, n = 0…3: смещение 0x0028 + n · 0x0004, после сброса 0x0000 0001. TRM: регистр 33.13.

1514131211109876543210
IN_EPn_RD_ADDRIN_EPn_WR_ADDRIN_EPn_STATE
ПолеБитыДоступСбросНазначение
IN_EPn_RD_ADDR15:9RO0x00Адрес чтения данных точки IN n
IN_EPn_WR_ADDR8:2RO0x00Адрес записи данных точки IN n
IN_EPn_STATE1:0RO0x1Состояние точки IN n

USB_SERIAL_JTAG_OUT_EP0_ST_REG — состояние конечной точки OUT 0

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

1514131211109876543210
OUT_EP0_RD_ADDROUT_EP0_WR_ADDROUT_EP0_STATE
ПолеБитыДоступСброс
OUT_EP0_RD_ADDR15:9RO0x00
OUT_EP0_WR_ADDR8:2RO0x00
OUT_EP0_STATE1:0RO0x0

USB_SERIAL_JTAG_OUT_EP1_ST_REG — состояние конечной точки OUT 1 (данные CDC от хоста)

Смещение 0x003C, адрес 0x6003 803C, после сброса 0x0000 0000. TRM: регистр 33.18.

31302928272625242322212019181716
—OUT_EP1_REC_DATA_CNT
1514131211109876543210
OUT_EP1_RD_ADDROUT_EP1_WR_ADDROUT_EP1_STATE
ПолеБитыДоступСбросНазначение
OUT_EP1_REC_DATA_CNT22:16RO0x00Число принятых байтов в буфере OUT 1
OUT_EP1_RD_ADDR15:9RO0x00
OUT_EP1_WR_ADDR8:2RO0x00
OUT_EP1_STATE1:0RO0x0

USB_SERIAL_JTAG_OUT_EP2_ST_REG — состояние конечной точки OUT 2

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

1514131211109876543210
OUT_EP2_RD_ADDROUT_EP2_WR_ADDROUT_EP2_STATE
ПолеБитыДоступСброс
OUT_EP2_RD_ADDR15:9RO0x00
OUT_EP2_WR_ADDR8:2RO0x00
OUT_EP2_STATE1:0RO0x0

USB_SERIAL_JTAG_MISC_CONF_REG — тактирование регистров

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

ПолеБитыДоступСбросНазначение
CLK_EN0R/W01 — такт регистров всегда включён

USB_SERIAL_JTAG_MEM_CONF_REG — питание и тактирование памяти USB

Смещение 0x0048, адрес 0x6003 8048, после сброса 0x0000 0002. TRM: регистр 33.5.

1514131211109876543210
—USB_MEM_CLK_ENUSB_MEM_PD
ПолеБитыДоступСбросНазначение
USB_MEM_CLK_EN1R/W11 — такт памяти USB всегда включён
USB_MEM_PD0R/W01 — выключить память USB

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

Смещение 0x0080, адрес 0x6003 8080, после сброса 0x0210 1200. TRM: регистр 33.20.

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

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

Как передать данные в USB Serial/JTAG ESP32-S3 без драйвера?

Пока бит SERIAL_IN_EP_DATA_FREE регистра USB_SERIAL_JTAG_EP1_CONF_REG равен 1, записывать байты в USB_SERIAL_JTAG_EP1_REG, затем записать 1 в WR_DONE — пакет уйдёт хосту, когда тот его запросит. Так устроены функции usb_serial_jtag_ll_write_txfifo и usb_serial_jtag_ll_txfifo_flush ESP-IDF.

Почему после включения USB OTG пропал порт USB Serial/JTAG ESP32-S3?

Встроенный USB PHY один на два контроллера. Какой из них к нему подключён, задаёт eFuse USB_PHY_SEL или, если установлен SW_HW_USB_PHY_SEL регистра RTC_CNTL_RTC_USB_CONF_REG, бит SW_USB_PHY_SEL: 1 — PHY у USB OTG, 0 — у USB Serial/JTAG.

Источники

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

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