USB

[English]


ESP32 是否支持 USB 功能?

  • ESP32 不支持 USB 功能。

  • ESP32-S2/S3 支持 USB2.0 Full-speed 模式。


ESP-IDF SDK USB 接口支持 HID、MSC 这些模式吗?


ESP32-S2 USB 接口电流稳定输出为多少?

对于 VBUS 电源线的电流输出能力,由供电决定,与 ESP32-S2 芯片无关。如果采用自供电,请参考 Self-Powered Device


ESP32-S3 的 USB 支持 USB 主机吗?

支持,ESP32-S3 USB 主机功能与 ESP32-S2 一致。


ESP32-C3 USB 支持 USB 串口功能和 USB JTAG 功能吗?

支持,但无法自定义描述符。


ESP32-S2 和 ESP32-S3 USB 的特征是?

ESP32-S3 和 ESP32-S2 具有相同的 USB 2.0 OTG 外设,支持 full-speed 模式,可支持 USB 主机和 USB 设备功能。除此以外,ESP32-S3 还支持 USB-Serial-JTAG 专用外设,可用于固件下载和调试。


ESP32-S2 USB 主机的库和例程是否有参考?

可参考 ESP-IDF 的 USB Host 驱动


ESP32-S2 支持的 USB 协议是 OTG 1.1,速度最高是 12 Mbps。能和 USB 2.0 设备通信吗?

USB 2.0 和 USB 1.1 full-speed 模式兼容,可以进行通信。


ESP32-S2 支持 USB 摄像头吗?

支持。ESP32-S2/ESP32-S3 USB Host UVC 示例代码请参考 usb_stream

ESP32-S3 是否支持带有麦克风和扬声器的 USB 摄像头?

支持。ESP32-S2/ESP32-S3 USB Host UVC + UAC 示例代码请参考 usb_stream


是否有 ESP32-S2 做 U 盘 (MSC DEVICE) 的参考示例?

请参考 usb_msc_wireless_disk demo。目前测试的平均读写速度为:读 540 KB/s,写 350 KB/s。


ESP32-C3 有 USB,是否不需要 cp2102 芯片就可以直接通过 USB 下载固件?

是的,ESP32-C3 可通过 USB 串口直接烧录程序,对应 USB 串口号 Windows 设备上显示为 COMx,Linux 设备上显示为 ttyACMx。


ESP32-C3 是否支持 USB 主机?

不支持,ESP32-C3 仅支持 USB-Serial-JTAG 功能,只能作为 USB 设备。


ESP32-C3 芯片可以使用 USB 下载固件,但在 ESP-IDF v4.3 下不支持。如何使用 USB 下载固件?

请在 ESP-IDF v4.4 及以后版本下编译,拉出最新分支并 更新 IDF 工具,然后便可正常编译并使用 USB 下载固件,使用方法请见 usb-serial-jtag-console


ESP32-S2 是否支持 USB HID?

支持,USB HID Device 请参考 ESP-IDF Device HID。 USB HID Host 请参考 ESP-IDF Host HID 例程


测试 USB 摄像头 Wi-Fi 传输 例程,日志打印如下报错,是什么原因?

E (1437) UVC STREAM: Configuration descriptor larger than control transfer max length

此报错日志是因为 USB Camera 发送的描述符长度大于默认预设的长度(256),可以修改如下配置为 2048 进行测试:

Component config > UVC Stream > (2048) Max control transfer data size (Bytes)


ESP32-S3 支持 USB CDC 输出程序日志和下载固件吗?

ESP32-S3 可以用 USB CDC 输出程序日志和下载固件,但是需要开启如下配置选项:

Component config > ESP System Settings > Channel for console output > USB CDC


ESP32-S3 是否支持 USB Device 为 Class 0 的裝置?


ESP32-S3 的 USB OTG 接口可以同时使用 USB Host 和 USB Device 模式吗?

  • ESP32-S3 的 USB OTG 接口不能同时使用 USB Host 和 USB Device 模式,但可以通过软件切换两种模式,分时使用。

  • 如需要 USB OTG 标准协商功能,需要注意的是目前 ESP32-S3 仅硬件上支持此功能,软件协议还没有支持。


测试 esp-idf/examples/peripherals/usb/device/tusb_serial_device 例程,使用 TinyUSB 发送数据,必须要使用 tinyusb_cdcacm_write_flush 函数吗?

为了防止发送 FIFO 溢出,可以使用 tinyusb_cdcacm_write_flush() 函数进行刷新。但是,大量循环的刷新可能会失败,建议根据实际应用进行设置。


ESP32-S3 是否支持外接 USB hub 芯片分出两个 USB 口同时连接 USB 4G 模块和加密狗?

支持,驱动正在开发中。


ESP32-S2/ESP32-S3 做 UVC Host 连接部分型号的 UVC 摄像头后提示 HID_PIPI_EVENT_ERROR_OVERFLOW,什么原因?

这个错误说明选择的摄像头 Alt 接口端点 MPS 过大(ESP32-S2/ESP32-S3 最高支持 512 字节),需要确认摄像头在 USB1.1 下是否有小于等于 512 字节的接口。


ESP32-S2/ESP32-S3 是否有 USB 4G 上网方案?

有,请参考 USB CDC 4G 模组示例


ESP32-S2/ESP32-S3 是否有 USB CDC Host 示例?


通过 ESP32-C3/ESP32-S3 USB Serial/JTAG Controller 功能烧录固件时发现 PC 有时识别不到 USB 串口,或者会反复看到 USB 串口识别到后又自动断开,这是什么原因?

目前 ESP32/ESP32-S2/ESP32-S3/ESP32-C3 芯片启动逻辑都是:如果不能正常启动(flash 为空,flash 里没有正确的数据/固件,flash 上电时序问题等),内部定时器会触发(一般是几秒钟)一次芯片重启。直到程序能正常启动,或者进入了下载模式,才会稳定连接不再重启,又因为芯片重启时 ESP32-S3/ESP32-C3 USB-Serial-JTAG 外设会重新初始化,所以对应的现象就是连接到 PC 以后 “断断续续”(以几秒钟为周期连接、断开、连接、断开….),以下为两种解决办法:

  • 芯片首次下载前或者 flash 擦除以后,手动 boot 进入下载模式,这样芯片就会稳定连接。

  • 提前通过 UART 烧录能稳定运行的固件,在芯片中有稳定的固件以后,后续烧录时 “USB 断断续续识别后又断开” 的现象就不会再出现。

如果没有预留手动 boot 对应的 strap pin 测试点,则需要在初次 USB 下载时进行多次尝试。


ESP32-S2/ESP32-S3 无法达到 USB full speed 提到的最大 12 Mbps,可能是什么原因?

以 TinyUSB 协议栈为例,因为此 USB 模式没有使用 DMA,而是直接使用 CPU 轮询,每次传输都会有一些时钟时间片被浪费,所以 TinyUSB 协议栈预计只能达到 6.4 Mbps(如果采取批量传输,理论能达到 9.628 Mbps)。


如何判断 ESP32-S2/ESP32-S3 USB 有支持某款 USB 摄像头的可能性?

ESP32-S2/ESP32-S3 USB 只支持包含不大于 512 字节的 wMaxPacketSize Video Streaming 端点的 USB 摄像头,用户可直接使用 USB 摄像头 Wi-Fi 传输 例程测试,若摄像头无法支持,将会打印错误信息。


ESP32-S2/ESP32-S3 能支持最大为多大分辨率的 USB 摄像头?

  • 如果不考虑本地 JPEG 解码。那主要瓶颈在 USB 吞吐率,USB 摄像头往往同步传输,因为 ESP USB 存在 FIFO 大小的限制,目前最大只能到 500 KB/s。所以假设要达到 15 帧,每帧大小只能 33 KB,具体 33 KB 能实现的最大分辨率取决于压缩率,一般可以到 480 * 320 分辨率。

  • 如果考虑本地 JPEG 解码,要同时考虑这个分辨率能不能达到每秒 15 帧。


ESP32-S2/ESP32-S3 USB 做 USB CDC Device 时是否能识别到 USB 的插拔动作?

  • 可以,USB device 采用 tinyusb 协议栈,包含 mount 和 umount 回调函数来反馈 USB 的插拔动作事件。

  • 需要注意的是,如果该设备为自供电 USB 设备,若需要在不断电的情况检测到插拔动作,请注意预留 VBUS 检测引脚,请参考 自供电 USB 设备解决方案


ESP32-S3 USB 使能 RNDIS 和 CDC 功能后发现 PC 能识别到 COM 口,但是 COM 口的自动烧录功能失效了,是否符合预期?

  • 符合预期,因为 USB 自动烧录功能通过 USB-Seial-JTAG 外设实现,但 USB RNDIS 功能通过 USB-OTG 外设来实现,USB-OTG 外设和 USB-Seial-JTAG 外设在同一时刻只有其一能工作。

  • 如果应用上使用了 USB-OTG 外设,那通过 USB-Seial-JTAG 外设实现的自动烧录功能就没有了。但是可以手动进入下载模式来进行 USB 烧录。


请问 ESP32-S2/ESP32-S3 是否支持 USB CDC NCM 协议?

  • 目前只支持 USB CDC ECM 协议,不支持 USB CDC NCM 协议。

将 ESP32-C3/ESP32-S3 的 USB 引脚初始化为 GPIO 或其它外设功能以后, 为什么无法再通过 USB 进入固件烧录?

  • ESP32-C3/ESP32-S3 的 USB 引脚可初始化为 GPIO 或其它外设引脚,但是需要注意的是,初始化完成以后,原有的 USB 下载功能将被断开,无法再通过 USB 接口自动进入下载模式,但用户可以通过手动拉低 Boot 引脚 (ESP32-C3 为 GPIO9, ESP32-S3 为 GPIO0),手动使 ESP32-C3/ESP32-S3 进入下载模式,再通过 USB 进行下载。

将 ESP32-C3/ESP32-S3 的 USB 接口作为产品唯一的固件下载接口,有哪些注意事项?

  • 禁止将 ESP32-C3 (GPIO18,GPIO19) / ESP32-S3(GPIO19,GPIO20) 的 USB 引脚复用为其它外设功能。

  • 如果迫不得已,应用程序中必须将 USB 引脚复用为其它功能,那硬件上必须同时引出 Boot 引脚 (ESP32-C3 为 GPIO9, ESP32-S3 为 GPIO0),用于手动进入下载模式。


Windows 环境下使用 idf.py -p com35 flash monitor 命令,通过 USB 接口一键下载和打印,报错如下日志是什么原因?

  • 错误日志如下:

Connecting...
Failed to get PID of a device on com35, using standard reset sequence.
  • Windows 环境下配置 COM 口必须用大写,不可用小写 com。


如何为 ESP32-S 系列的产品申请 USB VID/PID?

  • 如果你的软件是基于 TinyUSB 协议栈来实现的,可以使用默认的TinyUSB PID。否则,你需要为每个 ESP32-S 系列的产品申请 USB VID/PID。详细说明请参见 “usb-pids”


在 Windows 环境下,使用 USB-Serial-JTAG 接口下载固件,是否可以固定 COM 口编号?

  • 可以使用管理员方式打开 Windows CMD,执行以下指令来添加注册表项,以阻止依据 Serial 号递增编号,设置完成后请重启电脑使能修改:

REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\303A10010101 /V IgnoreHWSerNum /t REG_BINARY /d 01

可以使用 U 盘进行 OTA 升级吗?

可以,使用组件 esp_msc_ota 完成。


ESP32 系列芯片支持 USB 2.0 高速模式 (High Speed: 480 Mbps) 吗?

目前仅 ESP32-P4 支持 USB 2.0 高速模式。


如何提高 ESP32-S3 USB 的传输速率?

  • 要提升 USB 的传输性能,可以使用 USB 批量传输方式,以及增大每包传输的数据量。