93707部隊(duì) 王志海
串口通信是單片機(jī)與上位機(jī)最常用的數(shù)據(jù)通信方式,隨著USB接口的普及,單片機(jī)與計(jì)算機(jī)之間越來(lái)越多的使用USB接口進(jìn)行數(shù)據(jù)傳輸,但是直接選用USB接口控制芯片會(huì)增加開(kāi)發(fā)成本與難度。為單片機(jī)設(shè)備選擇一個(gè)簡(jiǎn)單、快速、適用的通信方式,不但可以降低開(kāi)發(fā)成本和技術(shù)難度,也可以最大程度的提高單片機(jī)系統(tǒng)的運(yùn)行效率。本文對(duì)AVR單片機(jī)使用串口通信和V-USB方案的開(kāi)發(fā)實(shí)現(xiàn)過(guò)程進(jìn)行比較,分析了兩種通訊方式的特點(diǎn)和應(yīng)用場(chǎng)合。
V-USB的全稱(chēng)是Virtual USB for AVR microcontrollers,是一個(gè)開(kāi)源項(xiàng)目。它利用純軟件的實(shí)現(xiàn)方式在ATMEGA公司的AVR系列單片機(jī)上虛擬出USB口,將其模擬為低速USB設(shè)備,實(shí)現(xiàn)方案不需要添加其他的USB接口芯片。通常單片機(jī)與上位機(jī)進(jìn)行USB通信,需要用專(zhuān)用的芯片進(jìn)行USB協(xié)議的轉(zhuǎn)換,例如CP2101、PL2303、SL811、PDIUSBD12等。其中CP2101、PL2303芯片使用起來(lái)雖然簡(jiǎn)單,但是功能單一,只能做USB轉(zhuǎn)串口的通訊設(shè)備;而PDIUSBD12、SL811芯片功能較強(qiáng),但是設(shè)計(jì)使用復(fù)雜,這些USB芯片的價(jià)格都相對(duì)較高,增加了系統(tǒng)的硬件成本。而V-USB簡(jiǎn)單易用,成本較低,絕大多數(shù)的AVR系列單片機(jī)加上很少的幾個(gè)外部元件,就可以組成一個(gè)USB系統(tǒng)。
串口通信基于RS-232-C串行總線接口標(biāo)準(zhǔn),最初是為了連接計(jì)算機(jī)主機(jī)與CRT終端之間的通信,后來(lái)逐漸廣泛地應(yīng)用于各種設(shè)備之間的數(shù)據(jù)交換。早期的計(jì)算機(jī)主機(jī)都帶有RS-232接口,是最常用的數(shù)據(jù)接口,具有傳輸距離遠(yuǎn)、連接方式簡(jiǎn)單、線路占用少、開(kāi)發(fā)資料多等優(yōu)點(diǎn)。絕大多數(shù)的單片機(jī)都內(nèi)置USART單元用于串行通信。
V-USB系統(tǒng)的硬件結(jié)構(gòu)很簡(jiǎn)單,需要一個(gè)AVR單片機(jī)(片上具有2KB Flash,128字節(jié)RAM的大部分型號(hào)都可以),再加上少量的外部元件(晶振、電阻、穩(wěn)壓二極管等),就組成了一個(gè)基本的V-USB系統(tǒng),實(shí)現(xiàn)方案需占用單片機(jī)的兩個(gè)數(shù)據(jù)引腳(其中D+必須連接至INT0),并不占用其他的UART、計(jì)時(shí)器等硬件資源。系統(tǒng)組成如圖1。
圖中的D1和D2是3.6V穩(wěn)壓二極管,目的是限制USB數(shù)據(jù)線上的電平。USB通信規(guī)范中規(guī)定,數(shù)據(jù)線D+、D-上的電平范圍在3.0V至3.6V之間,而AVR單片機(jī)的輸出電平是VCC。如果單片機(jī)的VCC是5V,如沒(méi)有D1、D2的情況下將導(dǎo)致電平不匹配,會(huì)出現(xiàn)在計(jì)算機(jī)中無(wú)法正確識(shí)別出USB設(shè)備的情況。單片機(jī)所需的電源VCC可由USB的5V輸出電源直接提供,電阻R1和R2起到了限流和保護(hù)的作用,避免意外情況下?lián)p壞計(jì)算機(jī)的USB端口或單片機(jī)的端口。
V-USB的軟件源代碼是由C代碼和匯編代碼組成的,開(kāi)發(fā)環(huán)境為AVR GCC,已組織好幾種不同USB設(shè)備的框架,開(kāi)發(fā)者只需直接利用即可。最小化的V-USB程序框架編譯后需要占用單片機(jī)1150至1400字節(jié)的程序空間。
由于V-USB使用單片機(jī)IO口模擬USB通信,是用純軟件的方式實(shí)現(xiàn)了硬件芯片的功能。而USB通信的速率要求是比較高的。因此在進(jìn)行USB通信時(shí)單片機(jī)的CPU占用率比較高的。為保證可靠的USB數(shù)據(jù)傳輸,單片機(jī)CPU時(shí)鐘必須是工作在12MHz、12.8MHz、15MHz、16MHz、16.5MHz、18MHz、20MHz這幾個(gè)頻率。
具備USART單元的AVR單片機(jī)都可以使用串行通信方式,硬件實(shí)現(xiàn)僅使用單片機(jī)的RXD和TXD引腳。為和計(jì)算機(jī)的RS-232接口連接,一般使用MAX232芯片進(jìn)行電平轉(zhuǎn)換,這需要增加部分外圍電路,MAX232應(yīng)用電路如圖2:
若要提高用串口通訊硬件的易用性,還可以選擇成品的USB轉(zhuǎn)TTL接口芯片,可以方便的將使用串口通信的單片機(jī)設(shè)備變?yōu)閁SB設(shè)備,并且不影響上位機(jī)和下位機(jī)的程序編制。
為減小波特率偏差,USART對(duì)單片機(jī)的使用的晶振頻率和串口設(shè)置的通訊速率有一些要求,不匹配的波特率和晶振頻率會(huì)使傳輸出現(xiàn)通訊錯(cuò)誤。具體可查各型單片機(jī)的數(shù)據(jù)手冊(cè)中的波特率設(shè)置表。
V-USB項(xiàng)目在計(jì)算機(jī)端使用跨平臺(tái)的開(kāi)源項(xiàng)目LibUSB來(lái)訪問(wèn)USB設(shè)備。LibUSB-Win32是LibUSB在Windows操作系統(tǒng)(Win2k,WinXP,Vista,Win7)上的通用USB設(shè)備驅(qū)動(dòng)程序及開(kāi)發(fā)包。利用LibUSB可以在不設(shè)計(jì)核心驅(qū)動(dòng)程序代碼的情況下,訪問(wèn)Windows系統(tǒng)上的USB設(shè)備。LibUSB-Win32的開(kāi)源項(xiàng)目網(wǎng)站是http://libusb-win32.sourceforge.net,遵守GNU Lesser General Public License(LGPL)和GNU General Public License(GPL)許可協(xié)議。協(xié)議規(guī)定LibUSB-Win32可以開(kāi)源也可以用于商業(yè)軟件。

表1 兩種通信接口特征對(duì)比

圖1

圖2
LibUSB-Win32為C/C++程序員提供了可直接用于開(kāi)發(fā)的頭文件和Lib文件,其中Lib文件還提供了BCC、GCC和MSVC這三個(gè)版本。C/C++程序員在自己的程序中要使用LibUSB-Win32時(shí),只需包含提供的頭文件,并鏈接合適的Lib文件即可。對(duì)于使用其他語(yǔ)言的開(kāi)發(fā)者,可以通過(guò)直接調(diào)用LibUsb-Win32的動(dòng)態(tài)鏈接庫(kù)中的函數(shù)來(lái)使用LibUSB的功能來(lái)訪問(wèn)USB設(shè)備。如果開(kāi)發(fā)者希望具體的控制通訊細(xì)節(jié),可以使用LibUSB提供的函數(shù)usb_init()、usb_find_busses()、usb_control_msg()來(lái)實(shí)現(xiàn)設(shè)備操作、控制傳輸、批量傳輸、中斷傳輸?shù)裙δ堋?/p>
在V-USB項(xiàng)目中,有多個(gè)使用LibUSBWin32訪問(wèn)USB設(shè)備的工程。開(kāi)發(fā)者可以直接在自己的工程中添加opendevice.h和opendevice.cpp來(lái)訪問(wèn)外圍USB設(shè)備,編程時(shí)僅使用已經(jīng)編寫(xiě)好的usbOpenDevice()、usb_set_configuration()、usb_control_msg()、usb_close()等幾個(gè)函數(shù)就可以快速實(shí)現(xiàn)與外圍USB設(shè)備的數(shù)據(jù)通信功能。
由于AVR單片機(jī)具有低成本、高性能的特性,使得V-USB非常適合于應(yīng)用于USB加密狗、低速USB數(shù)據(jù)采集設(shè)備、HID設(shè)備等,這樣通過(guò)使用極少元件構(gòu)成的具有USB通信功能的單片機(jī)系統(tǒng)比很多使用專(zhuān)用芯片的系統(tǒng)成本低、開(kāi)發(fā)難度低。
目前應(yīng)用V-USB的成熟產(chǎn)品有:
USBasp(USB接口的AVR編程寫(xiě)入器)、AVRCDC(USB轉(zhuǎn)RS232)、USB Bootlader等。在V-USB網(wǎng)站上(見(jiàn)參考文獻(xiàn))還有許多使用V-USB的開(kāi)源項(xiàng)目,這些項(xiàng)目提供了完整的單片機(jī)程序和計(jì)算機(jī)程序的代碼及原理圖,非常方便開(kāi)發(fā)者查閱參考這些資源,并在這些開(kāi)源工程實(shí)例的基礎(chǔ)上進(jìn)行修改,快速開(kāi)發(fā)適合于應(yīng)用需求的單片機(jī)設(shè)備。
在Windows下,常用的串口方法主要有:使用MSComm控件、Windows API函數(shù)、第三方類(lèi)庫(kù)等。使用MSComm控件比較簡(jiǎn)單,多種計(jì)算機(jī)編程語(yǔ)言均可利用其實(shí)現(xiàn)對(duì)串口的控制,但是對(duì)于通訊速度和實(shí)時(shí)性要求高的場(chǎng)合,如果處理不好就會(huì)出現(xiàn)內(nèi)存泄露等問(wèn)題。使用Windows API中用于控制串口通信的函數(shù),需要對(duì)相關(guān)的參數(shù)和數(shù)據(jù)結(jié)構(gòu)有一定的了解,雖然各種語(yǔ)言、各種應(yīng)用場(chǎng)合都可以使用,但是編程較為復(fù)雜,開(kāi)發(fā)周期長(zhǎng),只適合需要精準(zhǔn)的控制通訊細(xì)節(jié)的情況。相對(duì)而言第三方的開(kāi)發(fā)類(lèi)庫(kù)例如CSerialPort類(lèi),CSerialPortEx等,不但支持多串口多線程,而且使用簡(jiǎn)單,開(kāi)發(fā)周期短,應(yīng)用場(chǎng)合較廣。
V-USB將單片機(jī)實(shí)現(xiàn)為支持USB1.1協(xié)議的低速設(shè)備。由于低速USB設(shè)備的速度是1.5M位/秒,而AVR單片機(jī)為單指令周期的,當(dāng)單片機(jī)使用12MHz的時(shí)鐘頻率時(shí),單片機(jī)運(yùn)行時(shí)每8條指令就精確完成一個(gè)數(shù)據(jù)位的采集。這對(duì)單片機(jī)的時(shí)序要求非常嚴(yán)格,所以V-USB項(xiàng)目的核心部分代碼完全由匯編語(yǔ)言實(shí)現(xiàn),并對(duì)AVR GCC編譯器做了優(yōu)化。筆者使用V-USB的最小框架進(jìn)行數(shù)據(jù)傳輸測(cè)試,上位機(jī)發(fā)送一次USB命令,下位機(jī)不做處理直接應(yīng)答,每次傳輸8字節(jié)時(shí)數(shù)據(jù)交換速度最快,約為1600B/s,當(dāng)傳輸字節(jié)數(shù)增加時(shí)速度會(huì)下降,這種數(shù)據(jù)通訊是應(yīng)答式,總數(shù)據(jù)傳輸速度為3200B/s即25.6kbps,加上單片機(jī)數(shù)據(jù)處理的耗時(shí),通訊速率應(yīng)該可以達(dá)到20kbps。
單片機(jī)的串口通信速度依賴于單片機(jī)USART所設(shè)置的波特率,其單位時(shí)位/秒(b/s),即每秒鐘傳輸?shù)亩M(jìn)制位數(shù)。若設(shè)置為9600b/s,則每秒鐘傳輸?shù)淖止?jié)數(shù)為9600/8=1200Byte。由于USART本身是串行通信,所以收發(fā)數(shù)據(jù)時(shí)均是單字節(jié)到達(dá)的。而V-USB可以設(shè)置一次通訊所傳輸?shù)淖止?jié)數(shù),最大一次可以傳輸254Byte。在編程上可以一次傳輸處理指定字節(jié)的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)使用上更為簡(jiǎn)單。
綜上所述,兩種通信接口(如表1所示)各有優(yōu)缺點(diǎn)。V-USB適用于對(duì)單片機(jī)空閑時(shí)間多、通訊速度要求不高,硬件成本較低、易用性好、需要快速開(kāi)發(fā)應(yīng)用USB接口設(shè)備的單片機(jī)項(xiàng)目。串口通信適用于傳輸距離遠(yuǎn)、處理器功能任務(wù)復(fù)雜、需要對(duì)數(shù)據(jù)通信嚴(yán)格控制的單片機(jī)項(xiàng)目。
[1]V-USB項(xiàng)目.http://www.obdev.at/vusb/.
[2]libusb-win32項(xiàng)目.http://libusb-win32.sourceforge.net.
[3]ATMEL公司.http://www.atmel.com.
[4]MSDN.http://www.microsoft.com/msdn.