Stories

Detail Return Return

《ESP32-S3使用指南—IDF版 V1.6》第四十四章 USB虛擬串口(Slave)實驗 - Stories Detail

第四十四章 USB虛擬串口(Slave)實驗

1)實驗平台:正點原子DNESP32S3開發板

2)章節摘自【正點原子】ESP32-S3使用指南—IDF版 V1.6

3)購買鏈接:https://detail.tmall.com/item.htm?&id=768499342659

4)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html

5)正點原子官方B站:https://space.bilibili.com/394620890

6)正點原子DNESP32S3開發板技術交流羣:132780729

本章,我們將向大家介紹如何利用USB在開發板實現一個USB虛擬串口,通過USB與電腦數據數據交互。
本章分為如下幾個小節:
44.1 USB虛擬串口簡介
44.2 硬件設計
44.3 程序設計
44.4 下載驗證

44.1 USB虛擬串口簡介

USB虛擬串口,簡稱VCP,是Virtual COM Port的簡寫,它是利用USB的CDC類來實現的一種通信接口。CDC(Communication Device Class)類是 USB2.0 標準下的一個設備類,定義了通信相關設備的抽象集合。
我們可以利用ESP32自帶的USB功能,來實現一個USB虛擬串口,從而通過USB,實現電腦與ESP32的數據互傳。上位機無需編寫專門的USB程序,只需要一個串口調試助手即可調試,非常實用。

44.2 硬件設計

44.2.1例程功能

本實驗利用ESP32自帶的USB功能,連接電腦USB,虛擬出一個USB串口,實現電腦和開發板的數據通信。本例程功能完全同實驗4(串口通信實驗),只不過串口變成了ESP32的USB虛擬串口。當USB連接電腦(USB線插入USB_SLAVE接口),開發板將通過USB和電腦建立連接,並虛擬出一個串口。
LED閃爍,提示程序運行。USB和電腦連接成功後。

44.2.2硬件資源

1.LED燈
LED -IO0
2.獨立按鍵
KEY0(XL9555) - IO1_7
KEY1(XL9555) - IO1_6
KEY2(XL9555) - IO1_5
KEY3(XL9555) - IO1_4
3.XL9555
IIC_SDA-IO41
IIC_SCL-IO42
4.SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳線帽將IO_SET和LCD_DC相連)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
5.UART_NUM_0(U0TX、U0RX連接至板載USB轉串口芯片上)
U0TXD-IO43
U0RXD-IO44
6.USB

44.2.3原理圖

本章實驗使用USB接口與PC進行連接,開發闆闆載了一個USB接口,用於連接其他USB設備,USB接口與MCU的連接原理圖,如下圖所示:

圖44.2.3.1 USB接口與MCU的連接原理圖

44.3 程序設計

44.3.1 程序流程圖

程序流程圖能幫助我們更好的理解一個工程的功能和實現的過程,對學習和設計工程有很好的主導作用。下面看看本實驗的程序流程圖:

圖44.3.1.1USB虛擬串口實驗程序流程圖

44.3.2 USB虛擬串口函數解析

ESP-IDF提供了一套API來配置USB。要使用此功能,需要導入必要的頭文件:

#include"tinyusb.h"
#include"tusb_cdc_acm.h"

接下來,作者將介紹一些常用的ESP32-S3中的USB函數,這些函數的描述及其作用如下:
1,USB設備登記
該函數用給定的配置,來配置USB設備,該函數原型如下所示:

esp_err_ttinyusb_driver_install(consttinyusb_config_t *config);

該函數的形參描述如下表所示:

表44.3.2.1tinyusb_driver_install ()函數形參描述
該函數的返回值描述,如下表所示:

表44.3.2.2函數tinyusb_driver_install()返回值描述
該函數使用tinyusb_config_t類型的結構體變量傳入,該結構體的定義如下所示:

表44.3.2.3i2s_pin_config_t結構體參數值描述
完成上述結構體參數配置之後,可以將結構傳遞給 tinyusb_driver_install () 函數,用以安裝USB驅動。
2,USB設備初始化
該函數用給定的配置,來初始化USB設備,該函數原型如下所示:

esp_err_ttusb_cdc_acm_init(consttinyusb_config_cdcacm_t *cfg);

該函數的形參描述如下表所示:

表44.3.2.4tusb_cdc_acm_init ()函數形參描述
該函數的返回值描述,如下表所示:

表44.3.2.5函數tusb_cdc_acm_init ()返回值描述
該函數使用tinyusb_config_cdcacm_t類型的結構體變量傳入,該結構體的定義如下所示:

表44.3.2.6tinyusb_config_cdcacm_t結構體參數值描述
完成上述結構體參數配置之後,可以將結構傳遞給 tusb_cdc_acm_init () 函數,用以實例化USB。
3,註冊回調函數
該步驟用以註冊回調函數,該函數原型如下所示:

esp_err_ttinyusb_cdcacm_register_callback(tinyusb_cdcacm_itf_titf,
                                            cdcacm_event_type_t event_type);

該函數的形參描述如下表所示:

表44.3.2.7tinyusb_cdcacm_register_callback ()函數形參描述
該函數的返回值描述,如下表所示:

表44.3.2.8 函數tinyusb_cdcacm_register_callback()返回值描述
4,發送數據1
該函數將數據從字節數組寫入寫入緩衝區,該函數原型如下所示:

size_ttinyusb_cdcacm_write_queue(tinyusb_cdcacm_itf_titf,
                                  const uint8_t *in_buf,
                                  size_tin_size);

該函數的形參描述如下表所示:

表44.3.2.9tinyusb_cdcacm_write_queue ()函數形參描述
該函數的返回值描述,如下表所示:

表44.3.2.10 函數tinyusb_cdcacm_write_queue()返回值描述
5,發送數據2
該函數從寫緩衝區發送所有數據,該函數原型如下所示:

esp_err_ttinyusb_cdcacm_write_flush(tinyusb_cdcacm_itf_titf,
                                     uint32_ttimeout_ticks);

該函數的形參描述如下表所示:

表44.3.2.11tinyusb_cdcacm_write_flush ()函數形參描述
該函數的返回值描述,如下表所示:

表44.3.2.12 函數tinyusb_cdcacm_write_flush()返回值描述

44.3.3 USB虛擬串口驅動解析

在IDF版的33_usb_uart例程中,作者在33_usb_uart\components路徑下新增了USB驅動文件。
這裏我們只講解核心代碼,詳細的源碼請大家參考光盤本實驗對應源碼。
本實驗,我們將相TinyUSB庫文件拷貝到components文件夾下,在APP文件夾下的文件則是我們基於TinyUSB自行編寫的代碼。最終得到如下圖所示的工程:

圖44.3.3.1 USB虛擬串口工程分組
上圖中位於components文件夾下的是我們自己編寫的一些外設驅動,main文件夾下包含了一個APP文件與一個後綴為.yml的文件。APP文件夾下包含的是USB模擬串口代碼,而後綴為.yml的文件其主要作用是將項目中各組件的依賴項定義在單獨的清單文件中,並以上圖所示的方式進行命名。在我們的例程中提現出的作用就是簡化了整個工程結構。我們在編譯的過程中,系統便會幫我們自動生成USB外設所需要的依賴庫:espressif_esp_tinyusb以及espressif_tinyusb。做到了即能簡化項目工程,又能有效規避了在編譯中遇到的錯誤,但前提是運行時得確保個人的電腦處於聯網狀態。

44.3.4 CMakeLists.txt文件

打開本實驗BSP下的CMakeLists.txt文件,其內容如下所示:

set(src_dirs
            IIC
            LCD
            LED
            SPI
            XL9555)
set(include_dirs
            IIC
            LCD
            LED
            SPI
            XL9555)
set(requires
            driver)
idf_component_register(SRC_DIRS${src_dirs}
INCLUDE_DIRS ${include_dirs}REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)

該路徑下的CmakeList文件並沒有新增內容,主要變化在於main文件。
打開本實驗main文件下的CMakeLists.txt文件,其內容如下所示:

idf_component_register(
    SRC_DIRS
        "."
        "app"
    INCLUDE_DIRS
        "."
        "app")

上述的紅色app驅動需要由開發者自行添加,以確保USB驅動能夠順利集成到構建系統中。這一步驟是必不可少的,它確保了USB驅動的正確性和可用性,為後續的開發工作提供了堅實的基礎。

44.3.5 實驗應用代碼

打開main/main.c文件,該文件定義了工程入口函數,名為app_main。該函數代碼如下。

i2c_obj_ti2c0_master;
/**
* @brief      程序入口
* @param      無
* @retval     無
*/
voidapp_main(void)
{
    esp_err_t ret;
    ret =nvs_flash_init();                             /* 初始化NVS */
   
if (ret ==ESP_ERR_NVS_NO_FREE_PAGES ||
       ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret =nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    led_init();                                           /* 初始化LED */
    i2c0_master =iic_init(I2C_NUM_0);                    /* 初始化IIC0 */
    spi2_init();                                          /* 初始化SPI */
    xl9555_init(i2c0_master);                               /* 初始化IO擴展芯片 */  
    lcd_init();                                           /* 初始化LCD */
   
    /* 顯示實驗信息 */
    lcd_show_string(30, 50, 200, 16, 16, "ESP32-S3", RED);
    lcd_show_string(30, 70, 200, 16, 16, "USBUSART TEST", RED);
    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    tud_usb_usart();                                     /* USB初始化 */
   
    while(1)
    {
        LED_TOGGLE();
        vTaskDelay(500);
    }
}

此部分代碼比較簡單,通過tud_usb_usart()等函數初始化USB,在該函數中需要註冊一個調用CDC事件的回調函數。此時,如果回調已經註冊,那麼它將會被覆蓋。同時,LCD顯示實驗信息,LED閃爍以示程序正在運行。

44.4 下載驗證

本例程的測試,不需要安裝特定的USB驅動,開發者只需用數據線將USB接口(不是UART接口)與PC端連接起來即可,並打開串口助手,選擇對應的端口號進行數據發送操作。我們打開設備管理器(我用的是WIN10),在端口(COM和LPT)裏面可以發現多出了一個COM8的設備,這就是USB虛擬的串口設備端口,如圖44.3.1所示:

圖44.4.1 通過設備管理器查看USB虛擬的串口設備端口
如圖44.4.1,ESP32通過USB虛擬的串口,被電腦識別了,端口號為:COM8(可變),字符串名字為:USB串行設備(COM8)。此時,開發板的LED閃爍,提示程序運行,如圖44.4.2所示:

圖44.4.2 USB虛擬串口連接成功
然後我們打開XCOM,選擇COM8(需根據自己的電腦識別到的串口號選擇),並打開串口(注意:波特率可以隨意設置),就可以進行測試了,如圖44.4.3所示:

圖44.4.3 ESP32虛擬串口通信測試
可以看到,我們的串口調試助手,按發送按鈕,可以收到電腦發送給ESP32的數據(原樣返回),説明我們的實驗是成功的。
至此,USB虛擬串口實驗就完成了,通過本實驗,我們就可以利用ESP32的USB,直接和電腦進行數據互傳了,具有廣泛的應用前景。

user avatar rivers_chaitin Avatar keen_626105e1ef632 Avatar
Favorites 2 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.