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),仅供参考

相关新闻

神经网络信道译码:从BP展开到NBP的工程实践与评估

神经网络信道译码:从BP展开到NBP的工程实践与评估

简介:基于神经网络的信道译码是通信与机器学习交叉领域的热点方向。该综述PDF从研究综述角度系统梳理了神经网络、深度学习、机器学习、数据建模等核心技术在此方向中的应用逻辑与最新进展,内容结构由基础原理到应用前景逐层展开,面向通信工程…

2026/9/19 16:05:13 阅读更多 →
first-contributions 信德语指南解读:从 Fork 到 Pull Request 的首次开源贡献完整工作流

first-contributions 信德语指南解读:从 Fork 到 Pull Request 的首次开源贡献完整工作流

first-contributions 信德语指南解读:从 Fork 到 Pull Request 的首次开源贡献完整工作流 【免费下载链接】first-contributions 🚀✨ Help beginners to contribute to open source projects 项目地址: https://gitcode.com/gh_mirrors/fi/first-cont…

2026/9/19 16:05:13 阅读更多 →
脊柱手术机器人神经规避与紧急制动系统设计解析

脊柱手术机器人神经规避与紧急制动系统设计解析

简介:一份文档系统梳理脊柱手术机器人安全策略设计,重点围绕术中神经规避算法与机械臂紧急制动系统,适用对象为医疗机器人研发工程师、手术导航算法研究者及机器人安全设计学习者。全文共515页、42个大章节,支持目录章节跳转与书签…

2026/9/20 17:57:43 阅读更多 →

最新新闻

Agent 跑 Loop 时目标漂移、token 爆炸?TaoToken 通道下这样设停止条件

Agent 跑 Loop 时目标漂移、token 爆炸?TaoToken 通道下这样设停止条件

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:06:09 阅读更多 →
如何用 AssetRipper 从 Unity 游戏提取 3D 模型与纹理

如何用 AssetRipper 从 Unity 游戏提取 3D 模型与纹理

如何用 AssetRipper 从 Unity 游戏提取 3D 模型与纹理 【免费下载链接】AssetRipper GUI application to analyze game files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper AssetRipper 是一款图形化的 Unity 游戏文件分析与资源提取工具。它能从 .as…

2026/9/20 18:06:09 阅读更多 →
DeepSeek 论文逻辑漏洞检测,Base URL 填 TaoToken 的 API 地址

DeepSeek 论文逻辑漏洞检测,Base URL 填 TaoToken 的 API 地址

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:06:09 阅读更多 →
Lucky 三步接入巴法云、点灯科技,语音助手控制家里的设备

Lucky 三步接入巴法云、点灯科技,语音助手控制家里的设备

Lucky 三步接入巴法云、点灯科技,语音助手控制家里的设备 【免费下载链接】lucky 软硬路由公网神器,ipv6/ipv4 端口转发,反向代理,DDNS,WOL,ipv4 stun内网穿透,cron,acme,rclone,ftp,webdav,filebrowser 项目地址: https://gitcode.com/GitHub_Trending/luc/lucky…

2026/9/20 18:06:09 阅读更多 →
Scrapling:一套 Python 网页抓取框架覆盖静态请求、JS 渲染与 Cloudflare 验证

Scrapling:一套 Python 网页抓取框架覆盖静态请求、JS 渲染与 Cloudflare 验证

Scrapling:一套 Python 网页抓取框架覆盖静态请求、JS 渲染与 Cloudflare 验证 【免费下载链接】Scrapling 🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Dont be shy, join here: h…

2026/9/20 18:06:09 阅读更多 →
答案格式总不对?TaoToken 这样查 GSM8K 评测请求链路

答案格式总不对?TaoToken 这样查 GSM8K 评测请求链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 18:05:09 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →