摘? 要: CAN總線監(jiān)控的EPP邏輯接口設(shè)計及用WinDriver實現(xiàn)的實時數(shù)據(jù)采集的可視化編程設(shè)計技術(shù),以實現(xiàn)主、備雙節(jié)點的監(jiān)控。
關(guān)鍵詞: EPP? 邏輯設(shè)計? WinDriver? 實時數(shù)據(jù)采集? 可視化編程
?
隨著CAN總線在通信設(shè)計系統(tǒng)中的應用,出現(xiàn)了不少CAN節(jié)點監(jiān)控產(chǎn)品。其中,以EPP并口為接口、以SJA1000做CAN協(xié)議控制器的微機監(jiān)控節(jié)點的產(chǎn)品更是獨樹一幟。這類產(chǎn)品硬件構(gòu)造簡單、DOS監(jiān)控軟件設(shè)計簡潔、通信快速、操作使用方便。本文即以這類產(chǎn)品為課題對其性能做進一步完善:(1)在EPP接口和SJA1000之間做可編程邏輯設(shè)計,使節(jié)點監(jiān)護通信更直截了當。(2)在監(jiān)控軟件設(shè)計上用WinDriver做底層驅(qū)動進行可視化編程,以增強人機接口界面,使監(jiān)控更加簡潔方便。(3)擴展單節(jié)點監(jiān)控為主、備雙節(jié)點監(jiān)控,使監(jiān)護全面完善。
1?系統(tǒng)總體硬件設(shè)計
系統(tǒng)總體硬件構(gòu)成如圖1所示。其中,2片SJA1000分別用于實現(xiàn)主節(jié)點和備用節(jié)點的CAN總線協(xié)議控制器,且為增強各自的驅(qū)動能力分別使用了1片82C250收發(fā)驅(qū)動器。2片SJA1000共用一套振蕩電路和一套復位電路,復位電路為簡單的阻容形式。由于EPP接口控制線己全部用做他用,故微機不能控制SJA1000做硬件復位,但為了調(diào)試方便,加入了按鈕做意外手動復位。1片PLD(EPM7032ST-10)用于實現(xiàn)EPP接口和SJA1000之間的通信傳輸控制;電源取自外部CAN總線系統(tǒng)的+5V電源;發(fā)光二極管用做電源和主、備節(jié)點的收發(fā)指示。

?
2?EPP和SJA1000之間的接口邏輯設(shè)計
在EPP接口和SJA1000之間加入適當?shù)倪壿嫿涌?,可以避免傳統(tǒng)設(shè)計中對EPP控制線的重新定義和特殊通信函數(shù)的書寫,縮短并口通信的時間,提高數(shù)據(jù)采集的實時性。這樣,通過EPP讀寫SJA1000時只要讀寫EPP地址和數(shù)據(jù)寄存器就可以了。
按照EPP并口協(xié)議和SJA1000讀寫時序,本設(shè)計以EPP并口的3根控制線/write、/AddStrb、/DataStr的邏輯時序來產(chǎn)生SJA1000讀寫控制的ALE、/wr、/rd邏輯和反饋回EPP的Wait信號邏輯。特別定義EPP接口的/reset控制線做主、備SJA1000的片選信號,低電平選中主SJA1000,高電平選中備用SJA1000。主、備SJA1000的中斷線相“與”后作為中斷信號輸入EPP并口中斷狀態(tài)線(EPP接口協(xié)議和SJA1000的讀寫時序己有不少文章做過介紹,在此不再贅述)。下面給出用Altera公司的AHDL語言書寫的邏輯設(shè)計(采用AHDL語言其目的是借用Altera功能強大的MaxplusⅡ做模擬分析)。
% interface_design for between EPP and SJA1000 %
SUBDESIGN interface
(?????/write,/AddStrb,/DataStrb :INPUT=GND;
??????/intrA,/intrb??????????????????? :INPUT=GND;
cs??????????????????????????????? :INPUT;
ALE,/wr,/rd,wait?????????????? :OUTPUT;
??????/csA,/csB,/intr???????????????? :OUTPUT;
)????? ?????????????? %帶″/″項表示低電平有效%
BEGIN
ALE=!/AddStrb;
!/wr=!/write & !/DataStrb;
!/rd=/write & !/DataStrb;
wait=!(/AddStrb & /DataStrb);
/csA=cs;
/csB=!cs;
/intr=!(/intrA & /intrb);
END
圖2是MaxPlusⅡ模擬分析“微機通過EPP寫SJA1000寄存器結(jié)果”的波形圖。圖中,首先進行地址選通、傳送并鎖存地址;然后是寫操作;最后一段是SJA1000中斷發(fā)生后,主機響應并進行讀操作。
?

3?WinDriver底層驅(qū)動程序的產(chǎn)生
實時數(shù)據(jù)采集程序的書寫離不開中斷的使用。為了在可視化編程中使用中斷,必須選擇適當?shù)墓ぞ邅頃鴮懙讓域?qū)動程序。目前,底層驅(qū)動程序的書寫工具很多,如DDK、SDK、VtoolsD、WinDriver等,這里選用Jungo公司簡單方便的開發(fā)工具WinDriver。
打開WinDriver的驅(qū)動向?qū)?,?chuàng)建一個新的驅(qū)動程序。WinDriver檢測外接硬件設(shè)備,產(chǎn)生連接設(shè)備列表,從中選用parallel port,指定WinDriver在一給定目錄下用C或Pascal語言產(chǎn)生VB、VC++、Dephi或C++Builder工程項目文件。這里選用C語言和C++Builder開發(fā)工具,指定LPT為文件前綴。
在給定目錄下,WinDriver的驅(qū)動向?qū)Э僧a(chǎn)生幾個文件和1個C++Builder子目錄。在產(chǎn)生的文件中,LPT.wdp、LPT_lib.h和LPT_lib.c是編寫應用程序必不可少的。LPT.wdp是WinDriver底層驅(qū)動程序和用戶程序溝通的關(guān)鍵樞紐,LPT_lib.h和LPT_lib.c是WinDriver提供的己包裝好的可直接使用的函數(shù)庫。在其他文件中,LPT_diag.h和LPT_diag.c是WinDriver提供的并口傳輸測試程序,可作為書寫應用程序的參考。下面給出產(chǎn)生的幾個主要函數(shù)。
3.1 并口開關(guān)函數(shù)
BOOL LPT_Open (LPT_HANDLE*phLPT);
void LPT_Close(LPT_HANDLE hLPT);
3.2 并口讀寫函數(shù)
BYTE LPT_Readstrobe_addr (LPT_HANDLE hLPT)
//用于讀并口地址
void LPT_Writestrobe_addr (LPT_HANDLE hLPT,BYTE data)
//用于寫并口地址
BYTE LPT_Readstrobe_data_0 (LPT_HANDLE hLPT)
//用于讀并口數(shù)據(jù)
void LPT_Writestrobe_data_0 (LPT_HANDLE hLPT,BYTE data)
//用于寫并口數(shù)據(jù)
BYTE LPT_Readcontrol (LPT_HANDLE hLPT);
//讀并口控制寄存器
void LPT_Writecontrol (LPT_HANDLE hLPT,BYTE data);
//寫并口控制寄存器
3.3 并口中斷函數(shù)
void LPT_IntADisable (LPT_HANDLE hLPT); //用于禁止并口中斷
BOOL LPT_IntAEnable (LPT_HANDLE hLPT,LPT_IntA_
HANDLER funcIntHandler); //用于使能并口中斷
?????? //funcIntHandler是中斷處理函數(shù),其函數(shù)原型如下:
void (*LPT_IntA_HANDLER)(LPT_HANDLE hLPT,LPT_IntA_
RESULT*intResult)
4? 可視化應用程序的設(shè)計
設(shè)計可視化應用程序時,要在人機界面窗口中做主、備CAN總線選擇和接收對象選擇。下面給出采用C++Builder5.5開發(fā)的部分程序片段(為簡化敘述,這里給出的是總線活動全部接收,按1次接收按鈕只接收1幀數(shù)據(jù)的程序,若總線無活動則定時自動退出)。
4.1 數(shù)據(jù)通信函數(shù)的構(gòu)造
void TForm1+∷bring(char addr,char data)
{LPT_Writestrobe_addr(hLPT,addr);
?LPT_Writestrobe_data_0 (hLPT,data);
}? ??? //通過并口向指定外部地址寫數(shù)據(jù)
char TForm1∷take(char addr)
{ LPT_Writestrobe_addr (hLPT,addr);
?return (LPT_Readstrobe_data_0 (hLPT));
}???? //通過并口從指定外部地址讀數(shù)據(jù)
4.2 接收數(shù)據(jù)程序的設(shè)計
void __fastcall TForm1∷Button1Click
?????? (TObject*Sender)
{
char cc;
cc=StrToInt(ComboBox1->Text);//選擇主或備CAN_設(shè)備
port=cc&0x040;
LPT_Open(&hLPT); //打開并口驅(qū)動程序
LPT_IntAEnable(hLPT,LPT_IntAHandlerRoutine);
//開放并口中斷,指明中斷服務地址
LPT_Writecontrol(hLPT,LPT_Readcontrol(hLPT)|0x10);
//開放并口中斷
/*------------初始化底層CanBus--------------*/
bring(0x00,0x01); //使SJA1000進入復位模式
if((take(0x00)&0xdf)!=0x01)
?????? {ShowMessage(″進入復位設(shè)置失?。 ?;exit;}
bring(0x06,0x01);?? //波特率=500Kbps(16MHz晶振)
bring(0x07,0x14);
bring(0x04,0x0);??? //指定總線活動全部接收
bring(0x05,0xff);
bring(0x08,0xfa);?? //Tx輸出控制設(shè)置
take(0x03);??????? //清SJA1000所有中斷
bring(0x00,0x00);?? //使SJA1000回到工作模式
if((take(0x00)&0xdf)!=0x00)
???? ?? {ShowMessage(″退回工作模式失敗!″);exit;}
bring(0x00,0x01);?? //開放CAN接收中斷
bring(0x01,0x04);?? //釋放接收緩沖區(qū)
Timer1->Enabled=true;???? //使能超時接收定時器
}
4.3 接收超時程序段的設(shè)計
這里使用定時器完成總線上無數(shù)據(jù)活動時的定時自動退出。
void __fastcall TForm1∷Timer1Timer(TObject*Sender)
{
Timer1->Enabled=false; //關(guān)閉定時器
LPT_IntADisable(hLPT); //關(guān)閉并口中斷
bring(0x00,0x00); //關(guān)閉SJA1000中斷
LPT_Writecontrol(hLPT,
LPT_Readcontrol(hLPT)&0xef);??? //禁止并口中斷
Label4->Caption=″沒有接收到任何數(shù)據(jù)!″;
LPT_Close(hLPT); //關(guān)閉底層驅(qū)動程序
}
4.4 中斷服務程序的設(shè)計
void LPT_IntAHandlerRoutine(LPT_HANDLE hLPT,LPT_IntA_
RESULT*intResult)
{char t,m[16];
int i;
Form1->Timer1->Enabled=false; //關(guān)閉定時器
t=Form1->take(0x03); //讀取并判斷接收中斷
if(!(t&0x01)) goto EE; //讀取接收識別碼
Form1->Edit1->Text=Form1->take(0x14);
Form1->Edit2->Text=Form1->take(0x15);
for(i=0;i<8;i++) //讀取接收數(shù)據(jù)字節(jié)
???? ?? {m[2*i]=Form1->take(0x16+i);m[2*i+1]=′,′;}
m[16]=′.′;
Form1->Edit3->Text=m;
Form1->Label4->Caption=″1幀數(shù)據(jù)接收完畢!″;
EE:
Form1->bring(0x00,0x00);//關(guān)閉SJA1000中斷
LPT_Writecontrol(hLPT,
LPT_Readcontrol(hLPT)&0xef);??? //禁止并口中斷
? LPT_IntADisable(hLPT); //關(guān)閉并口中斷
LPT_Close(hLPT); //關(guān)閉底層驅(qū)動程序
}
4.5 程序的編譯與發(fā)行
程序編譯前,為建立起與WinDriver底層驅(qū)動程序的鏈接,必須做到:
(1)在工程項目.cpp文件開始嵌入:
#include
USEUNIT(″..\lpt_lib.c″);
(2)在unit.cpp文件開始嵌入:
#include
(3)在unit.cpp文件開始定義變量:
LPT_HANDLE hLPT;
程序分發(fā)使用前,對于Windows NT/2000/98/ME,必須把WINDRVR.SYS文件拷貝到C:\WINNT\SYST- EM32\DRIVERS下;對于98/ME,也可以把windrvr.vxd程序拷貝到用戶windows\system\vmm32下,并使用wdreg.exe安裝運行該程序,格式為:wdreg -vxd install。
參考文獻
1?蔡琳潔.DSP和計算機并口的高速數(shù)據(jù)通訊.國外電子測量技術(shù),2001;(1)
2?姚振東.Windows95下基于EPP的ECG信號采集系統(tǒng).電子工程師,2000;(9)(10)
3?梁再信.增強性并行口協(xié)議及其在CAN監(jiān)控節(jié)點中的應用.PHYLIPS單片機世界,1999;(2)
4?劉正權(quán).關(guān)于CAN控制器SJA1000新特性的一些應用.電子技術(shù),2000;(11)
5?黃訊.利用WinDriver開發(fā)設(shè)備驅(qū)動程序.電子技術(shù)應用, 2001;(3)
