** 什么是 CDC 設備**
CDC 類是 USB 通信設備類 (Communication Device Class)的簡稱。由 USB 組織定義的專門給各種通信設備使用的 USB 子類。
通常,CDC類由兩個接口子類組成:
通信接口類 (Communication Interface Class)
主要用于主機對設備進行管理和控制,它包含一個控制類型的端點和一個可選的中斷類型端點。
該控制類型端點 0 一般用作請求,可以用于配置 USB 設備枚舉虛擬串口的波特率、數據類型的設置,比如數據長度、停止位等。在虛擬串口應用中,該操作并不一定需要具體實現。因為主機與設備在物理上通過 USB 總線進行通信,與串口并沒有關系,在虛擬化過程中,起決定性作用的是串口驅動,該驅動將每一條具體的虛擬串口操作對應到實際上的USB操作。同時,主機與設備之間的 USB 通信速率依然是標準的 USB2.0 Full-Speed(12Mbps)速度,并不受所謂的串口波特率影響,實際的速率取決于總線的實際使用率、驅動訪問 USB 外設的有效速率(兩邊)以及外部環境對通信本身造成的干擾率等因素。
該中斷類型端點可以用于異步事件通知,設備端可以通過該端點向主機發送內部時間等,如串口狀態變化事件等。篇幅受限,本文不進行實現。
數據接口類 (Data Interface Class)
主要用于主機和設備之間進行數據傳輸,包含輸入(IN)端點和輸出(OUT)端點。
- 輸入(IN)端點:
用于從設備向主機發送數據。 - 輸出(OUT)端點:
用于主機向從設備發送數據。
** 多路虛擬串口的具體實現**
多路虛擬串口功能可以通過組合設備(Composite Device)進行實現。組合設備是指具有多個接口,且接口間相互獨立的USB設備。一個USB組合設備只有一個設備地址。在開發過程中,可以將不同的功能與不同的接口對應,來開發多功能的USB設備,描述符層次結構更清晰,出錯容易排查。
設備描述符
設備描述符(Device Descriptor)是在設備連接時主機讀取的第一個描述符,說明了 USB 設備的通用信息,提供關于設備、設備的配置以及任何設備所歸屬類的信息。主機在取得設備描述符后,就可以繼續去獲取設備的配置、接口和端點描述符等信息。
USB 設備只有一個設備描述符。在設備描述符中,可以使用 bDeviceClass = 0x00, bDeviceSubClass = 0x00, dDeviceProtocol = 0x00 表示此類信息在接口描述符內給出;也可以使用【0xEF,0x02,0x01】表示當前為組合設備。下圖為主機請求設備描述符,設備返回設備描述符報文:
配置描述符
配置描述符(Configuration Descriptor)說明了一個特定配置的相關信息。當主機請求配置描述符時,返回的是所有相關的接口和端點描述符。
一個USB設備有一個或多個配置描述符。配置描述符描述了配置所提供的接口數量。每個接口可以獨立操作。每種配置有一個或多個接口,而且每個接口有零個或多個端點。在一個配置中,接口不會共享一個端點,除非端點被相同接口的備用設置使用。沒有這一限制、屬于不同配置的接口可以共享端點。
配置描述符規定了設備的特征和能力。一般單個配置已經足夠了,但在驅動程序的支持下,帶有多應用或多電源選擇的設備可支持多重配置。且每次只有一個配置被激活。每個配置需要一個配置描述符,其中含有關于設備電源使用及所支持接口數的信息。每個配置描述符都有附屬描述符(subordinate descriptor),包括一個或多個接口描述符(Interface Descriptor)以及可選的端點描述符(Endpoint Descriptor)。
配置描述符如下:
接口描述符
下圖所示為標準的接口描述符定義。
單個CDC類的描述符需要兩個接口:通信接口描述符和數據接口描述符。這兩個接口需要接口關聯描述符(Interface Association Descriptor)進行綁定。
接口關聯描述符
IAD 接口關聯描述符提供了一種功能:即把實現單個功能的多個 Interface 打包在一起。通過接口關聯描述符打包在一起的若干 Interface 是同一個功能設備的 Interface,PC端只需要加載同一個驅動即可。
通信(控制)接口描述符
該接口描述符需要包含功能描述符(Header,Call Management, ACM)、端點描述符。
** 功能描述符**
Header 功能描述符
Call Management 功能描述符
ACM
Union 功能描述符
數據接口描述符
端點描述符
下圖所示為標準的端點描述符定義。
本文中分配的端點如下:
代碼:
/* CDC 端點1 */
#define EPNUM_CDC_0_NOTIF 0x81
#define EPNUM_CDC_0_OUT 0x02
#define EPNUM_CDC_0_IN 0x82
/* CDC 端點2 */
#define EPNUM_CDC_1_NOTIF 0x83
#define EPNUM_CDC_1_OUT 0x04
#define EPNUM_CDC_1_IN 0x84
/* CDC 端點3 */
#define EPNUM_CDC_2_NOTIF 0x85
#define EPNUM_CDC_2_OUT 0x06
#define EPNUM_CDC_2_IN 0x86
配置描述符 / 接口描述符 / 端點描述符
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 接口
在該接口函數中,本文主要實現了各個串口的回環功能,即在任務處理中發送當前端點的接收字符。
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線,然后在電腦的設備管理器的端口欄就可以找到對應的USB CDC枚舉模擬串口設備。
成功枚舉,我們繼續在Windows 和 Linux 環境下測試一下通信:
測試成功。本文分享到此結束,謝謝!
-
控制器
+關注
關注
112文章
16214瀏覽量
177479 -
USB通信
+關注
關注
0文章
22瀏覽量
10907 -
虛擬串口
+關注
關注
3文章
62瀏覽量
13866 -
MCU芯片
+關注
關注
3文章
248瀏覽量
11394
發布評論請先 登錄
相關推薦
評論