ESP32
树莓派搭建espidf 开发环境
esp-matter 开发记录
WLED 笔记
esp32s3 作为 USB HOST UAC 读取 CM108A声卡
ESP-IDF USB Host UAC 支持情况
USB Host 与 Device 模式说明
ESP32-S3 UAC设备工作原理分析
espressif/usb_host_uac 组件完整使用指南
USB UAC Host 使用指南
本文档使用 MrDoc 发布
-
+
首页
USB Host 与 Device 模式说明
## 关键概念区别 ### USB Device 模式(当前代码) - **ESP32 充当 USB 设备** - 类似 U 盘、鼠标、键盘、声卡等 - 由 USB 主机(电脑、手机等)控制 ### USB Host 模式 - **ESP32 充当 USB 主机** - 类似电脑、手机等 - 可以连接 USB 设备(U 盘、鼠标、声卡等) --- ## 当前项目:USB Device 模式 ### 工作原理 ``` ┌─────────────┐ USB ┌──────────────┐ │ 电脑/手机 │ ──────────────────> │ ESP32-S3 │ │ (USB Host) │ 音频数据输出 │ (USB Device) │ │ │ │ 模拟声卡 │ └─────────────┘ └──────────────┘ ``` ### 数据流 1. 电脑将 ESP32 识别为 USB 音频设备(UAC) 2. 电脑播放音乐,通过 USB 发送音频数据 3. ESP32 通过 `uac_device_output_cb()` 接收数据 4. 你可以在回调中处理音频数据 ### 适用场景 - 电脑播放音乐,ESP32 接收并处理 - ESP32 作为 USB 声卡使用 - 音频数据在 ESP32 上做分析/处理 --- ## 读取 CM108A 声卡:需要 USB Host 模式 ### 工作原理 ``` ┌─────────────┐ USB ┌──────────────┐ │ ESP32-S3 │ ──────────────────> │ CM108A │ │ (USB Host) │ 读取音频数据 │ (USB Device) │ │ │ │ 声卡 │ └─────────────┘ └──────────────┘ ``` ### 数据流 1. ESP32 作为 USB 主机 2. CM108A 声卡插入 ESP32 的 USB 接口 3. ESP32 识别并枚举 CM108A 4. ESP32 从 CM108A 读取音频数据 ### 适用场景 - ESP32 从 USB 声卡采集音频 - 外部 USB 麦克风/声卡接入 ESP32 - ESP32 作为音频采集器 --- ## 两种模式对比 | 特性 | USB Device 模式(当前) | USB Host 模式(读取 CM108A) | | ------------ | ------------------------ | ---------------------------- | | ESP32 角色 | USB 设备 | USB 主机 | | 对端设备 | 电脑/手机 | CM108A 声卡 | | ESP-IDF 组件 | `tinyusb` (device) | `usb_host` + `usb_host_uac` | | 数据方向 | 电脑 → ESP32 | CM108A → ESP32 | | 主要回调 | `uac_device_output_cb()` | 需要自定义主机回调 | --- ## 如何选择 ### 选择当前代码(USB Device),如果: - ✓ 你有电脑/手机播放音乐 - ✓ 你想让 ESP32 接收这个音频数据 - ✓ 你把 ESP32 当作一个"声卡"来用 ### 需要改用 USB Host 模式,如果: - ✓ 你有 CM108A 或其他 USB 声卡 - ✓ 你想让 ESP32 从这个声卡读取音频 - ✓ 你把 ESP32 当作一个"音频采集器"来用 --- ## 代码结构对比 ### 当前代码(USB Device) ```c // main/usb_uac_main.c #include "usb_device_uac.h" static esp_err_t uac_device_output_cb(uint8_t *buf, size_t len, void *arg) { // 处理从电脑接收的音频数据 return ESP_OK; } void app_main(void) { uac_device_config_t config = { .output_cb = uac_device_output_cb, // ... }; uac_device_init(&config); } ``` ### USB Host 模式(读取 CM108A,示例) ```c // 这是完全不同的代码! #include "usb_host.h" #include "usb_host_uac.h" static void uac_host_data_cb(uint8_t *buf, size_t len) { // 处理从 CM108A 读取的音频数据 } void app_main(void) { // 初始化 USB Host // 安装 UAC Class 驱动 // 等待设备连接 // 读取音频数据 } ``` --- ## 常见问题 ### Q: 可以同时支持两种模式吗? A: ESP32-S3 的 USB OTG 可以在两种模式间切换,但不能同时工作。需要在编译时选择,或者运行时切换。 ### Q: 我的 CM108A 怎么才能和 ESP32 一起用? A: 需要将 ESP32 配置为 USB Host 模式,使用 ESP-IDF 的 USB Host 库和 UAC Host 类驱动。 ### Q: 当前代码可以改造成 Host 模式吗? A: 不行,需要完全重写。USB Device 和 Host 是两套完全不同的 API 和架构。 --- ## 参考文档 - ESP-IDF USB Device 文档: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/usb_device.html - ESP-IDF USB Host 文档: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/usb_host.html - USB Audio Class (UAC) 规范: https://www.usb.org/documents
qingkai
2026年3月31日 17:13
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码