0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Mini-F0160實(shí)現(xiàn)USB轉(zhuǎn)3路虛擬串口

冬至子 ? 來源:靈動(dòng)MM32MCU ? 作者:靈動(dòng)MM32 ? 2023-05-24 15:17 ? 次閱讀

** 什么是 CDC 設(shè)備**

CDC 類是 USB 通信設(shè)備類 (Communication Device Class)的簡稱。由 USB 組織定義的專門給各種通信設(shè)備使用的 USB 子類。

通常,CDC類由兩個(gè)接口子類組成:

通信接口 (Communication Interface Class)

主要用于主機(jī)對(duì)設(shè)備進(jìn)行管理和控制,它包含一個(gè)控制類型的端點(diǎn)和一個(gè)可選的中斷類型端點(diǎn)。

該控制類型端點(diǎn) 0 一般用作請求,可以用于配置 USB 設(shè)備枚舉虛擬串口的波特率、數(shù)據(jù)類型的設(shè)置,比如數(shù)據(jù)長度、停止位等。在虛擬串口應(yīng)用中,該操作并不一定需要具體實(shí)現(xiàn)。因?yàn)橹鳈C(jī)與設(shè)備在物理上通過 USB 總線進(jìn)行通信,與串口并沒有關(guān)系,在虛擬化過程中,起決定性作用的是串口驅(qū)動(dòng),該驅(qū)動(dòng)將每一條具體的虛擬串口操作對(duì)應(yīng)到實(shí)際上的USB操作。同時(shí),主機(jī)與設(shè)備之間的 USB 通信速率依然是標(biāo)準(zhǔn)的 USB2.0 Full-Speed(12Mbps)速度,并不受所謂的串口波特率影響,實(shí)際的速率取決于總線的實(shí)際使用率、驅(qū)動(dòng)訪問 USB 外設(shè)的有效速率(兩邊)以及外部環(huán)境對(duì)通信本身造成的干擾率等因素。

該中斷類型端點(diǎn)可以用于異步事件通知,設(shè)備端可以通過該端點(diǎn)向主機(jī)發(fā)送內(nèi)部時(shí)間等,如串口狀態(tài)變化事件等。篇幅受限,本文不進(jìn)行實(shí)現(xiàn)。

數(shù)據(jù)接口類 (Data Interface Class)

主要用于主機(jī)和設(shè)備之間進(jìn)行數(shù)據(jù)傳輸,包含輸入(IN)端點(diǎn)和輸出(OUT)端點(diǎn)。

  • 輸入(IN)端點(diǎn):
    用于從設(shè)備向主機(jī)發(fā)送數(shù)據(jù)。
  • 輸出(OUT)端點(diǎn):
    用于主機(jī)向從設(shè)備發(fā)送數(shù)據(jù)。

** 多路虛擬串口的具體實(shí)現(xiàn)**

多路虛擬串口功能可以通過組合設(shè)備(Composite Device)進(jìn)行實(shí)現(xiàn)。組合設(shè)備是指具有多個(gè)接口,且接口間相互獨(dú)立的USB設(shè)備。一個(gè)USB組合設(shè)備只有一個(gè)設(shè)備地址。在開發(fā)過程中,可以將不同的功能與不同的接口對(duì)應(yīng),來開發(fā)多功能的USB設(shè)備,描述符層次結(jié)構(gòu)更清晰,出錯(cuò)容易排查。

設(shè)備描述符

設(shè)備描述符(Device Descriptor)是在設(shè)備連接時(shí)主機(jī)讀取的第一個(gè)描述符,說明了 USB 設(shè)備的通用信息,提供關(guān)于設(shè)備、設(shè)備的配置以及任何設(shè)備所歸屬類的信息。主機(jī)在取得設(shè)備描述符后,就可以繼續(xù)去獲取設(shè)備的配置、接口和端點(diǎn)描述符等信息。

USB 設(shè)備只有一個(gè)設(shè)備描述符。在設(shè)備描述符中,可以使用 bDeviceClass = 0x00, bDeviceSubClass = 0x00, dDeviceProtocol = 0x00 表示此類信息在接口描述符內(nèi)給出;也可以使用【0xEF,0x02,0x01】表示當(dāng)前為組合設(shè)備。下圖為主機(jī)請求設(shè)備描述符,設(shè)備返回設(shè)備描述符報(bào)文:

image.png

配置描述符

配置描述符(Configuration Descriptor)說明了一個(gè)特定配置的相關(guān)信息。當(dāng)主機(jī)請求配置描述符時(shí),返回的是所有相關(guān)的接口和端點(diǎn)描述符。

一個(gè)USB設(shè)備有一個(gè)或多個(gè)配置描述符。配置描述符描述了配置所提供的接口數(shù)量。每個(gè)接口可以獨(dú)立操作。每種配置有一個(gè)或多個(gè)接口,而且每個(gè)接口有零個(gè)或多個(gè)端點(diǎn)。在一個(gè)配置中,接口不會(huì)共享一個(gè)端點(diǎn),除非端點(diǎn)被相同接口的備用設(shè)置使用。沒有這一限制、屬于不同配置的接口可以共享端點(diǎn)。

配置描述符規(guī)定了設(shè)備的特征和能力。一般單個(gè)配置已經(jīng)足夠了,但在驅(qū)動(dòng)程序的支持下,帶有多應(yīng)用或多電源選擇的設(shè)備可支持多重配置。且每次只有一個(gè)配置被激活。每個(gè)配置需要一個(gè)配置描述符,其中含有關(guān)于設(shè)備電源使用及所支持接口數(shù)的信息。每個(gè)配置描述符都有附屬描述符(subordinate descriptor),包括一個(gè)或多個(gè)接口描述符(Interface Descriptor)以及可選的端點(diǎn)描述符(Endpoint Descriptor)。

配置描述符如下:

image.png

接口描述符

下圖所示為標(biāo)準(zhǔn)的接口描述符定義。

image.png

單個(gè)CDC類的描述符需要兩個(gè)接口:通信接口描述符和數(shù)據(jù)接口描述符。這兩個(gè)接口需要接口關(guān)聯(lián)描述符(Interface Association Descriptor)進(jìn)行綁定。

image.png

接口關(guān)聯(lián)描述符

IAD 接口關(guān)聯(lián)描述符提供了一種功能:即把實(shí)現(xiàn)單個(gè)功能的多個(gè) Interface 打包在一起。通過接口關(guān)聯(lián)描述符打包在一起的若干 Interface 是同一個(gè)功能設(shè)備的 Interface,PC端只需要加載同一個(gè)驅(qū)動(dòng)即可。

image.png

通信(控制)接口描述符

該接口描述符需要包含功能描述符(Header,Call Management, ACM)、端點(diǎn)描述符。

image.png

** 功能描述符**

Header 功能描述符

image.png

Call Management 功能描述符

image.png

ACM

image.png

Union 功能描述符

image.png

數(shù)據(jù)接口描述符

image.png

端點(diǎn)描述符

下圖所示為標(biāo)準(zhǔn)的端點(diǎn)描述符定義。

image.png

本文中分配的端點(diǎn)如下:

image.png

代碼:

/* CDC 端點(diǎn)1 */
#define EPNUM_CDC_0_NOTIF   0x81
#define EPNUM_CDC_0_OUT     0x02
#define EPNUM_CDC_0_IN      0x82

/* CDC 端點(diǎn)2 */
#define EPNUM_CDC_1_NOTIF   0x83
#define EPNUM_CDC_1_OUT     0x04
#define EPNUM_CDC_1_IN      0x84

/* CDC 端點(diǎn)3 */
#define EPNUM_CDC_2_NOTIF   0x85
#define EPNUM_CDC_2_OUT     0x06
#define EPNUM_CDC_2_IN      0x86

配置描述符 / 接口描述符 / 端點(diǎn)描述符

uint8_t const desc_fs_configuration[] =
{
/* Config number, interface count, string index, total length, attribute, power in mA */
  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),

/* 1st CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size. */
  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0, 4, EPNUM_CDC_0_NOTIF, 8, EPNUM_CDC_0_OUT, EPNUM_CDC_0_IN, 64),

/* 2nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size. */
  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1, 4, EPNUM_CDC_1_NOTIF, 8, EPNUM_CDC_1_OUT, EPNUM_CDC_1_IN, 64),

/* 3nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size. */
  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_2, 4, EPNUM_CDC_2_NOTIF, 8, EPNUM_CDC_2_OUT, EPNUM_CDC_2_IN, 64),
};

字符串描述符

char const* string_desc_arr [] =
{
  (const char[]){0x09, 0x04},    // 0: Supported language: English (0x0409)
  "MindMotion",                    // 1: Manufacturer
  "MM32-3VCP",                    // 2: Product
  "20221229",                    // 3: Serials
  "CDC Virtual COM",            // 4: CDC Interface
};

CDC Task 接口

在該接口函數(shù)中,本文主要實(shí)現(xiàn)了各個(gè)串口的回環(huán)功能,即在任務(wù)處理中發(fā)送當(dāng)前端點(diǎn)的接收字符。

void cdc_task(void)
{ 
  uint8_t itf;

  for (itf = 0; itf < CFG_TUD_CDC; itf++)
  {
    // connected() check for DTR bit
    // Most but not all terminal client set this when making connection
    // if ( tud_cdc_n_connected(itf) )
      if ( tud_cdc_n_available(itf) )
      {
        uint8_t buf[64];

        uint32_t count = tud_cdc_n_read(itf, buf, sizeof(buf));
        echo_serial_port(itf, buf, count);
      }
  }
}

** 基本測試**

如上,我們就完成三路虛擬串口的CDC功能,將程序下載到MCU中,插上USB線,然后在電腦的設(shè)備管理器的端口欄就可以找到對(duì)應(yīng)的USB CDC枚舉模擬串口設(shè)備。

image.png

成功枚舉,我們繼續(xù)在Windows 和 Linux 環(huán)境下測試一下通信:

image.png

image.png

測試成功。本文分享到此結(jié)束,謝謝!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16103

    瀏覽量

    177073
  • USB通信
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    10900
  • 虛擬串口
    +關(guān)注

    關(guān)注

    3

    文章

    60

    瀏覽量

    13855
  • MCU芯片
    +關(guān)注

    關(guān)注

    3

    文章

    246

    瀏覽量

    11355
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    在STM32F3 DISCOVERY上實(shí)現(xiàn)USB虛擬串口的作品

    【MCU實(shí)戰(zhàn)經(jīng)驗(yàn)】在STM32F3DISCOVERY上實(shí)現(xiàn)USB虛擬串口 我們知道,STM32F3
    發(fā)表于 04-04 17:15

    STM32如何快速實(shí)現(xiàn)USB虛擬串口+回環(huán)測試+USB轉(zhuǎn)TTL的功能?

    STM32如何快速實(shí)現(xiàn)USB虛擬串口+回環(huán)測試+USB轉(zhuǎn)TTL的功能?
    發(fā)表于 12-08 06:20

    介紹STM32F407 USB轉(zhuǎn)串口功能的實(shí)現(xiàn)

    之前的文章中介紹過STM32的USB接口虛擬串口的功能?!禨TM32CubeMX之USB從機(jī)》。本篇文章在此基礎(chǔ)上,以STM32F407為例
    發(fā)表于 02-22 06:29

    usb轉(zhuǎn)串口usb轉(zhuǎn)rs232串口

    USB轉(zhuǎn)串口實(shí)現(xiàn)計(jì)算機(jī)USB接口到通用串口之間的轉(zhuǎn)換.us
    發(fā)表于 04-27 16:13
    <b class='flag-5'>usb</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>串口</b>—<b class='flag-5'>usb</b><b class='flag-5'>轉(zhuǎn)</b>rs232<b class='flag-5'>串口</b>

    微雪電子FT232(mini)USB轉(zhuǎn)USART簡介

    FT232 USB轉(zhuǎn)UART串口模塊 USB mini接口 采用原裝FT232RL 支持3
    的頭像 發(fā)表于 12-30 15:04 ?3357次閱讀
    微雪電子FT232(<b class='flag-5'>mini</b>)<b class='flag-5'>USB</b><b class='flag-5'>轉(zhuǎn)</b>USART簡介

    USB虛擬串口

    STM32實(shí)現(xiàn)虛擬串口功能廢話不多說直接上代碼,Gitlab下載鏈接。USB虛擬串口用的是正點(diǎn)原
    發(fā)表于 12-28 19:49 ?11次下載
    <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    STM32 USB虛擬串口波特率問題(含源碼)

    之前的文章中介紹過STM32的USB接口虛擬串口的功能?!禨TM32CubeMX之USB從機(jī)》。本篇文章在此基礎(chǔ)上,以STM32F407為例
    發(fā)表于 12-28 19:51 ?21次下載
    STM32 <b class='flag-5'>USB</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>波特率問題(含源碼)

    STM32實(shí)現(xiàn)USB轉(zhuǎn)串口功能(含源碼)

    之前的文章中介紹過STM32的USB接口虛擬串口的功能?!禨TM32CubeMX之USB從機(jī)》。本篇文章在此基礎(chǔ)上,以STM32F407為例
    發(fā)表于 12-28 20:03 ?55次下載
    STM32<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>USB</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>串口</b>功能(含源碼)

    基于 RT-Thread 在 STM32 上實(shí)現(xiàn) USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實(shí)現(xiàn)USB 虛擬串口。為了方便大家,我在這里把在正點(diǎn)原子 F429 阿波羅
    發(fā)表于 02-10 10:01 ?4次下載
    基于 RT-Thread 在 STM32 上<b class='flag-5'>實(shí)現(xiàn)</b> <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    基于 RT-Thread 在 STM32 上實(shí)現(xiàn) USB 虛擬串口

    之前由于工作需要,基于 RT-Thread 在 STM32 上實(shí)現(xiàn)USB 虛擬串口。為了方便大家,我在這里把在正點(diǎn)原子 F429 阿波羅
    發(fā)表于 02-10 10:28 ?9次下載
    基于 RT-Thread 在 STM32 上<b class='flag-5'>實(shí)現(xiàn)</b> <b class='flag-5'>USB</b> <b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    USB轉(zhuǎn)串口簡介及工作原理說明

    USB轉(zhuǎn)串口即可實(shí)現(xiàn)計(jì)算機(jī)USB接口到物理串口之間的相互轉(zhuǎn)換。
    發(fā)表于 06-09 09:16 ?5391次閱讀

    Mini-F0160實(shí)現(xiàn)USB轉(zhuǎn)3虛擬串口

    本節(jié)課程主要講述如何通過 Mini-F0160 開發(fā)板實(shí)現(xiàn) USB 轉(zhuǎn)虛擬
    的頭像 發(fā)表于 05-06 15:47 ?815次閱讀
    <b class='flag-5'>Mini-F0160</b><b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>USB</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>3</b><b class='flag-5'>路</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>

    如何通過Mini-F0160開發(fā)板實(shí)現(xiàn)USB轉(zhuǎn)虛擬串口功能?

    Mini-F0160 開發(fā)板搭載 MM32F0160 ,產(chǎn)品內(nèi)嵌 1 個(gè) USB 控制器,內(nèi)置 USB PHY,兼容 USB 2.0 全速規(guī)
    的頭像 發(fā)表于 05-06 15:45 ?764次閱讀
    如何通過<b class='flag-5'>Mini-F0160</b>開發(fā)板<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>USB</b><b class='flag-5'>轉(zhuǎn)</b>三<b class='flag-5'>路</b><b class='flag-5'>虛擬</b><b class='flag-5'>串口</b>功能?

    基于STM32F407的USB轉(zhuǎn)串口功能實(shí)現(xiàn)

    實(shí)現(xiàn)USB轉(zhuǎn)串口的功能,需要將單片機(jī)真實(shí)串口(這里以USART1為例)的收發(fā)數(shù)據(jù)與USB口進(jìn)行
    發(fā)表于 10-16 16:04 ?1998次閱讀
    基于STM32<b class='flag-5'>F</b>407的<b class='flag-5'>USB</b><b class='flag-5'>轉(zhuǎn)</b><b class='flag-5'>串口</b>功能<b class='flag-5'>實(shí)現(xiàn)</b>

    usb轉(zhuǎn)串口線怎么使用 usb轉(zhuǎn)串口串口轉(zhuǎn)usb的區(qū)別

    )進(jìn)行通信。因此,通過使用USB轉(zhuǎn)串口線,可以將現(xiàn)代計(jì)算機(jī)與串口設(shè)備連接起來,實(shí)現(xiàn)數(shù)據(jù)傳輸和通信。 在使用
    的頭像 發(fā)表于 01-22 14:56 ?4072次閱讀