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端調試程序和應用程序的從新編寫。