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 发布
-
+
首页
esp32s3 作为 USB HOST UAC 读取 CM108A声卡
# 使用 espressif/usb_host_uac 组件指南 ## 概述 Espressif 官方提供了 **`usb_host_uac`** 组件(版本 1.3.3),可以让 ESP32-S3 作为 USB Host 读取 USB 声卡(如 CM108A)的音频数据。 **组件地址:** https://components.espressif.com/components/espressif/usb_host_uac/versions/1.3.3 --- ## 两种方案对比 ### 方案 A:USB Device 模式(当前代码) - ESP32 作为 USB 声卡 - 电脑播放音乐 → ESP32 接收 - 使用 `usb_device_uac` 组件 ### 方案 B:USB Host 模式(新方案) - ESP32 作为 USB 主机 - CM108A 插入 ESP32 → ESP32 读取音频 - 使用 `usb_host_uac` 组件 --- ## 如何使用 usb_host_uac 组件 ### 步骤 1:修改 main/idf_component.yml 将依赖从 `usb_device_uac` 改为 `usb_host_uac`: ```yaml ## IDF Component Manager Manifest File version: "0.2.0" targets: - esp32s3 - esp32p4 dependencies: idf: ">=5.1" espressif/usb_host_uac: version: "1.3.3" ``` ### 步骤 2:创建 USB Host 模式主程序 创建新文件 `main/usb_host_uac_main.c`: ```c #include <stdio.h> #include "esp_err.h" #include "esp_log.h" #include "usb/usb_host.h" #include "usb_host_uac.h" static const char *TAG = "usb_host_uac"; /* 音频数据回调 - 当从 USB 声卡接收到数据时调用 */ static void uac_host_audio_data_cb(uint8_t *buf, size_t len, void *arg) { /* 在这里处理从 CM108A 读取的音频数据 */ ESP_LOGI(TAG, "Received %zu bytes of audio data", len); /* buf: 音频数据指针 */ /* len: 数据长度(字节) */ /* 通常是 16-bit PCM, 48kHz, 立体声 */ /* 示例:打印前几个样本 */ int16_t *samples = (int16_t *)buf; int num_samples = len / 2; for (int i = 0; i < num_samples && i < 10; i++) { ESP_LOGI(TAG, "Sample %d: %d", i, samples[i]); } } /* 设备连接回调 */ static void uac_host_device_connected_cb(usb_host_uac_device_handle_t dev_handle, void *arg) { ESP_LOGI(TAG, "USB Audio device connected!"); /* 可以在这里获取设备信息,如采样率、通道数等 */ } /* 设备断开回调 */ static void uac_host_device_disconnected_cb(usb_host_uac_device_handle_t dev_handle, void *arg) { ESP_LOGI(TAG, "USB Audio device disconnected!"); } void app_main(void) { ESP_LOGI(TAG, "USB Host UAC - Reading CM108A"); ESP_LOGI(TAG, "--------------------------------"); /* 1. 初始化 USB Host 栈 */ ESP_LOGI(TAG, "Initializing USB Host..."); usb_host_config_t host_config = { .skip_phy_setup = false, .intr_flags = ESP_INTR_FLAG_LEVEL1, }; ESP_ERROR_CHECK(usb_host_install(&host_config)); /* 2. 初始化 USB Host UAC 驱动 */ ESP_LOGI(TAG, "Initializing USB Host UAC..."); usb_host_uac_config_t uac_config = { .audio_data_cb = uac_host_audio_data_cb, .device_connected_cb = uac_host_device_connected_cb, .device_disconnected_cb = uac_host_device_disconnected_cb, .cb_ctx = NULL, }; ESP_ERROR_CHECK(usb_host_uac_install(&uac_config)); ESP_LOGI(TAG, "Waiting for USB Audio device (CM108A)..."); /* 主循环 - 处理 USB Host 事件 */ while (1) { usb_host_lib_handle_events(portMAX_DELAY, NULL); vTaskDelay(pdMS_TO_TICKS(10)); } } ``` ### 步骤 3:更新 sdkconfig.defaults.esp32s3 添加 USB Host 配置: ``` # USB Host 配置 CONFIG_USB_HOST_ENABLE=y CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 CONFIG_USB_HOST_HW_BUFFER_BIG=y CONFIG_USB_HOST_HW_BUFFER_BIG_EXTRA=y # 禁用 USB Device 模式(可选) # CONFIG_TINYUSB_ENABLE=n ``` ### 步骤 4:更新 main/CMakeLists.txt 使用新的源文件: ```cmake idf_component_register(SRCS "usb_host_uac_main.c" INCLUDE_DIRS ".") ``` --- ## 硬件连接 ### ESP32-S3 USB Host 接口 要使用 USB Host 模式,需要正确连接硬件: | ESP32-S3 引脚 | 功能 | 说明 | | ------------- | ------ | -------------------------- | | GPIO19 | USB_D- | USB 数据负 | | GPIO20 | USB_D+ | USB 数据正 | | GND | GND | 地线 | | 5V | VBUS | USB 供电(给 CM108A 供电) | ### 注意事项 - CM108A 需要 5V 供电 - 可能需要 USB OTG 适配器或正确的硬件连接 - 某些开发板需要跳帽选择 Host/Device 模式 --- ## 两种方案如何选择 ### 选择 USB Device 模式(当前代码),如果: - ✓ 你有电脑/手机可以播放音乐 - ✓ 你想让 ESP32 接收音频数据 - ✓ 硬件连接简单 ### 选择 USB Host 模式(新方案),如果: - ✓ 你有 CM108A 或其他 USB 声卡 - ✓ 你想让 ESP32 主动读取 USB 声卡 - ✓ 你需要独立的音频采集(不需要电脑) --- ## 如何切换 ### 如果想保留两种方案: 可以将两个主程序都保留,通过 CMakeLists.txt 选择使用哪个: ```cmake # 选择使用哪个模式: # set(MAIN_SRC "usb_uac_main.c") # USB Device 模式 set(MAIN_SRC "usb_host_uac_main.c") # USB Host 模式 idf_component_register(SRCS "${MAIN_SRC}" INCLUDE_DIRS ".") ``` --- ## 参考资源 - 组件页面:https://components.espressif.com/components/espressif/usb_host_uac - ESP-IDF USB Host 文档:https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/usb_host.html - USB Audio Class 规范:https://www.usb.org/documents
qingkai
2026年3月31日 17:10
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码