ESP32-S2/S3/P4 USB-OTG 外设完全指南:传输速率、内置下载功能与 Host/Device 双模式开发
【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution
导读
USB-OTG(USB On-The-Go)是 ESP32-S2/S3/P4 等芯片内置的 USB 控制器外设,它同时具备 USB Host 与 USB Device 两种工作模式,可让芯片通过一根 USB 线直接连接 PC、U 盘、摄像头、4G 模组等外部设备。本文以 esp-iot-solution 仓库中的 USB-OTG 外设介绍文档 为核心,系统讲解 USB-OTG 的传输速率模型(Full Speed 与 High Speed 的差异)、ROM 内置的 USB OTG Console 与 USB DFU 固件下载能力、基于 USB Host Driver / TinyUSB 的 Host 与 Device 开发路径,以及模式动态切换与主动断开主机的实现要点。读完本文,你将掌握 ESP32 系列 USB-OTG 从硬件连接到固件下载、再到应用开发的完整技术脉络。
USB-OTG 外设概述
ESP32-S2/S3/P4 等芯片内置了 USB On-The-Go(USB-OTG)外设,它由USB 控制器(Controller)与USB PHY两部分组成。通过 USB 线连接 PC 等主机后,芯片既可作为 USB Host 连接外部设备,也可作为 USB Device 被主机枚举识别。
在 esp-iot-solution 的 USB 外设总览 中,各芯片的 USB 外设支持情况如下:
- ESP32-P4:同时拥有 USB OTG High-Speed、USB OTG Full-Speed、USB-Serial-JTAG 三个控制器,以及 Full-Speed PHY 与 High-Speed PHY;
- ESP32-S3:拥有 USB OTG Full-Speed 与 USB-Serial-JTAG 两个控制器和一个 Full-Speed PHY;
- ESP32-S2:拥有 USB OTG Full-Speed 控制器与 Full-Speed PHY(无 USB-Serial-JTAG);
- ESP32-C3/C6 仅具备 USB-Serial-JTAG;ESP32/ESP32-C2/ESP8266 则不具备上述任何 USB 外设。
关于内部 PHY 与固定 GPIO 引脚的对应关系(如 ESP32-S2/S3 的 D+ = GPIO20、D- = GPIO19),可参考 USB PHY 介绍。
USB-OTG 传输速率分析
Full Speed(12 Mbps)模式下的有效速率
对于 ESP32-S2/S3/P4,USB-OTG 的 Full Speed 总线速率为12 Mbps。但由于 USB 传输中存在校验(checksum)与同步机制,实际有效传输速率必然低于 12 Mbps。具体数值取决于传输类型:
| 传输类型 | Control | Interrupt | Bulk | Isochronous |
|---|---|---|---|---|
| 应用场景 | 设备初始化与管理 | 鼠标、键盘 | 打印机、大容量存储 | 流式音频、视频 |
| 是否支持 Low Speed | 是 | 是 | 否 | 否 |
| 是否带校验与重传 | 是 | 是 | 是 | 否 |
| 是否保证传输速度 | 否 | 否 | 否 | 是 |
| 是否占用固定带宽 | 是(10%) | 是(90%) | 否 | 是(90%) |
| 是否降低延迟 | 否 | 是 | 否 | 是 |
| 最大传输大小 | 64 Bytes | 64 Bytes | 64 Bytes | ~512 Bytes |
| 每毫秒传输包数 | * | 1 | 19 | 1 |
| 理论有效速率 | * | 64000 Bytes/s | 1216000 Bytes/s | 512000 Bytes/s |
从上表可以看出:Bulk 传输凭借每毫秒 19 个包的高吞吐能力,是 U 盘等大容量数据传输的首选;Isochronous 传输牺牲了校验与重传,换取固定的带宽与低延迟,适合音频/视频流;Interrupt 传输则专为鼠标、键盘这类低延迟小数据量交互设计。
High Speed(480 Mbps)模式下的有效速率(ESP32-P4)
ESP32-P4 的 USB-OTG High Speed 总线速率为480 Mbps。相比 Full Speed,其最大传输大小、每微帧(microframe)包数与理论有效速率均有显著提升:
| 传输类型 | Control | Interrupt | Bulk | Isochronous |
|---|---|---|---|---|
| 最大传输大小 | 64 Bytes | 1024 Bytes | 512 Bytes | 1024 Bytes |
| 每微帧包数 | * | 6 | 13 | 7 |
| 理论有效速率 | * | 49152000 Bytes/s | 53248000 Bytes/s | 57344000 Bytes/s |
传输速率计算公式:
传输速率(Bytes/s)= 最大包大小 × 每微帧包数 × 8000说明两点:
- Control 传输用于传输设备控制信息,涉及多个阶段(setup、data、status),其有效速率需要根据协议栈的具体实现计算,故表中以
*表示; - High Speed 模式下每毫秒包含 8 个微帧,因此公式中乘数为 8000;Full Speed 模式下按帧(每毫秒 1 帧)计算,乘数为 1000。
USB-OTG 外设内置功能
USB-OTG 外设的 ROM Code 中内置了多种实用能力,无需烧录任何应用固件即可使用。
使用 USB OTG Console 进行固件下载与日志打印
对于 ESP32-S2/S3 等内置 USB-OTG 外设的芯片,其 ROM Code 包含USB CDC(通信设备类)功能,可作为 UART 接口的替代方案,实现日志打印、控制台访问与固件下载。由于 USB OTG Console 默认处于关闭状态,首次使用需要按以下步骤操作:
首次固件下载:
- 在
menuconfig中启用 USB OTG Console 功能,然后编译固件; - 手动将芯片的
Boot引脚拉低,并通过 USB 线连接 PC 进入下载模式。此时 PC 会枚举出一个新的串口设备:Windows 下显示为COM*,Linux 下为/dev/ttyACM*,macOS 下为/dev/cu*; - 使用
esptool工具(或直接使用idf.py flash)指定对应串口下载固件。
- 在
首次下载完成后:USB OTG Console 功能自动启用。此后直接通过 USB 连接 PC,系统即可枚举出虚拟串口设备,日志数据会从该虚拟串口输出。
后续下载无需手动拉低 Boot 引脚:使用
esptool或idf.py flash指定串口下载即可。下载过程中,esptool 会通过 USB 控制协议自动复位设备并将其切换到下载模式。
使用 USB OTG DFU 下载固件
对于 ESP32-S2/S3/P4 等芯片,ROM Code 还内置了USB DFU(Device Firmware Upgrade,设备固件升级)功能,可实现标准的 DFU 下载模式:
- 使用 DFU 下载固件时,用户需要每次手动进入下载模式:拉低芯片
Boot控制引脚并通过 USB 连接 PC; - 在项目目录下运行
idf.py dfu生成 DFU 固件,然后使用idf.py dfu-flash下载固件; - 若存在多个 DFU 设备,可先用
idf.py dfu-list查看设备列表,再用idf.py dfu-flash --path <path>指定下载端口。
警告:对于 ESP32-P4 v3.1 及之后版本,DFU 下载功能存在缺陷,可能导致 DFU 下载失败,建议改用 USB Serial/JTAG 方式下载固件。
使用 USB-OTG 开发 USB Host
USB-OTG 外设支持 USB Host 功能,用户可通过 USB 接口直接连接外部 USB 设备。自ESP-IDF 4.4起,官方提供了 USB Host Driver,用户可基于它开发各类 USB Class Driver。此外,Espressif 官方已提供 HID、MSC、CDC、UVC 等设备类的 USB Host 驱动,可直接用于应用开发。
esp-iot-solution 的 USB Host 解决方案 中总结了以下几类典型应用:
- USB Camera 视频方案:通过 USB 接口连接摄像头模组,采集并传输 MJPEG 格式视频流,Full Speed(ESP32-S2/S3)下最高支持 480×800@15fps,High Speed(ESP32-P4)下最高支持 1080×1920@60fps,适用于猫眼门铃、智能门锁、内窥镜、倒车影像等场景;
- USB 音频方案:连接 PCM 格式 USB 音频设备,支持多通道 48KHz 16bit 扬声器与麦克风,支持 Type-C 耳机,可与 UVC 摄像头同时工作,适用于门铃对讲等场景;
- USB 4G 组网方案:连接 Cat.1/Cat.4 4G 模组,通过 PPP/ECM/RNDIS 协议拨号上网,并支持 4G 转 Wi-Fi SoftAP 热点分享(含 NAPT、自动网络恢复、SIM 卡检测等功能),适用于 IoT 网关、MiFi 等场景;
- USB 存储方案:连接标准 U 盘(兼容 USB 3.1/3.0/2.0),挂载 FatFS 文件系统进行读写,默认支持最大 32GB 的 Fat32 格式,并支持 U 盘 OTA 升级;
- USB Hub 方案:通过 Hub 连接多个 USB 设备,支持热插拔,可实现双摄像头采集、音视频同步处理等场景。
这些能力均可在 components/usb 目录下找到对应的组件实现,例如 esp_msc_ota(U 盘挂载 + OTA)等。
使用 USB-OTG 开发 USB Device
USB-OTG 外设同样支持 USB Device 功能。Espressif 官方已适配开源TinyUSB协议栈,用户可基于 TinyUSB 开发标准 USB 设备或自定义设备,如 HID、MSC、CDC、ECM、UAC 等。详细的 TinyUSB 开发指引见 TinyUSB 开发指南 与 原生 TinyUSB 开发指南。
esp-iot-solution 的 USB Device 解决方案 中总结了以下典型应用:
- USB 音频设备:基于 UAC 2.0 标准,芯片可作为麦克风或扬声器接入 PC 等 USB 音频主机;
- USB 视频设备:基于 UVC 1.5 标准,支持同步/批量传输,可充当虚拟摄像头,适用于 USB 门铃摄像头、USB + Wi-Fi 双模网络摄像头;
- USB 大容量存储设备:基于 MSC 标准,可结合 Wi-Fi 构建无线共享存储(无线 U 盘、读卡器等);
- USB HID 设备:可作为键盘、鼠标、游戏手柄等,结合 Wi-Fi/蓝牙/ESP-Now 可构建无线 HID 设备,同时支持 USB HID 与 BLE HID 两种模式;
- USB 拖拽式 OTA 升级:基于 esp-tinyuf2 组件,将芯片模拟为虚拟 U 盘,把 UF2 固件拖入即可完成 OTA,还可将 NVS 数据映射为文件便于修改;
- USB 扩展屏幕:通过单根 USB 线同时传输视频、音频与触摸数据,充当电脑扩展屏、签名板等,主机侧基于 Windows IDD(Indirect Display Driver)驱动模型实现。
USB-OTG 模式动态切换
USB-OTG 外设支持动态切换工作模式。通过动态注册 / 注销 USB Host Driver 或 USB Device Driver,即可在运行期实现 Host 与 Device 模式之间的切换。
仓库提供了完整的示例工程 usb_host_device_mode_manual_switch:设备端被模拟为 USB CDC 设备,Host 端则是可连接 U 盘的 MSC 主机。其核心逻辑位于 manual_switch.c,通过按键回调切换模式:
static void usb_otg_mode_switch_cb(void *arg, void *data) { if (s_usb_otg_mode == OTG_HOST) { ESP_LOGI(TAG, "Switch to USB Device Mode\n"); host_msc_deinit(); // 注销 Host 驱动 device_cdc_init(); // 注册 Device 驱动 s_usb_otg_mode = OTG_DEVICE; } else { ESP_LOGI(TAG, "Switch to USB Device Mode\n"); device_cdc_deinit(); // 注销 Device 驱动 host_msc_init(); // 注册 Host 驱动 s_usb_otg_mode = OTG_HOST; } }从代码可以看到,切换的本质是先注销当前模式的驱动栈,再注册目标模式的驱动栈。示例使用 iot_button 组件监听 Boot 按键(ESP32-S2/S3 为 GPIO0,ESP32-P4 为 GPIO35)触发切换,初始状态为 Host 模式(host_msc_init())。
该示例对组件版本有以下要求(可据此排查兼容性问题):
- Host 端依赖
esp_msc_ota,且 Host 应用必须支持驱动的动态注册与注销; - Device 端依赖 TinyUSB,且TinyUSB 版本必须大于 0.17.0,因为该版本之后才支持对 DWC2 驱动执行 deinit(反初始化)。
硬件接线参考
| ESP32-Sx GPIO | ESP32-P4 GPIO | USB 设备 |
|---|---|---|
| 20 | 50 | D+(绿色) |
| 19 | 49 | D-(白色) |
| GND | GND | GND(黑色) |
| +5V | +5V | +5V(红色) |
编译运行方式:先执行idf.py set-target esp32s3设置目标芯片,再执行idf.py -p PORT build flash monitor构建烧录并查看串口输出。接入 U 盘后可在日志中看到设备描述符被打印;断开 U 盘后按下 Boot 按键切到 Device 模式,连接 PC 即会出现虚拟串口。
使用 USB-OTG 主动断开主机
在某些应用场景下(如自供电设备热插拔),需要通过软件主动断开与主机的连接。实现方式为:将 USB OTG 的VBUSVALID信号拉低,从而模拟 USB-OTG 外设的物理断开。需要注意的是,若需要重新挂载设备,必须等待至少 10ms后再进行操作。
详细实现可参考 USB 自供电设备解决方案。根据 USB 协议要求,自供电设备必须检测 5V VBUS 电压以判断设备是否被拔出,从而支持热插拔;而总线供电设备在主机 VBUS 断开时会立即断电,无需实现该逻辑。
由于 ESP32-S2/S3/P4 内部 USB PHY不支持硬件检测逻辑,VBUS 检测必须通过软件借助 ADC/GPIO 实现,其中 GPIO 检测法最简单:
ESP-IDF 5.0 及之后版本:在硬件上通过两个电阻(如两个 100KΩ)分压后接入一个 GPIO,然后在tinyusb_config_t中直接配置vbus_monitor_io:
#define VBUS_MONITORING_GPIO_NUM GPIO_NUM_4 const tinyusb_config_t tusb_cfg = { .device_descriptor = &descriptor_config, .string_descriptor = string_desc_arr, .string_descriptor_count = sizeof(string_desc_arr) / sizeof(string_desc_arr[0]), .external_phy = false, .configuration_descriptor = desc_configuration, .self_powered = true, .vbus_monitor_io = VBUS_MONITORING_GPIO_NUM, }; ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));若使用原生 TinyUSB 开发,则需在 PHY 初始化阶段配置:
const usb_phy_otg_io_conf_t otg_io_conf = USB_PHY_SELF_POWERED_DEVICE(VBUS_MONITORING_GPIO_NUM); phy_conf.otg_io_conf = &otg_io_conf; usb_new_phy(&phy_conf, &s_phy_hdl);ESP-IDF 4.4 及更早版本:需要在tinyusb_driver_install之后调用usbd_vbus_detect_gpio_enable函数启用 VBUS 检测,通过esp_rom_gpio_connect_in_signal将检测 GPIO 连接到 USB 的USB_OTG_VBUSVALID_IN_IDX、USB_SRP_BVALID_IN_IDX与USB_SRP_SESSEND_IN_IDX信号上,完整代码见 usb_device_self_power.rst。
硬件注意:ESP32-S2/S3/P4 的 IO 最大输入电压为 3.3V,因此 5V VBUS 必须通过电阻分压后再接入 GPIO,切勿直连。
总结
USB-OTG 是 ESP32-S2/S3/P4 上功能最全面的 USB 外设:Full Speed 模式下 Bulk 传输的理论有效速率可达 1.216 MB/s,而 ESP32-P4 的 High Speed 模式可将 Isochronous 传输的理论有效速率提升至约 57 MB/s;ROM 内置的 USB OTG Console 与 USB DFU 让固件下载不再依赖 UART;配合 ESP-IDF 的 USB Host Driver 与 TinyUSB 设备协议栈,用户既能连接 U 盘、摄像头、4G 模组,也能将芯片本身做成 HID、UAC、UVC、MSC 等标准设备,并通过动态注册/注销驱动在 Host 与 Device 模式间灵活切换。相关实现细节可继续深入阅读仓库中的 USB Host 解决方案、USB Device 解决方案、USB PHY 介绍 以及 USB 外设总览。
【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考