ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ESP IoT Solution 之 ESP USB 外设综述:从协议、控制器到芯片选型与开发方案的完整指南

ESP IoT Solution 之 ESP USB 外设综述:从协议、控制器到芯片选型与开发方案的完整指南 ESP IoT Solution 之 ESP USB 外设综述从协议、控制器到芯片选型与开发方案的完整指南【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本篇指南以 ESP-IoT-Solution 仓库中docs/zh_CN/usb/usb_overview/系列文档为骨架系统梳理 ESP32-S2/S3/C3/C6/P4 等芯片内置的 USB OTG、USB-Serial-JTAG 与 USB PHY 外设的架构、电气特性、传输能力与开发要点。读完本文你将掌握各芯片 USB 外设支持差异、USB 控制器与 PHY 的选型依据、固件下载与调试的多种途径以及结合本仓库components/usb与examples/usb的实际开发路径。USB 协议与标准体系速览USBUniversal Serial Bus通用串行总线是一种连接主机Host与外设Device的总线标准通过 USB 接口实现数据传输与电源供给。USB-IFUSB Implementers Forum是 USB 标准的制定者其标准覆盖 USB 1.1、USB 2.0、USB 3.0 等版本并定义了接口的物理层、数据链路层、传输层、会话层、表示层等协议以及 USB 设备类Device Class规范。常见设备类包括HIDHuman Interface Device人机接口设备键盘、鼠标、手柄等MSCMass Storage Class大容量存储U 盘、读卡器等CDCCommunication Device Class通信设备虚拟串口、网卡等Audio / VideoUSB 声卡、摄像头等。乐鑫 ESP32-S2/S3/C3/P4 等芯片均已内置 USB-OTG 或 USB-Serial-JTAG 外设可支撑 USB 多媒体、通信、存储、人机交互等多类应用。相关完整目录结构可参见 docs/zh_CN/usb/usb_overview/index.rst该索引页还指向 USB OTG、USB Serial JTAG、USB PHY、VID/PID、Host/Device 方案、信号质量测试、TinyUSB 指南与 Type-C 硬件设计等专题文档。USB 解决方案总览USB 电气属性与接口设计要点以最常用的 Type-A 接口为例USB 电气属性如下表所示PinNameCable colorDescription1VBUS红Red5V2D-白WhiteData-0 或 3.3V3D绿GreenData0 或 3.3V4GND黑BlackGround设计 USB 接口电路时需要注意对于自供电设备需要使用 1 个额外 IO 检测 VBUS 电压用于检测设备是否拔出详见下文自供电设备的 VBUS 检测与 usb_device_self_power.rstD- / D 接反不会损坏硬件但主机将无法识别设备。USB-OTG 控制器Host / Device 双模式核心USB OTG 控制器是指同时具备 USB-OTG、USB Host 与 USB Device 三种模式的控制器支持模式协商与切换。本仓库文档将控制器细分为两类Full-speed 与 High-speed 控制器USB OTG Full-speed 控制器支持 Full-speed12Mbps与 Low-speed1.5Mbps两种速率兼容 USB 1.1 与 USB 2.0 协议。ESP-IDF 从 v4.4 起已内置 USB Host 与 USB Device 协议栈及各类设备类驱动支持用户二次开发。USB OTG High-speed 控制器支持 High-speed480Mbps、Full-speed12Mbps与 Low-speed1.5Mbps三种速率兼容 USB 2.0 协议。ESP-IDF 从 v5.5 开始ESP32-P4 原本独立的 USB PHY 实现已合并至与 S2/S3 共用的 PHY 模块统一驱动结构简化维护。传输类型与理论有效速率USB OTG Full Speed 总线速率为 12Mbps但由于存在校验与同步机制实际有效速率低于总线速率且与传输类型强相关传输类型控制Control中断Interrupt批量Bulk同步Isochronous适用场合设备初始化和管理鼠标和键盘打印机和批量存储流式音频和视频支持低速有有无无校验重传有有有无保证传输速度无无无有使用固定带宽有10%有90%无有90%减少延迟时间无有无有传输的最大尺寸64 字节64 字节64 字节~512 字节每毫秒传输包数量*1191理论有效速率*64000 Bytes/s1216000 Bytes/s512000 Bytes/s对于 ESP32-P4 的 USB-OTG High Speed480Mbps在最大传输尺寸、每毫秒微帧传输包数量与理论有效速率上与 Full Speed 有明显差异传输类型控制Control中断Interrupt批量Bulk同步Isochronous传输的最大尺寸64 字节1024 字节512 字节1024 字节每微帧传输包数量*6137理论有效速率*49152000 Bytes/s53248000 Bytes/s57344000 Bytes/s传输速率计算公式传输速率 (Bytes/s) 传输的最大尺寸 × 每微帧传输包数量 × 8000。控制传输用于传输设备控制信息包含多个阶段其有效速率需按协议栈实现计算。用 USB OTG Console 下载固件与打印 LOGESP32-S2/S3 等内置 USB-OTG 外设的芯片其 ROM Code 内置了 USB 通信设备类CDC功能可替代 UART 实现 Log、Console 与固件下载。USB OTG Console 默认为关闭状态首次使用需在menuconfig中使能并编译固件然后拉低 Boot 引脚并连接 USB 线进入下载模式Windows 下显示为COM*Linux 为/dev/ttyACM*MacOS 为/dev/cu*再用 esptool 或idf.py flash指定串口下载初次下载完成后 USB OTG Console 自动使能LOG 将从该虚拟串口打印此后无需手动拉低 Boot 引脚esptool 会通过 USB 控制协议自动 Reset 设备并切换至下载模式。用 USB DFU 下载固件ESP32-S2/S3/P4 等芯片的 ROM Code 内置 USB DFUDevice Firmware Upgrade功能可实现标准 DFU 下载模式每次下载前需手动拉低 Boot 引脚进入下载模式在工程目录运行idf.py dfu生成 DFU 固件再用idf.py dfu-flash下载存在多个 DFU 设备时可用idf.py dfu-list查看设备列表并用idf.py dfu-flash --path path指定下载端口。注意对于 ESP32-P4 v3.1 及以上版本DFU 下载功能存在缺陷可能导致下载失败建议改用 USB Serial/JTAG 方式下载固件。USB Host 与 USB Device 开发USB HostUSB-OTG 外设支持主机功能可直接连接外部 USB 设备。ESP-IDF v4.4 起支持 USB Host Driver乐鑫官方已支持 USB Host HID、MSC、CDC、UVC 等设备类驱动详见 usb_host_solutions.rstUSB Device乐鑫官方适配了 TinyUSB 协议栈可直接开发 HID、MSC、CDC、ECM、UAC 等标准或自定义设备详见 usb_device_solutions.rst。动态切换模式与主动断开动态切换可通过动态注册/注销 USB Host Driver 或 USB Device Driver实现 USB-OTG 外设模式切换参考本仓库 examples/usb/otg 目录下的手动切换示例主动断开将 USB OTG VBUSVALID 信号拉低即可主动断开与主机的连接重新挂载时至少需要等待 10ms。USB-Serial-JTAG 控制器下载、调试、Log 三合一USB-Serial-JTAG Controller是同时具有 USB Serial 与 USB JTAG 功能的专用 USB 控制器支持固件下载、Log 打印、CDC 传输与 JTAG 调试它不支持修改 USB 功能或描述符等二次开发详见 usb_serial_jtag.rst。集成了该外设的芯片包括 ESP32-S3、ESP32-C3、ESP32-C6、ESP32-P4 等。驱动安装Linux 与 MacOS 无需手动安装驱动Windows 10 及以上联网自动安装Windows 7/8 需手动安装驱动。若安装失败可使用 Zadig 工具对USB JTAG/serial debug unit (Interface 0)选择usbser或USB Serial (CDC)驱动对USB JTAG/serial debug unit (Interface 2)选择WinUSB驱动。固件下载默认情况下 USB-Serial-JTAG 下载功能处于使能状态直接连接 USB 线后用 esptool 或idf.py flash指定对应串口即可下载期间 esptool 自动 Reset 并切换下载模式若应用程序把 USB 引脚用作普通 GPIO 或其它外设 IOUSB-Serial-JTAG 将无法与主机建立连接必须通过 Boot 引脚手动进入下载模式——因此硬件设计时必须引出 Boot 引脚默认情况下Windows 会依据设备序列号递增 COM 编号可能影响量产烧录解决方案见 usb_device_const_COM.rst。JTAG 调试与 LOG 打印调试仅需 USB 线连接 PC使用 OpenOCD 即可通过内置 JTAG 接口调试代码LOG通过menuconfig → Component config → ESP System Settings → Channel for console secondary output使能 USB-Serial-JTAG LOG 功能之后用idf.py monitor或串口工具即可查看。注意仅在主机接入后才初始化并打印 LOG该 LOG 功能在 deep sleep 与 light sleep 下不可用睡眠场景请改用 UART。将 USB 引脚用作普通 GPIOUSB D 默认上拉 USB 电阻导致其常为高电平用作 GPIO 时需注意ESP-IDF v4.4 及以后版本 GPIO 驱动默认禁用 USB D 上拉电阻无需额外配置也可通过寄存器USB_SERIAL_JTAG.conf0.dp_pullup 0;禁用上拉电阻在上电时刻即存在若需上电后 D 立即为低电平需在硬件上通过外部电路拉低。若之后需要恢复 USB-Serial-JTAG 功能可按如下方式操作寄存器含内外 PHY 兼容处理#include soc/soc_caps.h #include soc/usb_serial_jtag_reg.h #include hal/usb_serial_jtag_ll.h SET_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_PAD_PULL_OVERRIDE); CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_DP_PULLUP); SET_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_DP_PULLDOWN); vTaskDelay(pdMS_TO_TICKS(10)); #if USB_SERIAL_JTAG_LL_EXT_PHY_SUPPORTED usb_serial_jtag_ll_phy_enable_external(false); // Use internal PHY usb_serial_jtag_ll_phy_enable_pad(true); // Enable USB PHY pads #else usb_serial_jtag_ll_phy_set_defaults(); // External PHY not supported. Set default values. #endif CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_DP_PULLDOWN); SET_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_DP_PULLUP); CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_PAD_PULL_OVERRIDE);USB PHY信号转换与总线驱动USB Full-speed PHY也称 USB Full-speed Transceiver负责将 USB 控制器的数字信号转换为 USB 总线信号电平提供总线驱动能力、检测接收错误等并连接到芯片固定 IO 引脚详见 usb_phy.rst。ESP32-P4 额外内置一个 USB High-speed PHY。内部 PHY 与固定 GPIOESP32-S2/S3/C3 无需外接 PHY 芯片即可通过 D/D- 直接通信。但对于集成两个 USB 控制器的芯片如 ESP32-S3 内置 USB-OTG 与 USB-Serial-JTAG两者共用同一个内部 PHY同一时间只能有一个工作。内部 USB-PHY 对应固定 GPIO 如下DD-ESP32-S22019ESP32-S32019ESP32-C31918ESP32-C61312ESP32-P4 内置两个 USB Full-speed PHY 与一个 USB High-speed PHY引脚分配如下DD-ESP32-P4 FS_PHY12524ESP32-P4 FS_PHY22726ESP32-P4 HS_PHYpin 50pin 49默认情况下 FS_PHY1 连接 USB 串行/JTAG 控制器、FS_PHY2 连接 OTG_FS可通过EFUSE_USB_PHY_SEL更改连接关系0FS_PHY1 连串行/JTAG、FS_PHY2 连 OTG_FS1互换。ESP32-S3 双 USB 控制器共用 PHY 结构使用外部 PHYESP32-S2/S3通过增加一个外部 PHY支持 SP5301 或同等功能芯片可实现 USB-OTG 与 USB-Serial-JTAG两个外设同时工作。注意使用外部 USB PHY 将占用至少 6 个 GPIO。PHY 默认配置与修改对同时具备 USB-OTG 与 USB-Serial-JTAG 的芯片默认 USB-Serial-JTAG 连接内部 PHY可直接下载/调试无需配置初始化 USB Host Driver 或 TinyUSB 协议栈时PHY 连接会自动切换为 USB-OTG该模式下如需下载需手动 Boot 到下载模式方法 1寄存器Host Driver / TinyUSB 内部通过配置 USB PHY 寄存器完成切换方法 2eFuse烧写usb_phy_sel位为 1将 PHY 默认连接切换为 USB-OTG。仅当需要在 Boot 模式下使用 USB-OTG如 USB DFU时才需要烧写烧写后不可恢复且 USB-Serial-JTAG 在 Boot 模式将不可用。特别注意对 DateCode 2219 生产、EFUSE_DIS_USB_OTG_DOWNLOAD_MODE已烧写为 1 的 ESP32-S3 模组/开发板若再烧写usb_phy_sel为 1将导致 Boot 模式下 USB-Serial-JTAG 与 USB-OTG 下载功能均不可用。芯片 USB 外设支持矩阵各芯片的 USB 外设支持情况如下√SupportedXNot SupportedUSB OTG High-speedUSB OTG Full-speedUSB-Serial-JTAGFull-speed PHYHigh-speed PHYESP32-P4√√√√√ESP32-S3X√√√XESP32-S2X√X√XESP32-C6XX√√XESP32-C3XX√√XESP32-C2XXXXXESP32XXXXXESP8266XXXXX各芯片 USB 功能逐一看ESP32-S2内置 USB OTG Full-speed Controller 与 USB Full-speed PHY是 USB Host/Device 开发的主力平台之一ESP32-C3内置 USB-Serial-JTAG Controller 与 USB Full-speed PHY聚焦下载、调试与 CDC 传输ESP32-S3内置两个控制器USB OTG Full-speed USB-Serial-JTAG与一个 Full-speed PHY。内部 PHY 默认连接 USB-Serial-JTAG可通过烧写 eFuse 修改默认或配置寄存器动态切换也可通过外接 PHY 同时启用两个控制器ESP32-P4内置三个控制器USB OTG High-speed USB OTG Full-speed USB-Serial-JTAG与一个 High-speed PHY、两个 Full-speed PHY是当前仓库中 USB 能力最完整的芯片。仓库中的 USB 组件与示例从方案到落地围绕上述外设本仓库在 components/usb 目录下沉淀了可直接复用的组件USB Host 侧iot_usbhUSB Host 基础驱动、iot_usbh_cdc、iot_usbh_ecm、iot_usbh_modem、iot_usbh_rndis4G/ECM/RNDIS 上网、usb_streamUVC/UAC 音视频流USB Device 侧esp_tinyuf2虚拟 U 盘与 UF2 拖拽 OTA、esp_msc_otaU 盘 OTA、usb_device_uacUSB 音频设备、usb_device_uvcUSB 视频设备。examples/usb 下提供 host、device、otg 三类的完整可编译示例Host 侧覆盖 USB 摄像头、USB 音频、4G 拨号PPP/RNDIS/ECM、U 盘存储、USB Hub 多设备Device 侧覆盖 UAC 音频、UVC 视频、MSC 无线 U 盘、HID 键盘鼠标、UF2 NVS 读写与 OTA、USB 扩展屏等。需要快速上手时可直接在这些示例上修改描述符与业务逻辑详细方案能力边界参见 usb_host_solutions.rst 与 usb_device_solutions.rst。USB VID/PID 与认证VID 与 PID 是 USB 设备的唯一标识符一般由 USB-IF 分配详见 usb_vid_pid.rst免申请场景产品仅使用 USB Host 模式无需申请产品使用 Device 模式且采用乐鑫 VID0x303A、基于 TinyUSB 开发标准设备时可直接使用 TinyUSB 默认 PID申请场景若需 USB-IF 分配的 VID需先注册成为 USB-IF 成员若考虑使用乐鑫 VID可直接免费申请 PID使用乐鑫 VID 与 TinyUSB 默认 PID 并不意味着产品符合 USB 规范仍须进行 USB 认证USB 认证由 USB-IF 管理属于可选流程但产品若标注符合 USB 规范并使用官方 USB 标志、商标或宣传资料提及 USB 认证则必须进行认证。信号质量测试的详细步骤与固件见 usb_signal_quality.rst。自供电设备的 VBUS 检测按照 USB 协议要求USB 自供电设备必须通过检测 5V VBUS 电压判断设备是否拔出以实现热插拔主机供电设备断电即掉电关机无需该逻辑。VBUS 检测通常有两种方式PHY 硬件检测或 ADC/GPIO 软件检测。由于 ESP32-S2/S3/P4 内部 USB PHY 不支持硬件检测需借助软件实现。ESP-IDF v4.4 及更早版本硬件上用两个电阻如各 100KΩ分压后将 VBUS 信号引入任意 GPIO注意 IO 最大输入 3.3V并在tinyusb_driver_install之后调用如下函数使能 VBUS 检测/** * brief For USB Self-power device, the VBUS voltage must be monitored to achieve hot-plug, * The simplest solution is detecting GPIO level as voltage signal. * A divider resistance Must be used due to ESP32S2/S3/P4 has no 5V tolerate pin. * * 5V VBUS ┌──────┐ ┌──────┐ GND * ───────┤ 100K ├─┬──┤ 100K ├────── * └──────┘ │ └──────┘ * │ GPIOX * └─────────────── * The API Must be Called after tinyusb_driver_install to overwrite the default config. * param gpio_num, The gpio number used for vbus detect */ static void usbd_vbus_detect_gpio_enable(int gpio_num) { gpio_config_t io_conf { .intr_type GPIO_INTR_DISABLE, .pin_bit_mask (1ULLgpio_num), .mode GPIO_MODE_INPUT, .pull_up_en 0, .pull_down_en 0, }; gpio_config(io_conf); esp_rom_gpio_connect_in_signal(gpio_num, USB_OTG_VBUSVALID_IN_IDX, 0); esp_rom_gpio_connect_in_signal(gpio_num, USB_SRP_BVALID_IN_IDX, 0); esp_rom_gpio_connect_in_signal(gpio_num, USB_SRP_SESSEND_IN_IDX, 1); return; }ESP-IDF v5.0 及以上版本将检测 IO 初始化为 GPIO 输入后直接配置到tinyusb_config_t中#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);完整说明见 usb_device_self_power.rst。量产难题阻止 Windows 依据序列号递增 COM 编号Windows 通过 VID、PID 与 Serial 号识别 USB 设备任一参数变化都会被视为新硬件并分配不同 COM 端口。ESP ROM Code 中 USB 描述符配置如下详见 usb_device_const_COM.rstESP32S2ESP32S3ESP32C3ESP32C5ESP32C6ESP32C61ESP32H2ESP32P4Interfaceusb-otgusb-serial-jtagusb-serial-jtagusb-serial-jtagusb-serial-jtagusb-serial-jtagusb-serial-jtagusb-serial-jtagVID0x303a0x303a0x303a0x303a0x303a0x303a0x303a0x303aPID0x00020x10010x10010x10010x10010x10010x10010x1001Revision (bcdDevice)N/Av1.01v1.01v1.02v1.02v1.02v1.02v1.02Serial0MAC 地址字符串MAC 地址字符串MAC 地址字符串MAC 地址字符串MAC 地址字符串MAC 地址字符串MAC 地址字符串ESP32-S2usb-otgSerial 为常量 0每台设备相同COM 号一致ESP32-S3 及其它 usb-serial-jtag 芯片 Serial 为设备 MAC 地址各不相同COM 号默认递增给量产烧录带来额外工作。解决方案以管理员身份打开 Windows CMD 执行以下命令Windows 10/11阻止依据 Serial 号递增编号设置完成后重启电脑生效REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\303A10010101 /V IgnoreHWSerNum /t REG_BINARY /d 01 REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\303A10010102 /V IgnoreHWSerNum /t REG_BINARY /d 01也可以右键以管理员身份运行仓库附带的脚本 docs/_static/ignore_hwserial_usb_serial_jtag.batWindows 7 等其它版本请使用 docs/_static/ignore_hwserial_usb_serial_jtag_win7.bat。总结与进一步阅读本文以 USB 协议为起点梳理了 ESP32 系列芯片 USB-OTG、USB-Serial-JTAG 与 USB PHY 三大外设的架构、速率能力、引脚与切换机制并给出了固件下载、调试、自供电 VBUS 检测与量产 COM 编号等关键实操方案。进一步深入可继续阅读本仓库的以下专题文档USB OTG 外设介绍传输类型速率细节与 OTG 模式动态切换USB Serial JTAG 外设介绍驱动安装与调试配置USB PHY 介绍内外 PHY 选型与 eFuse 切换USB Host 方案 与 USB Device 方案摄像头、音频、4G、存储、扩展屏等具体方案能力与硬件要求TinyUSB 库使用指南 与 基于原生 TinyUSB 开发指南设备描述符与类驱动的开发细节USB 信号质量测试 与 USB Type-C 硬件设计指南硬件与合规层面的收尾工作。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表