沈曉紅,李 凱,張艷婷
SHEN Xiao-hong, LI Kai, ZAHNG Yan-ting
(北京工商大學(xué) 材料與機(jī)械工程學(xué)院,北京 100048)
USB接口依靠其高速、支持熱插拔等特性,在外設(shè)接口類型中迅速崛起,逐漸成為PC機(jī)以及一些智能儀器與外設(shè)連接的普遍標(biāo)準(zhǔn)。同時(shí),這也使得目前許多采用并口連接外設(shè)的專用測(cè)控儀器的使用受到了限制。因此,為這類儀器擴(kuò)展USB接口勢(shì)在必行。另外,USB技術(shù)規(guī)范將USB進(jìn)行數(shù)據(jù)傳輸?shù)碾p方分成兩種角色:主(Host)和從(Slave),并且規(guī)定數(shù)據(jù)只能在Host和Slave之間傳輸[1]。但在目前絕大多數(shù)的設(shè)備以及研究中,Host功能被集成在計(jì)算機(jī)上,基于USB的設(shè)備大部分都只集成了Slave功能,這樣USB設(shè)備必須依賴于PC機(jī)操作。為了脫離這種以計(jì)算機(jī)為核心的數(shù)據(jù)傳輸結(jié)構(gòu),使得USB設(shè)備應(yīng)用于專業(yè)測(cè)控儀器,必須在這些儀器中實(shí)現(xiàn)USB主機(jī)功能。
基于此,本文作者采用Atmel公司的AVR系列單片機(jī)ATmega8和南京沁恒公司的USB接口芯片CH375設(shè)計(jì)了一款并口轉(zhuǎn)USB接口的轉(zhuǎn)接模塊,從而實(shí)現(xiàn)了上述的功能,使傳統(tǒng)測(cè)控設(shè)備能與USB主機(jī)系統(tǒng)高速通信。該模塊可以方便地移植進(jìn)各種智能儀器中,為儀器擴(kuò)展USB接口。
系統(tǒng)采用AVR高速單片機(jī)ATmega8作為單片機(jī)主控模塊。ATmega8是一款采用低功耗CMOS工藝生產(chǎn)的基于AVR RISC(精簡(jiǎn)指令集)結(jié)構(gòu)的8位單片機(jī)[2]。AVR單片機(jī)的核心是將32個(gè)工作寄存器和豐富的指令集連接在一起,所有的工作寄存器都與ALU(算術(shù)邏輯單元)直接相連,可在一個(gè)時(shí)鐘周期內(nèi)用一條指令同時(shí)訪問(讀寫)2個(gè)獨(dú)立的寄存器。這種結(jié)構(gòu)可提高代碼效率,使得大部分指令的執(zhí)行時(shí)間僅為一個(gè)時(shí)鐘周期,故可達(dá)到將近1MIPS/MHZ的性能,運(yùn)行速度比普通單片機(jī)高出10倍。
本系統(tǒng)選用南京沁恒公司生產(chǎn)的CH375芯片作為USB控制器。CH375是一個(gè)USB總線的接口芯片,具有接口簡(jiǎn)單、價(jià)格低廉的優(yōu)點(diǎn)。專用USB總線接口芯片內(nèi)部不帶處理器,而僅僅負(fù)責(zé)處理USB通信,必須有一個(gè)外部的處理器來完成協(xié)議處理和數(shù)據(jù)交換。由于這些接口芯片依賴于外部的微處理器實(shí)現(xiàn)USB接口的全部功能,所以可以在保持原有硬件平臺(tái)基本不變的情況下,通過更改軟件模塊對(duì)原有設(shè)備進(jìn)行維護(hù)或升級(jí),因而可擴(kuò)展性更強(qiáng)[3]。CH375支持USB-HOST主機(jī)方式和USB-DEVICE/SLAVE設(shè)備方式。在本地端,CH375具有8位數(shù)據(jù)總線和讀、寫、片選控制線以及中斷輸出,可以方便地掛接到單片機(jī)/DSP/MCU/MPU等控制器的系統(tǒng)總線上。在USB主機(jī)方式下,CH375還提供了串行通訊方式,通過串行輸入、串行輸出和中斷輸出與單片機(jī)/DSP/MCU/MPU等相連接。
系統(tǒng)硬件整體結(jié)構(gòu)框圖如圖1所示。
圖1 硬件整體結(jié)構(gòu)框圖
系統(tǒng)的硬件設(shè)計(jì)主要是單片機(jī)主控模塊設(shè)計(jì)和USB主控制器模塊設(shè)計(jì)。
下面以連接打印外設(shè)為例,介紹系統(tǒng)的工作原理:測(cè)控儀器將打印數(shù)據(jù)通過自身的并口傳送給單片機(jī)模塊,并暫存在單片機(jī)內(nèi)部的數(shù)據(jù)緩沖區(qū)中,等待USB主控芯片模塊發(fā)出中斷請(qǐng)求,收到USB主控芯片發(fā)送的打印數(shù)據(jù)的中斷請(qǐng)求后,單片機(jī)把數(shù)據(jù)傳送給USB主控芯片,USB主控芯片再將打印數(shù)據(jù)通過USB總線發(fā)送給打印機(jī),并在打印語(yǔ)言的控制下按要求格式打印出數(shù)據(jù)。系統(tǒng)總原理圖如圖2所示。
并口的信號(hào)、BUSY信號(hào)、ACK信號(hào)分別連接 ATmega8的 PD3、PC5和 PC4,8位數(shù)據(jù)線分別連接ATmega8的 PB0~PB3、PC0~PC3。USB接口芯片CH375在本地端采用串行接口與ATmega8通信,串口信號(hào)線包括:串行數(shù)據(jù)輸出引腳TXD、串行數(shù)據(jù)輸入引腳RXD和中斷輸出引腳INT#。通過串行接口,CH375可以用最少的連線與單片機(jī)進(jìn)行較遠(yuǎn)距離的點(diǎn)對(duì)點(diǎn)連接。CH375芯片的RXD和TXD可以分別連接到單片機(jī)的串行數(shù)據(jù)輸出引腳和串行數(shù)據(jù)輸入引腳。INT#輸出的中斷請(qǐng)求是低電平有效,用于通知單片機(jī)。ATmega8可以通過查詢或中斷的方式獲得中斷信號(hào)。數(shù)據(jù)線D+、D-用于收發(fā)USB總線傳輸?shù)臄?shù)據(jù)差分信號(hào)。
圖2 系統(tǒng)原理圖
單片機(jī)與CH375的通信主要靠單片機(jī)給CH375發(fā)命令和數(shù)據(jù)來完成,而CH375給出了許多常用命令以及操作狀態(tài)的代碼,比如:從USB中斷的端點(diǎn)緩沖區(qū)讀取數(shù)據(jù)塊命令CMD_RD_USB_DATA,向USB主機(jī)端點(diǎn)的發(fā)送緩沖區(qū)寫入數(shù)據(jù)塊命令CMD_WR_USB_DATA7等。因此,可以將這些命令做成函數(shù),即通過函數(shù)實(shí)現(xiàn)該命令;然后在編寫其他函數(shù)時(shí)就可以直接調(diào)用這些命令函數(shù)。
系統(tǒng)軟件設(shè)計(jì)主要包括ATmega8及CH375的初始化、CH375與ATmega8的通信程序設(shè)計(jì)、USB外設(shè)的枚舉初始化、數(shù)據(jù)傳送等。本設(shè)計(jì)采用了ICCAVR編譯器來進(jìn)行程序設(shè)計(jì)。
ATmega8的初始化主要是指其I/O口初始化和USART(通用同步和異步串行接收器和轉(zhuǎn)發(fā)器)的初始化。
I/O口的初始化程序如下:
USART(通用同步和異步串行接收器和轉(zhuǎn)發(fā)器)的初始化程序如下:
CH375的初始化主要是CH375復(fù)位并通過函數(shù)SET_USB_MODE(6)來設(shè)置其主機(jī)模式。
本設(shè)計(jì)中ATmega8采用USART(通用同步和異步串行接收器和轉(zhuǎn)發(fā)器)與CH375進(jìn)行通信。CH375的串行數(shù)據(jù)格式是1個(gè)起始位、9個(gè)數(shù)據(jù)位、1個(gè)停止位,其中前8個(gè)數(shù)據(jù)位是一個(gè)字節(jié)數(shù)據(jù),最后1個(gè)數(shù)據(jù)位是命令標(biāo)志位。第9位為0時(shí),前8位的數(shù)據(jù)被寫入CH375芯片中,第9位為1時(shí),前8位被作為命令碼寫入CH375芯片中。
根據(jù)此串行數(shù)據(jù)格式,ATmega8采用9位數(shù)據(jù)位的幀格式。如果發(fā)送9位數(shù)據(jù)的數(shù)據(jù)幀(UCSZ=7),應(yīng)先將數(shù)據(jù)的第9位寫入寄存器UCSRB的TXB8,然后再將低8位數(shù)據(jù)寫入發(fā)送數(shù)據(jù)寄存器UDR。接收數(shù)據(jù)時(shí),在從UDR讀取低8位之前必須首先讀取寄存器UCSRB的RXB8以獲得第9位數(shù)據(jù)。據(jù)此編寫的向CH375寫命令、寫數(shù)據(jù)以及從CH375讀數(shù)據(jù)的程序如下:
向CH375寫命令子程序:
向CH375寫數(shù)據(jù)子程序:
在USB設(shè)備首次連接到主機(jī)上之后,要接受主機(jī)的枚舉。其具體過程如下:
1)主機(jī)檢測(cè)設(shè)備的連接,發(fā)出復(fù)位信號(hào):當(dāng)USB外設(shè)連接到主機(jī)之后,通過CH375提供的命令代碼CMD_GET_STATUS來獲取CH375的中斷狀態(tài),如果返回狀態(tài)代碼USB_INT_CONNECT,則表明檢測(cè)到USB外設(shè)的連接。檢測(cè)到后,主機(jī)等待100ms以使設(shè)備的接入過程順利完成,并使供電穩(wěn)定,并向USB信號(hào)線的D+和D-輸出低電平,復(fù)位USB外設(shè)。
2)USB外設(shè)缺省狀態(tài):集線器在設(shè)備接入的端口上保持復(fù)位命令10ms,這時(shí)設(shè)備處于缺省狀態(tài),并通過地址0與主機(jī)通信。
3)讀取設(shè)備描述符:主機(jī)獲取USB外設(shè)的設(shè)備描述符,獲得缺省管道的最大數(shù)據(jù)長(zhǎng)度等一系列信息,并確認(rèn)USB設(shè)備的屬性。此過程主要通過CH375提供的命令代碼CMD_GET_DESCR(1)來獲取設(shè)備描述符,數(shù)據(jù)傳輸完成后,將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,并返回描述符的長(zhǎng)度。
4)地址分配:主機(jī)給設(shè)備分配一個(gè)總線上的惟一地址,使設(shè)備進(jìn)入地址態(tài)。以后,設(shè)備就將使用這個(gè)新地址。此過程主要通過命令代碼CMD_SET_ADDRESS和CMD_SET_USB_ADDR分別對(duì)USB設(shè)備端和主機(jī)端設(shè)置地址。
5)讀取配置描述符:主機(jī)通過命令代碼CMD_GET_DESCR(2)獲取USB外設(shè)的配置描述符,將獲取的描述符數(shù)據(jù)從CH375中讀出到單片機(jī)的RAM緩沖區(qū)中,并返回描述符的長(zhǎng)度。
6)配置USB設(shè)備:在得到配置描述符等一系列信息后,主機(jī)就給該設(shè)備分配配置值。此過程通過命令代碼CMD_SET_CONFIG來實(shí)現(xiàn)。
USB外設(shè)枚舉初始化的程序如下:
USB的數(shù)據(jù)同步通過切換DATA0和DATA1實(shí)現(xiàn);在設(shè)備端,USB外設(shè)可以自動(dòng)切換;在主機(jī)端,必須由CMD_SET_ENDP6和CMD_SET_ENDP7命令控制CH375切換DATA0與DATA1實(shí)現(xiàn)。主機(jī)端的程序處理方法是為設(shè)備端的各個(gè)端點(diǎn)分別提供一個(gè)全局變量,初始值均為DATA0,每執(zhí)行一次成功事務(wù)后取反,每執(zhí)行一次失敗事務(wù)后將其復(fù)位為DATA1。
根據(jù)USB批量傳輸協(xié)議,在進(jìn)行數(shù)據(jù)批量傳輸前,先判斷數(shù)據(jù)長(zhǎng)度len是否大于端點(diǎn)尺寸endp_out_size;如果大于,則此次發(fā)送的數(shù)據(jù)長(zhǎng)度為endp_out_siae;反之為len。每次成功發(fā)送數(shù)據(jù)后,需要計(jì)算剩余的數(shù)據(jù)長(zhǎng)度,并與端點(diǎn)尺寸進(jìn)行比較,從而決定要發(fā)送的數(shù)據(jù)長(zhǎng)度,直到全部數(shù)據(jù)發(fā)送完成。
數(shù)據(jù)批量傳輸部分程序如下:
本設(shè)計(jì)采用AVR高速單片機(jī)ATmega8作為USB主機(jī)處理器,采用國(guó)產(chǎn)芯片CH375作為USB主控芯片,實(shí)現(xiàn)了并口到USB接口的轉(zhuǎn)換,從而實(shí)現(xiàn)與USB主機(jī)系統(tǒng)的高速通信,為測(cè)控儀器擴(kuò)展了USB接口。該轉(zhuǎn)接模塊抗干擾能力強(qiáng)、可靠性高、連接靈活、使用方便,已成功應(yīng)用在諸如便攜式數(shù)字化超聲波探傷儀等專用測(cè)控儀器中,并取得了良好的效果。
[1]Universal Serial Bus Specification Revision 1.1 [S].http∶ //www.usb.Org, 1998.
[2]馬潮, 等.ATmega8原理及應(yīng)用手冊(cè)[M].清華大學(xué)出版社, 2003.
[3]李肇慶, 廖峰, 劉建存.USB接口技術(shù)[M].國(guó)防工業(yè)出版社, 2004.
[4]CH375中文手冊(cè).南京沁恒公司.
[5]馬偉.計(jì)算機(jī)USB系統(tǒng)原理及其主/從機(jī)設(shè)計(jì)[M].北京航空航天大學(xué)出版社, 2004.
[6]梁建均.32位視窗系統(tǒng)串行通訊的串口設(shè)置[J].安陽(yáng)師范學(xué)院學(xué)報(bào), 2002.
[7]馮星華, 張海洪.PLC與個(gè)人計(jì)算機(jī)間串行通訊及程序設(shè)計(jì)[J].機(jī)電一體化, 2000.
[8]王芙蓉, 黃載祿.一種可擴(kuò)展的移動(dòng)通訊系統(tǒng)HLR設(shè)計(jì)方案.[J].華中科技大學(xué)學(xué)報(bào), 2001.
[9]羅耀華, 劉昕.用于DSP的多串口擴(kuò)展通訊模塊設(shè)計(jì)[J].一重技術(shù), 2007.
[10]張文超, 盧可義, 劉振方.幾種可用于測(cè)控儀器的串行總線研究和應(yīng)用選擇原則[J].測(cè)控技術(shù), 2005.