基于USB總線通信數(shù)據(jù)采集器的設(shè)計(jì)與實(shí)現(xiàn)
AT89C52的控制程序分為初始化、主循環(huán)和中斷服務(wù)3部分。初始化部分完成單片機(jī)和所有外圍電路(包括PDIUSBD12)的初始化;主循環(huán)部分等待來自上位機(jī)的命令或來自終端設(shè)備的數(shù)據(jù);中斷服務(wù)程序完成相應(yīng)的中斷處理功能。下面列出了中斷服務(wù)程序的處理過程:
usb_isr( )interrupt( )
{DISABLE
fn_usb_isr( );
ENABLE
}
void fn_usb_isr( )
{unsigned int i_st
bEPPflags.bits.in_isr=1;
i_st=D12_ReadInterruptRegister( );//讀中斷寄存器
if(i_st !=0)
{ if(i_stD12_INT_BUSRESET)
{ bus_reset( );//總線復(fù)位處理
bEPPflags.bits.bus_reset=1;
}
if(i_stD12_INT_EOT)
dma_eot( );//DMA結(jié)束處理
if(i_st Dl2_INT_SUSPENDCHANGE)
bEPPflags.bits.suspend=1;
if(i_st Dl2_INT_ENDPOIN)
ep0-txdone( );//控制端點(diǎn)0輸入
if(i_stD12_INT_ENDPOOUT)
ep0-rxdone( );//控制端點(diǎn)0輸出
if(i_stD12_INT_ENDPlIN)
epl_txdone( );//端點(diǎn)1輸入
if(i_stD12_INT_ENDPlOUT)
epl_rxdone( );//端點(diǎn)1輸出
if(i_stDl2_INT_ENDP2IN)
main_txdone( );//主端點(diǎn)2輸入
if(i_stD12_INT_ENDP20UT)
main-rxdone( );//主端點(diǎn)2輸出
}
bEPPflags.bits.in_isr=0;
}
設(shè)備安裝完后準(zhǔn)備運(yùn)行前,操作人員可利用上位機(jī)管理軟件提供的用戶界面初始化一些系統(tǒng)參數(shù),如總線類型、終端類型等。在執(zhí)行對(duì)終端單元的智能識(shí)別時(shí),MCU首先接收一個(gè)上位機(jī)客戶服務(wù)軟件下傳的指令幀,經(jīng)過確認(rèn)是協(xié)議識(shí)別指令后,上傳一個(gè)表示就緒的狀態(tài)幀。然后,接收識(shí)別用的數(shù)據(jù)幀,經(jīng)過檢驗(yàn),如果數(shù)據(jù)幀有錯(cuò)就返回相應(yīng)的狀態(tài)幀并等待上位機(jī)重新發(fā)出數(shù)據(jù),如果數(shù)據(jù)正確則先返回狀態(tài)幀,然后開始對(duì)終端單元的識(shí)別與數(shù)據(jù)采集。
對(duì)一個(gè)固定的終端而言,MCU發(fā)出握手信號(hào),遠(yuǎn)方終端返回相應(yīng)的信息,數(shù)據(jù)經(jīng)RS232/RS485接收,經(jīng)過MCU的協(xié)議解析后得到所需的純數(shù)據(jù),將其暫存入RAM62256中的指定地址;當(dāng)上位機(jī)發(fā)出讀取數(shù)據(jù)的命令后MCU將數(shù)據(jù)經(jīng)PDIUSBD12傳給上位機(jī)。
4.2 上位機(jī)的程序設(shè)計(jì)
從上位機(jī)來看,通信數(shù)據(jù)采集器為它的一個(gè)USB外設(shè),因此上位機(jī)必須提供USB外設(shè)的驅(qū)動(dòng)程序。上位機(jī)的管理軟件包括客戶服務(wù)程序和USB驅(qū)動(dòng)程序。USB驅(qū)動(dòng)程序(USBD)是駐留在上位機(jī)的為客戶提供通用服務(wù)的軟件實(shí)體,它管理主控制器上的一個(gè)或多個(gè)功能。它通過調(diào)用適當(dāng)?shù)闹骺刂破黩?qū)動(dòng)程序(HCD)將用戶I/O請(qǐng)求包(IRP)中的數(shù)據(jù)轉(zhuǎn)化為設(shè)備端點(diǎn)的數(shù)據(jù),或通過回調(diào)適當(dāng)?shù)腍CD將設(shè)備端點(diǎn)的數(shù)據(jù)轉(zhuǎn)化為客戶IRP中的數(shù)據(jù)。
客戶服務(wù)程序是用VC++6.0編寫的,主要完成數(shù)據(jù)的分析顯示功能。MCU上傳的數(shù)據(jù)信息經(jīng)過相應(yīng)的校驗(yàn),如有誤,則通知終端重傳;如無誤,則將校驗(yàn)后的信息轉(zhuǎn)存人計(jì)算機(jī)指定的內(nèi)存,并備份到相應(yīng)的文檔,供其他的客戶服務(wù)程序使用。
USB驅(qū)動(dòng)程序的編寫往往是USB設(shè)備開發(fā)過程中最困難的,通常采用Windows DDK來實(shí)現(xiàn)。目前有許多軟件廠商提供各種各樣的驅(qū)動(dòng)程序生成工具,如Computer ware的Driver Studio,Blue Waters的Driver Wizard等。本設(shè)計(jì)是采用Driver Studio軟件生成的程序框架,添加了適當(dāng)?shù)挠脩舸a,完成了適合于通信數(shù)據(jù)采集器的驅(qū)動(dòng)程序的編寫。
5 通信數(shù)據(jù)采集器與傳統(tǒng)數(shù)據(jù)采集方式通信效率的比較
以采集歐姆龍公司的可編程邏輯控制器(PLC)為例,一次采集30個(gè)通道,每個(gè)通道16個(gè)開關(guān)量(即4個(gè)十六進(jìn)制數(shù)),則有120個(gè)十六進(jìn)制數(shù)需要采集和傳輸,加上通信協(xié)議中的其它位,一幀共有131個(gè)字符,每一個(gè)字符又按串行通信中的一幀11位來發(fā)送,則共有1441位ASCII碼有待傳輸。若波特率設(shè)為9600b/s,則每采集一次需要用時(shí)150ms,在此期間每一幀的接收、效驗(yàn)工作都需CPU的介入。若以傳統(tǒng)的方式進(jìn)行數(shù)據(jù)的采集和通信,那么主機(jī)CPU在這段時(shí)間就被串行通信的事務(wù)占用而不能處理其它工作,這很耽誤時(shí)間。而采用通信數(shù)據(jù)采集器代替主機(jī)來完成這一費(fèi)時(shí)的工作后,數(shù)據(jù)的采集、傳輸以及協(xié)議的解析都不需占用主機(jī)的時(shí)間,解析后的純數(shù)據(jù)經(jīng)過PDIUS-BDl2上傳也僅需很短時(shí)間即可完成(大約為0.12ms,PDIUSBD12在同步模式下的數(shù)據(jù)傳輸率為1Mb/s),通信效率比傳統(tǒng)方式提高了很多倍,這樣就把主機(jī)從通信瓶頸中解放出來,為主機(jī)節(jié)省了大量的時(shí)間去完成其它工作。
6 結(jié)論
本文提出的基于USB總線的智能通信數(shù)據(jù)采集器具有數(shù)據(jù)采集和通信的效率高,結(jié)構(gòu)簡(jiǎn)單,運(yùn)行可靠,使用方便等優(yōu)點(diǎn),在實(shí)際應(yīng)用中取得了良好的效果。它適用于實(shí)時(shí)監(jiān)控、數(shù)據(jù)采集等場(chǎng)合,也可以增強(qiáng)協(xié)議識(shí)別和協(xié)議解析功能,因而在有標(biāo)準(zhǔn)通信協(xié)議和規(guī)范化的數(shù)據(jù)格式而缺少詳細(xì)技術(shù)資料的終端設(shè)備的通信中具有廣泛的使用價(jià)值。
光電開關(guān)相關(guān)文章:光電開關(guān)原理
評(píng)論