1. 程式人生 > >USB虛擬串列埠

USB虛擬串列埠

現代嵌入式系統中,非同步序列通訊介面往往作為標準外設出現在微控制器和嵌入式系統中。但是隨著個人計算機通用外圍裝置越來越少地使用串列埠,串列埠正在逐漸從個人計算機特別是行動式電腦上消失。於是嵌入式開發人員常常發現自己新買來的計算機上沒有串列埠,或者出現除錯現場使用者的計算機沒有串列埠的尷尬局面。相反,現在的個人計算機普遍擁有4個以上的USB介面,能不能使用USB介面代替串列埠,完成PC機和嵌入式系統的通訊呢?

  1.USB虛擬串列埠代替物理串列埠的可行性

  首先,越來越多帶USB介面的器件湧現出來,如帶USB介面的微控制器,或獨立的USB介面器件,而且這些器件的成本已經很接近於使用RS232電平轉換晶片所帶來的成本。

  其次,市場上也出現了一些USB介面轉串列埠的晶片,這些晶片一頭為串列埠,另一頭為USB介面,在其內部完成串列埠到USB協議的轉換。該晶片通過USB口連線到個人計算機後,在作業系統中表現為一個串列埠裝置,這意味著USB介面對於傳統的串列埠除錯工具(HyperTerninal)和使用者基於串列埠的應用程式是透明的,開發人員完全不用更改PC端的除錯和應用程式。

  但是這些器件的USB類不屬於標準的USB裝置類,因此需要在Windows和Linux作業系統上安裝額外的裝置驅動。另外,由於不是作業系統自帶的裝置驅動,而且通訊經過了由串列埠到串列埠,USB從裝置到USB主機的多次轉換,當除錯遇到問題時常常無法確定是串口出了問題還是USB出了問題。因此,應該使嵌入式系統直接和PC通過USB匯流排介面連線(通過片上的USB介面或片外USB介面晶片),由微控制器直接完成USB虛擬串列埠的協議轉換。

  在USB標準子類中,有一類稱之為CDC類,可以實現虛擬串列埠通訊的協議,而且由於大部分的作業系統(Windows和Linux)都帶有支援CDC類的裝置驅動程式,可以自動識別CDC類的裝置,這樣不僅免去了寫專用裝置驅動的負擔,同時簡化了裝置驅動的安裝。

  2.什麼是CDC類

  USB的CDC類是USB通訊裝置類(Communication Device Class)的簡稱。CDC類是USB組織定義的一類專門給各種通訊裝置(電信通訊裝置和中速網路通訊裝置)使用的USB子類。根據CDC類所針對通訊裝置的不同,CDC類又被分成以下不同的模型:USB傳統純電話業務(POTS)模型,USB ISDN模型和USB網路模型。其中,USB傳統純電話業務模型,有可分為直接線控制模型(Direct Line Control Model)、抽象控制模型(Abstract Control Model)和USB電話模型(USB Telephone Model),如圖1所示。本文所討論的虛擬串列埠就屬於USB傳統純電話業務模型下的抽象控制模型。 

 

  通常一個CDC類又由兩個介面子類組成通訊介面類(Communication Interface Class)和資料介面類(Data Interface Class)。筆者主要通過通訊介面類對裝置進行管理和控制,而通過資料介面類傳送資料。這兩個介面子類佔有不同數量和型別的終端點(Endpoints),如圖2所示。
 

  對於前面所述的不同CDC類模型,其所對應的介面的終端點需求也是不同的。如所需要討論的抽象控制模型對終端點的需求,通訊介面類需要一個控制終端點(Control Endpoint)和一個可選的中斷(Interrupt)型終端點,資料介面子類需要一個方向為輸入(IN)的週期性(Isochronous)型終端點和一個方向為輸出(OUT)的週期性型終端點。其中控制終端點主要用於USB裝置的列舉和虛擬串列埠的波特率和資料型別(資料位數、停止位和起始位)設定的通訊。輸出方向的非同步終端點用於主機(Host)向從裝置(Slave)傳送資料,相當於傳統物理串列埠中的TXD線(如果從微控制器的角度看),輸入方向的非同步終端點用於從裝置向主機發送資料,相當於傳統物理串列埠中的RXD線。

  3.AT89C5131的簡單介紹

  基於微控制器的嵌入式系統要實現USB匯流排通訊,通常都是通過外擴專用的USB匯流排介面晶片(如飛利浦的D12)。但是這樣的方案既增加了成本,又使PCB板的面積變大,所以使用Atmel公司的集成了USB2.0全速(Full Speed)從介面外設的51微控制器AT89C5131。

  AT89C5131是一個基於52核心的微控制器。在儲存器方面,其內部集成了32KB的Flash儲存器用於程式碼的儲存,1KB的EEPROM儲存器用於使用者資料的儲存,使用者可以使用片上的Bootloader或Flash API通過USB介面或者其他介面(如UART和I2C匯流排)對Flash儲存器和EEPROM儲存器進行ISP或者IAP程式設計。 此外AT89C5131還集成了10位的ADC、I2C匯流排介面和PCA模組等豐富的外設。

 

  AT89C5131的USB2.0全速從介面的結構如圖3所示,其包括USB D+/D-的介面緩衝,數字鎖相環,序列介面引擎(SIE)和通用功能介面(UFI)。其中數字鎖相環以微控制器的時鐘為輸入,產生了USB介面其他部分所需的48MHz時鐘。序列介面引擎完成USB通訊物理層NRZI碼的編碼與解碼,CRC生成以及校驗與糾錯。通用功能介面包含了一個雙埠的資料儲存器,其一端與序列介面引擎連結,另一端通過資料匯流排與微控制器相連線,使微控制器可以通過特殊功能暫存器完成對USB2.0從介面的控制與通訊。

  AT89C5131的USB2.0全速從介面包含了7個終端點,其中0號終端點被配置成為預設的控制終端點。其他1~6號終端點都可以通過特殊暫存器配置為控制(Control),突發(Bulk),中斷(Interrupt)和週期性(Isochronous)模式。由於每一個終端點都由一組獨立的暫存器對該終端點進行控制、狀態識別和資料的存取,則如果將這些暫存器直接對映到51微控制器的特殊功能暫存器地址空間顯然是容納不下的。因此,這7個終端點的7組暫存器在微控制器的地址空間中其實使用的是同一組暫存器的地址,而通過一個特殊功能暫存器(UEPNUM)來選擇當前該組暫存器實際選擇的是哪個終端點的暫存器組,這樣就大大節省了所佔用的地址空間,為整合其他特殊外設提供了可能。

  4.基於AT89C5131的CDC類的實現

  AT89C5131與USB介面的硬體連線很簡單,選用一個Btype的USB插座,因為按照USB規範,從裝置使用Btype的USB插座,主裝置使用Atype的USB插座,將Btype的USB插座的D+和D-腳分別與AT89C5131上的D+和D-腳相連。然後再在電源和D+之間用一個1.5 kΩ的上拉電阻連線,因為按照USB規範,USB主裝置是通過從裝置在插入時D+和D-上的絕對電平來確定從裝置是一個全速裝置還是一個低速裝置的,而AT89C5131是一個全速裝置,所以需要將D+上拉。

  下面介紹虛擬串列埠的微控制器軟體設計與實現。首先來看一下終端點的分配,按照CDC類抽象控制模型對終端點的需求,將微控制器0號終端點和1號終端點分配給通訊介面子類,分別作為控制終端點(完成列舉和串列埠引數設定)和中斷終端點,而將2號和3號終端點分配給資料介面子類,分別作為IN和OUT終端點,虛擬串列埠的資料主要從這兩終端點來進行傳送。

 

  由於各個終端點的行為相對獨立,對於每個終端點的控制過程又有相似性,在這裡以2號終端點即作為資料介面的IN終端點為例,說明軟體是如何對終端點進行操作和控制的,其控制流程圖如圖4所示。2號終端點是一個IN的終端點,它的主要工作是模擬物理串列埠的TXD線,向主裝置傳送資料。當主裝置發出IN的請求時,如果FIFO不空,就向主裝置傳送FIFO的內容;如果FIFO為空,則向主裝置傳送一個空包作為迴應。AT89C5131在收到IN的請求時,會觸發USB中斷(如果被使能),在中斷處理程式中,如圖4所示,首先判斷中斷的觸發源是哪個終端點,如果是2號終端點,將USB暫存器組對映到2號終端點的那一組,然後將需要傳送的串列埠資料填入FIFO暫存器(UEPDATX),置位UEPSTAX的TXRDY位,表示FIFO中的資料已經準備好,這時USB介面就會自動響應IN請求,並將FIFO中的資料傳送出去,程式則可退出中斷服務程式。對於其他的終端點,其處理過程也是相似的。

  軟體使用Keil C51為編譯系統,為了便於和系統的其他程式整合,採用標準字元型裝置的API介面usb_getc()和usb_putc(),使程式具有很好的移植性。應用程式層函式(usb_getc()和usb_putc())與USB中斷處理程式通過兩個先進先出FIFO迴圈佇列(TX和RX)來交換資料,這樣有效的起到收發緩衝的作用,防止緩衝溢位。

  5.總結

  在微控制器上實現基於CDC類的USB虛擬串列埠很好的適應了當前計算機外設介面的發展,同時因為這樣的介面在PC作業系統中仍然對映為一個串列埠,所以又避免了大量的PC端除錯程式和應用程式的重新編寫。