赞
踩
USB-OTG:
USB-OTG是一种USB规范,允许嵌入式系统(如手机、平板电脑、单片机系统等)在没有主机(如个人电脑)的情况下直接相互通信,同时也能够作为传统USB主机或设备操作。这意味着一个带有USB-OTG功能的设备可以扮演两种角色:主机角色(Host)和外设/设备角色(Peripheral)。当作为主机时,它可以连接并控制其他USB设备(如U盘、键盘、鼠标等);作为外设时,则可被主机(如PC)控制。USB-OTG的核心在于其双角色能力,以及通过一个micro-AB插口或Type-C接口来自动协商连接设备的角色。
ESP32-S2/S3 等芯片内置 USB-OTG 外设,它包含了 USB 控制器和 USB PHY,支持通过 USB 线连接到 PC,实现 USB Host 和 USB Device 功能。
而ESP32-S3通过USB-OTG接口就可以实现USB虚拟串口(CDC-ACM类)功能。
USB虚拟串口是一种可以让微控制器(如ESP32-S3)通过USB接口与电脑进行串口通信的技术。它的工作原理是在微控制器和电脑之间建立一个虚拟的串口通道,使得电脑可以像操作串口设备一样操作USB设备。同时无需 USB 至 UART 桥,便可直接烧录设备。
ESP-IoT-Solution是一个包含常用外设驱动和代码框架的物联网系统解决方案。它可以作为ESP-IDF的补充组件,让用户能够更轻松地进行开发。
在ESP-IoT-Solution中我们需要使用到TinyUSB这个库,这是 ESP 官方为 USB 打造的一个 USB 驱动库
添加 ESP-IoT-Solution 指定组件到工程目录:可直接在工程的 CMakeLists.txt 中添加以下代码:
set(EXTRA_COMPONENT_DIRS "${EXTRA_COMPONENT_DIRS} ${IOT_SOLUTION_PATH}/components/{component_you_choose}")
或者可以复制 ESP-IoT-Solution 指定组件到工程目录:直接将该组件和其依赖的组件,复制粘贴至工程的 components 文件夹。
我们使用ESP32-S3通过USB提供一个虚拟串口服务,进而实现发送字符串然后接收并回发相同字符串的功能
const tinyusb_config_t tusb_cfg = {
.device_descriptor = NULL,
.string_descriptor = NULL,
.external_phy = false,
.configuration_descriptor = NULL,
};
// 初始化TinyUSB驱动
ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg));
tinyusb_config_cdcacm_t acm_cfg = {
.usb_dev = TINYUSB_USBDEV_0,
.cdc_port = TINYUSB_CDC_ACM_0,
.rx_unread_buf_sz = 64,
.callback_rx = tinyusb_cdc_rx_callback, // 注册接收回调
.callback_rx_wanted_char = NULL,
.callback_line_state_changed = NULL,
.callback_line_coding_changed = NULL
};
// 初始化USB CDC ACM
ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg));
// 回收数据的回调函数
static void tinyusb_cdc_rx_callback(uint8_t itf, uint8_t* data, uint16_t len) {
ESP_LOGI(TAG, "Received %d bytes of data: %.*s", len, len, data);
// 尝试将接收到的数据原样回传
if (tinyusb_cdc_acm_write(itf, data, len) != ESP_OK) {
ESP_LOGE(TAG, "Failed to send received data back");
}
}
tinyusb_cdcacm_register_callback(TINYUSB_CDC_ACM_0, CDC_EVENT_LINE_STATE_CHANGED, &tinyusb_cdc_rx_callback);
#include "esp_log.h" #include "esp_err.h" #include "tinyusb.h" #include "tusb_cdc_acm.h" static const char* TAG = "USB_CDC"; // 回收数据的回调函数 static void tinyusb_cdc_rx_callback(uint8_t itf, uint8_t* data, uint16_t len) { ESP_LOGI(TAG, "Received %d bytes of data: %.*s", len, len, data); // 尝试将接收到的数据原样回传 if (tinyusb_cdc_acm_write(itf, data, len) != ESP_OK) { ESP_LOGE(TAG, "Failed to send received data back"); } } void tud_usb_usart(void) { ESP_LOGI(TAG, "USB initialization"); const tinyusb_config_t tusb_cfg = { .device_descriptor = NULL, .string_descriptor = NULL, .external_phy = false, .configuration_descriptor = NULL, }; // 初始化TinyUSB驱动 ESP_ERROR_CHECK(tinyusb_driver_install(&tusb_cfg)); tinyusb_config_cdcacm_t acm_cfg = { .usb_dev = TINYUSB_USBDEV_0, .cdc_port = TINYUSB_CDC_ACM_0, .rx_unread_buf_sz = 64, .callback_rx = tinyusb_cdc_rx_callback, // 注册接收回调 .callback_rx_wanted_char = NULL, .callback_line_state_changed = NULL, .callback_line_coding_changed = NULL }; // 初始化USB CDC ACM ESP_ERROR_CHECK(tusb_cdc_acm_init(&acm_cfg)); ESP_ERROR_CHECK(tinyusb_cdcacm_register_callback(TINYUSB_CDC_ACM_0, CDC_EVENT_LINE_STATE_CHANGED, &tinyusb_cdc_rx_callback)); ESP_LOGI(TAG, "USB initialization DONE"); } void app_main() { ESP_LOGI(TAG, "App started"); tud_usb_usart(); // 在应用程序启动时初始化USB while(1) { // 应用程序主循环 vTaskDelay(pdMS_TO_TICKS(1000)); // 延时1秒 } }
除了模拟串口,USB-OTG 外设还有许多其他功能。
例如,它可以支持连接 USB 存储设备,让用户轻松扩展设备的存储容量。此外,它还能作为 USB 音频设备,让用户连接耳机或扬声器,享受高质量音乐。另外,它还支持 USB 打印机模式,使用户能够直接从设备上打印文档。此外,USB-OTG 还可以作为方便的文件传输工具,当需要传输数据时,用户可以快速共享文件。还有更多功能…
参考资料
ESP IDF USB设备驱动程序
ESP-IoT-Solution
外设/USB/设备/tusb_serial_device
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。