ESP32-S2/S3/P4 USB-OTG 外设完全指南:传输速率、内置下载功能与 Host/Device 双模式开发
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-OTGUSB 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-GoUSB-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 PHYESP32-S3拥有 USB OTG Full-Speed 与 USB-Serial-JTAG 两个控制器和一个 Full-Speed PHYESP32-S2拥有 USB OTG Full-Speed 控制器与 Full-Speed PHY无 USB-Serial-JTAGESP32-C3/C6 仅具备 USB-Serial-JTAGESP32/ESP32-C2/ESP8266 则不具备上述任何 USB 外设。关于内部 PHY 与固定 GPIO 引脚的对应关系如 ESP32-S2/S3 的 D GPIO20、D- GPIO19可参考 USB PHY 介绍。USB-OTG 传输速率分析Full Speed12 Mbps模式下的有效速率对于 ESP32-S2/S3/P4USB-OTG 的 Full Speed 总线速率为12 Mbps。但由于 USB 传输中存在校验checksum与同步机制实际有效传输速率必然低于 12 Mbps。具体数值取决于传输类型传输类型ControlInterruptBulkIsochronous应用场景设备初始化与管理鼠标、键盘打印机、大容量存储流式音频、视频是否支持 Low Speed是是否否是否带校验与重传是是是否是否保证传输速度否否否是是否占用固定带宽是10%是90%否是90%是否降低延迟否是否是最大传输大小64 Bytes64 Bytes64 Bytes~512 Bytes每毫秒传输包数*1191理论有效速率*64000 Bytes/s1216000 Bytes/s512000 Bytes/s从上表可以看出Bulk 传输凭借每毫秒 19 个包的高吞吐能力是 U 盘等大容量数据传输的首选Isochronous 传输牺牲了校验与重传换取固定的带宽与低延迟适合音频/视频流Interrupt 传输则专为鼠标、键盘这类低延迟小数据量交互设计。High Speed480 Mbps模式下的有效速率ESP32-P4ESP32-P4 的 USB-OTG High Speed 总线速率为480 Mbps。相比 Full Speed其最大传输大小、每微帧microframe包数与理论有效速率均有显著提升传输类型ControlInterruptBulkIsochronous最大传输大小64 Bytes1024 Bytes512 Bytes1024 Bytes每微帧包数*6137理论有效速率*49152000 Bytes/s53248000 Bytes/s57344000 Bytes/s传输速率计算公式传输速率Bytes/s 最大包大小 × 每微帧包数 × 8000说明两点Control 传输用于传输设备控制信息涉及多个阶段setup、data、status其有效速率需要根据协议栈的具体实现计算故表中以*表示High Speed 模式下每毫秒包含 8 个微帧因此公式中乘数为 8000Full 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 DFUDevice 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 HostUSB-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 SpeedESP32-S2/S3下最高支持 480×80015fpsHigh SpeedESP32-P4下最高支持 1080×192060fps适用于猫眼门铃、智能门锁、内窥镜、倒车影像等场景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_otaU 盘挂载 OTA等。使用 USB-OTG 开发 USB DeviceUSB-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 IDDIndirect 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 为 GPIO0ESP32-P4 为 GPIO35触发切换初始状态为 Host 模式host_msc_init()。该示例对组件版本有以下要求可据此排查兼容性问题Host 端依赖esp_msc_ota且 Host 应用必须支持驱动的动态注册与注销Device 端依赖 TinyUSB且TinyUSB 版本必须大于 0.17.0因为该版本之后才支持对 DWC2 驱动执行 deinit反初始化。硬件接线参考ESP32-Sx GPIOESP32-P4 GPIOUSB 设备2050D绿色1949D-白色GNDGNDGND黑色5V5V5V红色编译运行方式先执行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/sROM 内置的 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),仅供参考