记录5:ESP32S3的usb使用

0、前期准备

1、会使用idf开发环境

2、懂得kconfig

1、知识储备

1.1 概述

​ TingUSB是一个开源的跨平台的USB主机/设备的usb协议栈,常用在mcu开发平台,由于不采用动态分配内存以及阻塞所有中断事件,将中断事件

要处理的事情都放在,非中断函数中处理,因此该usb栈内存设计非常安全、线程非常安全。

1.2 功能架构

​ ESP32S3内部集成了一个USB OTG外设,可配置成主机模式(host)或者设备模式(device),符合usb2.0协议规范。支持全速模式(12Mbit/s)和低速模式(1.5Mbit/s),还支持主机协商协议(HNP)和会话请求协议(SRP)。

设备模式特性

  • 端点 0 永远存在(双向控制,由 EP0 IN 和 EP0 OUT 组成)
  • 6 个附加端点 (1 ~ 6),可配置为 IN 或 OUT
  • 最多 5 个 IN 端点同时工作(包括 EP0 IN)
  • 所有 OUT 端点共享一个 RX FIFO
  • 每个 IN 端点都有专用的 TX FIF

主机模式特性

  • 8 个通道(管道) – 由 IN 与 OUT 两个通道组成的一个控制管道,因为 IN 和 OUT 必须分开处理。仅支持控制传输类型。 – 其余 7 个管道可被配置为 IN 或OUT,支持批量、同步、中断中的任意传输类型。

  • 所有通道共用一个 RX FIFO、一个非周期性 TX FIFO、和一个周期性 TX FIFO。每个 FIFO 大小可配置。

1.4 ESP32S3的tinyUSB使用配置(设备模式)流程介绍

1、使用idf.py新建工程

2、导入tinyUSB组件,导入命令如下:

idf.py add-dependency "leeebo/tinyusb_src^0.16.0~2"

3、设置usb的配置描述符并且注册usb驱动

以下对tinyusb_config_t 结构体进行说明

typedef struct {
   
    union {
   
        const tusb_desc_device_t *device_descriptor;//设备描述符
        const tusb_desc_device_t *descriptor  __attribute__((deprecated));
    };
    const char **string_descriptor;//字符描述
    int string_descriptor_count; //字符描述的数量
    bool external_phy;//是否使用外部phy,一般为false
    const uint8_t *configuration_descriptor; //配置描述符
    bool self_powered;//是否自供电
    int vbus_monitor_io;//自供电电源检测脚
} tinyusb_config_t;

使用例子

tinyusb_config_t ubs_cfg = {
   
    .device_descriptor = NULL,
    .string_descriptor = NULL,
    .external_phy = false,
    .configuration_descriptor = NULL,
};
//一般为空即可,如果默认为空就会使用系统默认配置
//注册驱动
tinyusb_driver_install(&ubs_cfg);

4、初始化usb设备,并且注册相应的驱动

1.5 介绍如何使用ttyACM

以下是参考源码

#include "esp_log.h"
#include "tinyusb.h"
#include "tusb_cdc_acm.h"
#include "tusb_test.h"

void acm_rx_callback(int itf, cdcacm_event_t* event) {
   
    size_t rx_size = 0;
    esp_err_t err = tinyusb_cdcacm_read(itf, acm_buff, CONFIG_TINYUSB_CDC_RX_BUFSIZE, &rx_size);
    if (err == ESP_OK) {
   
        ESP_LOG_BUFFER_HEXDUMP(TAG, acm_buff, rx_size, ESP_LOG_INFO);
    } else {
   
        ESP_LOGE(TAG, "read error(%s:%s)", __FILE__, __func__);
    }
}

void app_main(void) {
   

	tinyusb_config_t ubs_cfg = {
   
        .device_descriptor = NULL,
        .string_descriptor = NULL,
        .external_phy = false,
        .configuration_descriptor = NULL,
    };
    
    ESP_LOGI(TAG, "acm initialzationning ...");

    ESP_ERROR_CHECK(tinyusb_driver_install(&ubs_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 = acm_rx_callback,
        .callback_rx_wanted_char = NULL,
        .callback_line_coding_changed = NULL,
        .callback_line_state_changed = NULL,
    };


    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,
                                                     &line_state_changed_callback));
}

到此esp32s3的使用介绍完毕。

以上是直接使用官方写好的usb设备驱动,但是如果想自定义自己的usb外设的话,可以参考以下步骤:

番外

介绍如何注册自定义的esp32s3 usb设备

1、新建components文件,将espressif__ esp_tinyusb 和 espressif__tinyusb两个组件由managed_components拷贝到components,不然在编译的时候,如果有修改过组件的内容会导致编译不过,或者修改的内容会被覆盖

2、在espressif__tinyusb/src/class新建一个文件夹,名字取自定义usb设备名,如test

3、在test文件夹中新建test_device.c和test_device.h两个设备文件,内容可参考cdc_acm

test_device.c内容参考如下:

#include "tusb_option.h"

#if (CFG_TUD_ENABLED && CFG_TUD_TEST)
#include "device/usbd.h"
#include "device/usbd_pvt.h"

#include "test_device.h"

enum
{
   
  BULK_PACKET_SIZE = (TUD_OPT_HIGH_SPEED ? 512 : 64)
};

/* 该结构体的用途:用于作为通讯节点 */
typedef struct {
   
    uint8_t ep_in;
    uint8_t ep_out;

    tu_fifo_t rx_ff;
    tu_fifo_t t

你可能感兴趣的:(记录5:ESP32S3的usb使用)