尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32-S2/S3/P4 自供电 USB 设备 VBUS 检测方案:从电阻分压到 TinyUSB 软件实现

ESP32-S2/S3/P4 自供电 USB 设备 VBUS 检测方案:从电阻分压到 TinyUSB 软件实现 ESP32-S2/S3/P4 自供电 USB 设备 VBUS 检测方案从电阻分压到 TinyUSB 软件实现【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本篇技术指南聚焦 esp-iot-solution 仓库中 自供电 USB 设备解决方案 的核心命题如何在 ESP32-S2/S3/P4 这类内置 USB-OTG 外设的芯片上通过软件检测 5V VBUS 电压以实现自供电设备的可靠热插拔。读完本文你将掌握自供电设备的协议背景、电阻分压硬件设计、ESP-IDF 4.4 与 5.0 两代 TinyUSB 配置方式以及原生 TinyUSB 开发时的 PHY 初始化方法。为什么自供电 USB 设备必须检测 VBUSUSB 设备按供电方式分为两类总线供电设备Bus-powered与自供电设备Self-powered。总线供电设备直接由主机 VBUS 供电。主机断电拔出后设备随即掉电关机天然具备随插随拔的行为无需任何额外的检测逻辑。自供电设备有自己的供电来源电池、电源适配器等即使主机 VBUS 断开设备仍在运行。按照 USB 协议要求这类设备必须通过检测 VBUS 电压来判断主机是否仍然连接进而决定是否进入断开disconnected状态实现标准的热插拔行为。如果自供电设备不做 VBUS 检测主机拔出 USB 后设备会误以为总线仍然有效可能导致枚举状态错乱、功耗异常或在重新插入时无法被主机正确识别。VBUS 检测的两条技术路线USB 设备检测 VBUS 一般有两种方法由 USB PHY 硬件检测PHY 芯片内部集成 VBUS 比较器硬件自动产生 VBUS Valid / Session Valid 等内部信号固件无需干预。借助 ADC/GPIO 由软件检测通过 ADC 采样 VBUS 电压值或通过 GPIO 读取分压后的电平状态由软件判断 VBUS 是否有效。关键限制ESP32-S2/S3/P4 芯片内置的 USB Full-speed PHY 不包含硬件 VBUS 检测逻辑详见 USB PHY/Transceiver 介绍因此这三款芯片上必须采用第二种方案——由软件实现。其中GPIO 检测方法最为简便也是官方文档推荐的首选实现。硬件设计电阻分压电路为什么不能将 VBUS 直接接入 GPIOESP32-S2/S3 的 IO 最大可输入电压为3.3V而 USB VBUS 为5V且这些芯片没有 5V 容忍5V tolerant引脚。直接将 5V 接 GPIO 会损坏芯片。因此必须在硬件上采用电阻分压。分压电路结构官方推荐使用两个 100KΩ 电阻构成分压网络5V VBUS ┌──────┐ ┌──────┐ GND ───────┤ 100K ├─┬──┤ 100K ├────── └──────┘ │ └──────┘ │ GPIOX └───────────────5V VBUS 经两个等值电阻分压后GPIO 检测点电压约为2.5V处于 3.3V 安全范围之内GPIOX 为任意指定 IO避开特殊功能引脚即可该 IO 专用于 VBUS 检测不会占用 USB D/D- 信号线注意ESP32-S2/S3 内部 USB PHY 的 D/D- 固定在 GPIO 20/19详见 USB PHY 介绍VBUS 检测 IO 应避开这些引脚。软件实现一ESP-IDF 4.4 及更早版本对于 ESP-IDF 4.4 及更早版本TinyUSB 组件尚未提供标准的 VBUS 监控接口需要手动将检测 GPIO 信号路由到 USB-OTG 控制器内部。实现步骤如下硬件上按上述电路占用一个额外 IO在tinyusb_driver_install之后调用usbd_vbus_detect_gpio_enable函数使能 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), //set as input mode .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; }代码原理剖析该函数通过 GPIO 矩阵将分压检测点信号同时路由到 USB-OTG 控制器的三个内部输入信号内部信号用途是否取反USB_OTG_VBUSVALID_IN_IDXVBUS 有效指示VBUS Valid否0USB_SRP_BVALID_IN_IDXB 会话有效Session ValidSRP 检测用否0USB_SRP_SESSEND_IN_IDX会话结束Session End用于拔出检测是1其中第三个信号传入了1表示信号取反当 VBUS 存在GPIO 为高时SESSEND信号为低会话未结束当 VBUS 消失GPIO 为低时SESSEND信号拉高控制器据此判定总线会话结束从而感知设备拔出。软件实现二ESP-IDF 5.0 及以上版本从 ESP-IDF 5.0 开始TinyUSB 组件原生支持 VBUS 监控配置不再需要手动调用矩阵路由函数实现更加简洁硬件电路同上两个电阻分压将用于检测 VBUS 的 IO 初始化为 GPIO 输入模式直接将 IO 配置到tinyusb_config_t结构体中该结构体为 ESP-IDF USB Device 驱动标准配置官方文档中 self-powered device 一节有详细说明。#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));配置字段说明字段取值作用self_poweredtrue声明设备为自供电类型驱动据此在配置描述符的bmAttributes中置位自供电标志同时使能 VBUS 监控逻辑vbus_monitor_ioGPIO 编号指定用于检测 VBUS 的 IO驱动内部自动完成 GPIO 初始化与信号路由external_phyfalse使用芯片内置 PHY自供电 VBUS 检测基于内部 PHY 场景设置self_powered true后驱动会在底层完成与 4.4 版本手动函数等价的工作应用层无需再关心esp_rom_gpio_connect_in_signal等细节。原生 TinyUSB 开发方式PHY 初始化阶段配置如果不使用 ESP-IDF 的 TinyUSB 适配层而是直接基于原生 TinyUSB 协议栈开发则需要在USB PHY 初始化阶段完成 VBUS 监控配置。使用 ESP-IDF 提供的USB_PHY_SELF_POWERED_DEVICE()宏构造usb_phy_otg_io_conf_t配置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_PHY_SELF_POWERED_DEVICE(gpio)宏将 VBUS 监控 IO 封装进 OTG IO 配置usb_new_phy()在 PHY 创建阶段即完成 GPIO 到VBUSVALID等内部信号的连接之后tusb_init()启动协议栈即可正常感知热插拔。仓库实战案例usb_msc_wireless_diskesp-iot-solution 仓库中的无线 U 盘示例 usb_msc_wireless_disk 完整实践了上述方案可作对照参考Kconfig 配置项main/Kconfig.projbuild 中提供了VBUS_MONITOR_IO整数配置项允许用户在 menuconfig 中指定 VBUS 监控 GPIO并提示需将 VBUS 连接到电压比较电路以向 ESP32-S2/S3 指示 VBUS 是否有效配置注入main/app_main.c 中通过tusb_cfg.self_powered true;与tusb_cfg.vbus_monitor_io CONFIG_VBUS_MONITOR_IO;完成与上文 ESP-IDF 5.0 完全一致的配置运行时强制控制main/app_http_server.c 中usbd_vbus_enable()借助esp_rom_gpio_connect_in_signal()将GPIO_MATRIX_CONST_ONE_INPUT或GPIO_MATRIX_CONST_ZERO_INPUT连接到USB_OTG_VBUSVALID_IN_IDX实现软件强制拉高/拉低 VBUS 有效信号——这从侧面印证了 4.4 版本方案中矩阵路由覆盖内部信号的底层原理同样适用于 5.0 的驱动内部实现。方案选型与注意事项两种软件实现方式的对比维度ESP-IDF 4.4 及更早ESP-IDF 5.0 及以上配置入口tinyusb_driver_install后手动调用自定义函数tinyusb_config_t结构体字段底层机制esp_rom_gpio_connect_in_signal矩阵路由驱动内部自动完成等价路由代码量需自行实现约 15 行函数仅需两个字段赋值适用场景老版本 IDF 工程新工程推荐使用注意事项务必使用分压电阻ESP32-S2/S3/P4 无 5V 容忍引脚VBUS 直连 GPIO 有损坏风险避开特殊引脚VBUS 检测 IO 应避开 USB D/D- 固定引脚S2/S3 为 GPIO 20/19及其他已被占用或具有特殊功能如 Strapping、RTC 专用等的引脚调用时机4.4 及更早版本的自定义使能函数必须在tinyusb_driver_install之后调用以覆盖驱动默认配置选择 IO 时考虑分压电平的噪声裕量若 PCB 上 5V 走线较长或电源纹波较大可适当调整分压比并配合稍大阻值保证 GPIO 判定的稳定性主从时序检测到 VBUS 掉电后自供电设备应主动完成挂起/断开处理并降低自身功耗等待 VBUS 恢复后重新参与主机枚举。总结自供电 USB 设备的热插拔能力依赖 VBUS 检测而 ESP32-S2/S3/P4 的内置 USB PHY 不具备硬件检测能力因此必须采用电阻分压 GPIO 软件检测方案。在 esp-iot-solution 中该方案已沉淀为清晰的实现路径老版本 IDF 通过usbd_vbus_detect_gpio_enable手动矩阵路由新版本 IDF 直接配置self_powered与vbus_monitor_io字段原生 TinyUSB 则通过USB_PHY_SELF_POWERED_DEVICE宏在 PHY 初始化时完成配置。配合 usb_msc_wireless_disk 示例代码开发者可以快速为自有自供电 USB 产品补齐可靠的插拔检测能力。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表