本節(jié)課程主要講述如何通過 Mini-F0160 開發(fā)板實現(xiàn) USB 轉(zhuǎn)三路虛擬串口功能。
開發(fā)板 | Mini-F0163 |
開發(fā)環(huán)境 | MDK-Keil |
Mini-F0160 開發(fā)板搭載 MM32F0160 ,產(chǎn)品內(nèi)嵌 1 個 USB 控制器,內(nèi)置 USB PHY,兼容 USB 2.0 全速規(guī)范,提供最高 12 Mbps 數(shù)據(jù)速率,支持設(shè)備模式,USB 控制器提供了最高 8 個雙向端點。
什么是 CDC 設(shè)備
CDC 類是 USB 通信設(shè)備類 (Communication Device Class)的簡稱。由 USB 組織定義的專門給各種通信設(shè)備使用的 USB 子類。
通常,CDC類由兩個接口子類組成:
通信接口類(Communication Interface Class)
主要用于主機對設(shè)備進行管理和控制,它包含一個控制類型的端點和一個可選的中斷類型端點。
該控制類型端點 0 一般用作請求,可以用于配置 USB 設(shè)備枚舉虛擬串口的波特率、數(shù)據(jù)類型的設(shè)置,比如數(shù)據(jù)長度、停止位等。在虛擬串口應(yīng)用中,該操作并不一定需要具體實現(xiàn)。因為主機與設(shè)備在物理上通過 USB 總線進行通信,與串口并沒有關(guān)系,在虛擬化過程中,起決定性作用的是串口驅(qū)動,該驅(qū)動將每一條具體的虛擬串口操作對應(yīng)到實際上的USB操作。同時,主機與設(shè)備之間的 USB 通信速率依然是標(biāo)準(zhǔn)的 USB2.0 Full-Speed(12Mbps)速度,并不受所謂的串口波特率影響,實際的速率取決于總線的實際使用率、驅(qū)動訪問 USB 外設(shè)的有效速率(兩邊)以及外部環(huán)境對通信本身造成的干擾率等因素。
該中斷類型端點可以用于異步事件通知,設(shè)備端可以通過該端點向主機發(fā)送內(nèi)部時間等,如串口狀態(tài)變化事件等。篇幅受限,本文不進行實現(xiàn)。
數(shù)據(jù)接口類(Data Interface Class)
主要用于主機和設(shè)備之間進行數(shù)據(jù)傳輸,包含輸入(IN)端點和輸出(OUT)端點。
輸入(IN)端點:
用于從設(shè)備向主機發(fā)送數(shù)據(jù)。
輸出(OUT)端點:
用于主機向從設(shè)備發(fā)送數(shù)據(jù)。
多路虛擬串口的具體實現(xiàn)
多路虛擬串口功能可以通過組合設(shè)備(Composite Device)進行實現(xiàn)。組合設(shè)備是指具有多個接口,且接口間相互獨立的USB設(shè)備。一個USB組合設(shè)備只有一個設(shè)備地址。在開發(fā)過程中,可以將不同的功能與不同的接口對應(yīng),來開發(fā)多功能的USB設(shè)備,描述符層次結(jié)構(gòu)更清晰,出錯容易排查。
設(shè)備描述符
設(shè)備描述符(Device Descriptor)是在設(shè)備連接時主機讀取的第一個描述符,說明了 USB 設(shè)備的通用信息,提供關(guān)于設(shè)備、設(shè)備的配置以及任何設(shè)備所歸屬類的信息。主機在取得設(shè)備描述符后,就可以繼續(xù)去獲取設(shè)備的配置、接口和端點描述符等信息。
USB 設(shè)備只有一個設(shè)備描述符。在設(shè)備描述符中,可以使用 bDeviceClass = 0x00, bDeviceSubClass = 0x00, dDeviceProtocol = 0x00 表示此類信息在接口描述符內(nèi)給出;也可以使用【0xEF,0x02,0x01】表示當(dāng)前為組合設(shè)備。下圖為主機請求設(shè)備描述符,設(shè)備返回設(shè)備描述符報文:
配置描述符
配置描述符(Configuration Descriptor)說明了一個特定配置的相關(guān)信息。當(dāng)主機請求配置描述符時,返回的是所有相關(guān)的接口和端點描述符。
一個USB設(shè)備有一個或多個配置描述符。配置描述符描述了配置所提供的接口數(shù)量。每個接口可以獨立操作。每種配置有一個或多個接口,而且每個接口有零個或多個端點。在一個配置中,接口不會共享一個端點,除非端點被相同接口的備用設(shè)置使用。沒有這一限制、屬于不同配置的接口可以共享端點。
配置描述符規(guī)定了設(shè)備的特征和能力。一般單個配置已經(jīng)足夠了,但在驅(qū)動程序的支持下,帶有多應(yīng)用或多電源選擇的設(shè)備可支持多重配置。且每次只有一個配置被激活。每個配置需要一個配置描述符,其中含有關(guān)于設(shè)備電源使用及所支持接口數(shù)的信息。每個配置描述符都有附屬描述符(subordinate descriptor),包括一個或多個接口描述符(Interface Descriptor)以及可選的端點描述符(Endpoint Descriptor)。
配置描述符如下:
接口描述符
下圖所示為標(biāo)準(zhǔn)的接口描述符定義。
單個CDC類的描述符需要兩個接口:通信接口描述符和數(shù)據(jù)接口描述符。這兩個接口需要接口關(guān)聯(lián)描述符(Interface Association Descriptor)進行綁定。
接口關(guān)聯(lián)描述符
IAD 接口關(guān)聯(lián)描述符提供了一種功能:即把實現(xiàn)單個功能的多個 Interface 打包在一起。通過接口關(guān)聯(lián)描述符打包在一起的若干 Interface 是同一個功能設(shè)備的 Interface,PC端只需要加載同一個驅(qū)動即可。
通信(控制)接口描述符
該接口描述符需要包含功能描述符(Header,Call Management, ACM)、端點描述符。
功能描述符
Header 功能描述符
Call Management 功能描述符
ACM
Union 功能描述符
數(shù)據(jù)接口描述符
端點描述符
下圖所示為標(biāo)準(zhǔn)的端點描述符定義。
本文中分配的端點如下:
代碼:
/*CDC端點1*/ #defineEPNUM_CDC_0_NOTIF0x81 #defineEPNUM_CDC_0_OUT0x02 #defineEPNUM_CDC_0_IN0x82 /*CDC端點2*/ #defineEPNUM_CDC_1_NOTIF0x83 #defineEPNUM_CDC_1_OUT0x04 #defineEPNUM_CDC_1_IN0x84 /*CDC端點3*/ #defineEPNUM_CDC_2_NOTIF0x85 #defineEPNUM_CDC_2_OUT0x06 #defineEPNUM_CDC_2_IN0x86
配置描述符 / 接口描述符 / 端點描述符
uint8_tconstdesc_fs_configuration[]= { /*Confignumber,interfacecount,stringindex,totallength,attribute,powerinmA*/ TUD_CONFIG_DESCRIPTOR(1,ITF_NUM_TOTAL,0,CONFIG_TOTAL_LEN,0x00,100), /*1stCDC:Interfacenumber,stringindex,EPnotificationaddressandsize,EPdataaddress(out,in)andsize.*/ TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0,4,EPNUM_CDC_0_NOTIF,8,EPNUM_CDC_0_OUT,EPNUM_CDC_0_IN,64), /*2ndCDC:Interfacenumber,stringindex,EPnotificationaddressandsize,EPdataaddress(out,in)andsize.*/ TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1,4,EPNUM_CDC_1_NOTIF,8,EPNUM_CDC_1_OUT,EPNUM_CDC_1_IN,64), /*3ndCDC:Interfacenumber,stringindex,EPnotificationaddressandsize,EPdataaddress(out,in)andsize.*/ TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_2,4,EPNUM_CDC_2_NOTIF,8,EPNUM_CDC_2_OUT,EPNUM_CDC_2_IN,64), };
字符串描述符
charconst*string_desc_arr[]= { (constchar[]){0x09,0x04},//0:Supportedlanguage:English(0x0409) "MindMotion",//1:Manufacturer "MM32-3VCP",//2:Product "20221229",//3:Serials "CDCVirtualCOM",//4:CDCInterface };
CDC Task 接口
在該接口函數(shù)中,本文主要實現(xiàn)了各個串口的回環(huán)功能,即在任務(wù)處理中發(fā)送當(dāng)前端點的接收字符。
voidcdc_task(void) { uint8_titf; for(itf=0;itf
基本測試
如上,我們就完成三路虛擬串口的CDC功能,將程序下載到MCU中,插上USB線,然后在電腦的設(shè)備管理器的端口欄就可以找到對應(yīng)的USB CDC枚舉模擬串口設(shè)備。
成功枚舉,我們繼續(xù)在Windows 和 Linux 環(huán)境下測試一下通信:
測試成功。
審核編輯:劉清
-
控制器
+關(guān)注
關(guān)注
112文章
16332瀏覽量
177806 -
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264474 -
CDC
+關(guān)注
關(guān)注
0文章
57瀏覽量
17798 -
串口驅(qū)動
+關(guān)注
關(guān)注
2文章
82瀏覽量
18647
原文標(biāo)題:靈動微課堂 (第254講)|Mini-F0160實現(xiàn)USB轉(zhuǎn)3路虛擬串口
文章出處:【微信號:MindMotion-MMCU,微信公眾號:靈動MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論