《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 其他 > 业界动态 > EPP逻辑接口WinDriver底层驱动的可视化主备CAN监控节点的设计

EPP逻辑接口WinDriver底层驱动的可视化主备CAN监控节点的设计

2009-10-12
作者:怯肇乾

  摘? 要: CAN總線監(jiān)控的EPP邏輯接口設(shè)計(jì)及用WinDriver實(shí)現(xiàn)的實(shí)時(shí)數(shù)據(jù)采集的可視化編程設(shè)計(jì)技術(shù),以實(shí)現(xiàn)主、備雙節(jié)點(diǎn)的監(jiān)控。

  關(guān)鍵詞: EPP? 邏輯設(shè)計(jì)? WinDriver? 實(shí)時(shí)數(shù)據(jù)采集? 可視化編程

?

  隨著CAN總線在通信設(shè)計(jì)系統(tǒng)中的應(yīng)用,出現(xiàn)了不少CAN節(jié)點(diǎn)監(jiān)控產(chǎn)品。其中,以EPP并口為接口、以SJA1000做CAN協(xié)議控制器的微機(jī)監(jiān)控節(jié)點(diǎn)的產(chǎn)品更是獨(dú)樹(shù)一幟。這類產(chǎn)品硬件構(gòu)造簡(jiǎn)單、DOS監(jiān)控軟件設(shè)計(jì)簡(jiǎn)潔、通信快速、操作使用方便。本文即以這類產(chǎn)品為課題對(duì)其性能做進(jìn)一步完善:(1)在EPP接口和SJA1000之間做可編程邏輯設(shè)計(jì),使節(jié)點(diǎn)監(jiān)護(hù)通信更直截了當(dāng)。(2)在監(jiān)控軟件設(shè)計(jì)上用WinDriver做底層驅(qū)動(dòng)進(jìn)行可視化編程,以增強(qiáng)人機(jī)接口界面,使監(jiān)控更加簡(jiǎn)潔方便。(3)擴(kuò)展單節(jié)點(diǎn)監(jiān)控為主、備雙節(jié)點(diǎn)監(jiān)控,使監(jiān)護(hù)全面完善。

1?系統(tǒng)總體硬件設(shè)計(jì)

  系統(tǒng)總體硬件構(gòu)成如圖1所示。其中,2片SJA1000分別用于實(shí)現(xiàn)主節(jié)點(diǎn)和備用節(jié)點(diǎn)的CAN總線協(xié)議控制器,且為增強(qiáng)各自的驅(qū)動(dòng)能力分別使用了1片82C250收發(fā)驅(qū)動(dòng)器。2片SJA1000共用一套振蕩電路和一套復(fù)位電路,復(fù)位電路為簡(jiǎn)單的阻容形式。由于EPP接口控制線己全部用做他用,故微機(jī)不能控制SJA1000做硬件復(fù)位,但為了調(diào)試方便,加入了按鈕做意外手動(dòng)復(fù)位。1片PLD(EPM7032ST-10)用于實(shí)現(xiàn)EPP接口和SJA1000之間的通信傳輸控制;電源取自外部CAN總線系統(tǒng)的+5V電源;發(fā)光二極管用做電源和主、備節(jié)點(diǎn)的收發(fā)指示。

?

2?EPP和SJA1000之間的接口邏輯設(shè)計(jì)

  在EPP接口和SJA1000之間加入適當(dāng)?shù)倪壿嫿涌?,可以避免傳統(tǒng)設(shè)計(jì)中對(duì)EPP控制線的重新定義和特殊通信函數(shù)的書(shū)寫(xiě),縮短并口通信的時(shí)間,提高數(shù)據(jù)采集的實(shí)時(shí)性。這樣,通過(guò)EPP讀寫(xiě)SJA1000時(shí)只要讀寫(xiě)EPP地址和數(shù)據(jù)寄存器就可以了。

  按照EPP并口協(xié)議和SJA1000讀寫(xiě)時(shí)序,本設(shè)計(jì)以EPP并口的3根控制線/write、/AddStrb、/DataStr的邏輯時(shí)序來(lái)產(chǎn)生SJA1000讀寫(xiě)控制的ALE、/wr、/rd邏輯和反饋回EPP的Wait信號(hào)邏輯。特別定義EPP接口的/reset控制線做主、備SJA1000的片選信號(hào),低電平選中主SJA1000,高電平選中備用SJA1000。主、備SJA1000的中斷線相“與”后作為中斷信號(hào)輸入EPP并口中斷狀態(tài)線(EPP接口協(xié)議和SJA1000的讀寫(xiě)時(shí)序己有不少文章做過(guò)介紹,在此不再贅述)。下面給出用Altera公司的AHDL語(yǔ)言書(shū)寫(xiě)的邏輯設(shè)計(jì)(采用AHDL語(yǔ)言其目的是借用Altera功能強(qiáng)大的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;

)?????     ?????????????? %帶″/″項(xiàng)表示低電平有效%

BEGIN

  ALE=!/AddStrb;

  !/wr=!/write & !/DataStrb;

  !/rd=/write & !/DataStrb;

  wait=!(/AddStrb & /DataStrb);

  /csA=cs;

  /csB=!cs;

  /intr=!(/intrA & /intrb);

END

  圖2是MaxPlusⅡ模擬分析“微機(jī)通過(guò)EPP寫(xiě)SJA1000寄存器結(jié)果”的波形圖。圖中,首先進(jìn)行地址選通、傳送并鎖存地址;然后是寫(xiě)操作;最后一段是SJA1000中斷發(fā)生后,主機(jī)響應(yīng)并進(jìn)行讀操作。

?

3?WinDriver底層驅(qū)動(dòng)程序的產(chǎn)生

  實(shí)時(shí)數(shù)據(jù)采集程序的書(shū)寫(xiě)離不開(kāi)中斷的使用。為了在可視化編程中使用中斷,必須選擇適當(dāng)?shù)墓ぞ邅?lái)書(shū)寫(xiě)底層驅(qū)動(dòng)程序。目前,底層驅(qū)動(dòng)程序的書(shū)寫(xiě)工具很多,如DDK、SDK、VtoolsD、WinDriver等,這里選用Jungo公司簡(jiǎn)單方便的開(kāi)發(fā)工具WinDriver。

  打開(kāi)WinDriver的驅(qū)動(dòng)向?qū)?,?chuàng)建一個(gè)新的驅(qū)動(dòng)程序。WinDriver檢測(cè)外接硬件設(shè)備,產(chǎn)生連接設(shè)備列表,從中選用parallel port,指定WinDriver在一給定目錄下用C或Pascal語(yǔ)言產(chǎn)生VB、VC++、Dephi或C++Builder工程項(xiàng)目文件。這里選用C語(yǔ)言和C++Builder開(kāi)發(fā)工具,指定LPT為文件前綴。

  在給定目錄下,WinDriver的驅(qū)動(dòng)向?qū)Э僧a(chǎn)生幾個(gè)文件和1個(gè)C++Builder子目錄。在產(chǎn)生的文件中,LPT.wdp、LPT_lib.h和LPT_lib.c是編寫(xiě)應(yīng)用程序必不可少的。LPT.wdp是WinDriver底層驅(qū)動(dòng)程序和用戶程序溝通的關(guān)鍵樞紐,LPT_lib.h和LPT_lib.c是WinDriver提供的己包裝好的可直接使用的函數(shù)庫(kù)。在其他文件中,LPT_diag.h和LPT_diag.c是WinDriver提供的并口傳輸測(cè)試程序,可作為書(shū)寫(xiě)應(yīng)用程序的參考。下面給出產(chǎn)生的幾個(gè)主要函數(shù)。

3.1 并口開(kāi)關(guān)函數(shù)

  BOOL LPT_Open (LPT_HANDLE*phLPT);

  void LPT_Close(LPT_HANDLE hLPT);

3.2 并口讀寫(xiě)函數(shù)

  BYTE LPT_Readstrobe_addr (LPT_HANDLE hLPT)

                       //用于讀并口地址

  void LPT_Writestrobe_addr (LPT_HANDLE hLPT,BYTE data)

                       //用于寫(xiě)并口地址

  BYTE LPT_Readstrobe_data_0 (LPT_HANDLE hLPT)

                       //用于讀并口數(shù)據(jù)

  void LPT_Writestrobe_data_0 (LPT_HANDLE hLPT,BYTE data)

                       //用于寫(xiě)并口數(shù)據(jù)

  BYTE LPT_Readcontrol (LPT_HANDLE hLPT);

                       //讀并口控制寄存器

  void LPT_Writecontrol (LPT_HANDLE hLPT,BYTE data);

                       //寫(xiě)并口控制寄存器

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? 可視化應(yīng)用程序的設(shè)計(jì)

  設(shè)計(jì)可視化應(yīng)用程序時(shí),要在人機(jī)界面窗口中做主、備CAN總線選擇和接收對(duì)象選擇。下面給出采用C++Builder5.5開(kāi)發(fā)的部分程序片段(為簡(jiǎn)化敘述,這里給出的是總線活動(dòng)全部接收,按1次接收按鈕只接收1幀數(shù)據(jù)的程序,若總線無(wú)活動(dòng)則定時(shí)自動(dòng)退出)。

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);

}?    ??? //通過(guò)并口向指定外部地址寫(xiě)數(shù)據(jù)

char TForm1∷take(char addr)

{ LPT_Writestrobe_addr (hLPT,addr);

?return (LPT_Readstrobe_data_0 (hLPT));

}????     //通過(guò)并口從指定外部地址讀數(shù)據(jù)

4.2 接收數(shù)據(jù)程序的設(shè)計(jì)

void __fastcall TForm1∷Button1Click

?????? (TObject*Sender)

{

  char cc;

  cc=StrToInt(ComboBox1->Text);//選擇主或備CAN_設(shè)備

  port=cc&0x040;

  LPT_Open(&hLPT);       //打開(kāi)并口驅(qū)動(dòng)程序

  LPT_IntAEnable(hLPT,LPT_IntAHandlerRoutine);

                //開(kāi)放并口中斷,指明中斷服務(wù)地址

  LPT_Writecontrol(hLPT,LPT_Readcontrol(hLPT)|0x10);

                //開(kāi)放并口中斷

/*------------初始化底層CanBus--------------*/

  bring(0x00,0x01);      //使SJA1000進(jìn)入復(fù)位模式

  if((take(0x00)&0xdf)!=0x01)

    ?????? {ShowMessage(″進(jìn)入復(fù)位設(shè)置失??!″);exit;}

  bring(0x06,0x01);??     //波特率=500Kbps(16MHz晶振)

  bring(0x07,0x14);

  bring(0x04,0x0);??? //指定總線活動(dòng)全部接收

  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);?? //開(kāi)放CAN接收中斷

  bring(0x01,0x04);?? //釋放接收緩沖區(qū)

  Timer1->Enabled=true;???? //使能超時(shí)接收定時(shí)器

}

4.3 接收超時(shí)程序段的設(shè)計(jì)

  這里使用定時(shí)器完成總線上無(wú)數(shù)據(jù)活動(dòng)時(shí)的定時(shí)自動(dòng)退出。

void __fastcall TForm1∷Timer1Timer(TObject*Sender)

{

  Timer1->Enabled=false;   //關(guān)閉定時(shí)器

  LPT_IntADisable(hLPT);   //關(guān)閉并口中斷

  bring(0x00,0x00);     //關(guān)閉SJA1000中斷

  LPT_Writecontrol(hLPT,

  LPT_Readcontrol(hLPT)&0xef);??? //禁止并口中斷

  Label4->Caption=″沒(méi)有接收到任何數(shù)據(jù)!″;

  LPT_Close(hLPT);        //關(guān)閉底層驅(qū)動(dòng)程序

}

4.4 中斷服務(wù)程序的設(shè)計(jì)

void LPT_IntAHandlerRoutine(LPT_HANDLE hLPT,LPT_IntA_

RESULT*intResult)

{char t,m[16];

  int i;

  Form1->Timer1->Enabled=false;  //關(guān)閉定時(shí)器

  t=Form1->take(0x03);       //讀取并判斷接收中斷

  if(!(t&0x01)) goto EE;      //讀取接收識(shí)別碼

  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ū)動(dòng)程序

} 

4.5 程序的編譯與發(fā)行

  程序編譯前,為建立起與WinDriver底層驅(qū)動(dòng)程序的鏈接,必須做到:

  (1)在工程項(xiàng)目.cpp文件開(kāi)始嵌入:

  #include

  USEUNIT(″..\lpt_lib.c″);

  (2)在unit.cpp文件開(kāi)始嵌入:

  #include

  (3)在unit.cpp文件開(kāi)始定義變量:

  LPT_HANDLE hLPT;

  程序分發(fā)使用前,對(duì)于Windows NT/2000/98/ME,必須把WINDRVR.SYS文件拷貝到C:\WINNT\SYST- EM32\DRIVERS下;對(duì)于98/ME,也可以把windrvr.vxd程序拷貝到用戶windows\system\vmm32下,并使用wdreg.exe安裝運(yùn)行該程序,格式為:wdreg -vxd install。

參考文獻(xiàn)

1?蔡琳潔.DSP和計(jì)算機(jī)并口的高速數(shù)據(jù)通訊.國(guó)外電子測(cè)量技術(shù),2001;(1)

2?姚振東.Windows95下基于EPP的ECG信號(hào)采集系統(tǒng).電子工程師,2000;(9)(10)

3?梁再信.增強(qiáng)性并行口協(xié)議及其在CAN監(jiān)控節(jié)點(diǎn)中的應(yīng)用.PHYLIPS單片機(jī)世界,1999;(2)

4?劉正權(quán).關(guān)于CAN控制器SJA1000新特性的一些應(yīng)用.電子技術(shù),2000;(11)

5?黃訊.利用WinDriver開(kāi)發(fā)設(shè)備驅(qū)動(dòng)程序.電子技術(shù)應(yīng)用, 2001;(3)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。

相關(guān)內(nèi)容