《电子技术应用》
您所在的位置:首页 > 其他 > 业界动态 > EPP逻辑接口WinDriver底层驱动的可视化主备CAN监控节点的设计

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

2009-10-12
作者:怯肇乾

  摘  要: CAN总线监控的EPP逻辑接口设计及用WinDriver实现的实时数据采集的可视化编程设计技术,以实现主、备双节点的监控。

  关键词: EPP  逻辑设计  WinDriver  实时数据采集  可视化编程

 

  随着CAN总线在通信设计系统中的应用,出现了不少CAN节点监控产品。其中,以EPP并口为接口、以SJA1000做CAN协议控制器的微机监控节点的产品更是独树一帜。这类产品硬件构造简单、DOS监控软件设计简洁、通信快速、操作使用方便。本文即以这类产品为课题对其性能做进一步完善:(1)在EPP接口和SJA1000之间做可编程逻辑设计,使节点监护通信更直截了当。(2)在监控软件设计上用WinDriver做底层驱动进行可视化编程,以增强人机接口界面,使监控更加简洁方便。(3)扩展单节点监控为主、备双节点监控,使监护全面完善。

1 系统总体硬件设计

  系统总体硬件构成如图1所示。其中,2片SJA1000分别用于实现主节点和备用节点的CAN总线协议控制器,且为增强各自的驱动能力分别使用了1片82C250收发驱动器。2片SJA1000共用一套振荡电路和一套复位电路,复位电路为简单的阻容形式。由于EPP接口控制线己全部用做他用,故微机不能控制SJA1000做硬件复位,但为了调试方便,加入了按钮做意外手动复位。1片PLD(EPM7032ST-10)用于实现EPP接口和SJA1000之间的通信传输控制;电源取自外部CAN总线系统的+5V电源;发光二极管用做电源和主、备节点的收发指示。

 

2 EPP和SJA1000之间的接口逻辑设计

  在EPP接口和SJA1000之间加入适当的逻辑接口,可以避免传统设计中对EPP控制线的重新定义和特殊通信函数的书写,缩短并口通信的时间,提高数据采集的实时性。这样,通过EPP读写SJA1000时只要读写EPP地址和数据寄存器就可以了。

  按照EPP并口协议和SJA1000读写时序,本设计以EPP并口的3根控制线/write、/AddStrb、/DataStr的逻辑时序来产生SJA1000读写控制的ALE、/wr、/rd逻辑和反馈回EPP的Wait信号逻辑。特别定义EPP接口的/reset控制线做主、备SJA1000的片选信号,低电平选中主SJA1000,高电平选中备用SJA1000。主、备SJA1000的中断线相“与”后作为中断信号输入EPP并口中断状态线(EPP接口协议和SJA1000的读写时序己有不少文章做过介绍,在此不再赘述)。下面给出用Altera公司的AHDL语言书写的逻辑设计(采用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寄存器结果”的波形图。图中,首先进行地址选通、传送并锁存地址;然后是写操作;最后一段是SJA1000中断发生后,主机响应并进行读操作。

 

3 WinDriver底层驱动程序的产生

  实时数据采集程序的书写离不开中断的使用。为了在可视化编程中使用中断,必须选择适当的工具来书写底层驱动程序。目前,底层驱动程序的书写工具很多,如DDK、SDK、VtoolsD、WinDriver等,这里选用Jungo公司简单方便的开发工具WinDriver。

  打开WinDriver的驱动向导,创建一个新的驱动程序。WinDriver检测外接硬件设备,产生连接设备列表,从中选用parallel port,指定WinDriver在一给定目录下用C或Pascal语言产生VB、VC++、Dephi或C++Builder工程项目文件。这里选用C语言和C++Builder开发工具,指定LPT为文件前缀。

  在给定目录下,WinDriver的驱动向导可产生几个文件和1个C++Builder子目录。在产生的文件中,LPT.wdp、LPT_lib.h和LPT_lib.c是编写应用程序必不可少的。LPT.wdp是WinDriver底层驱动程序和用户程序沟通的关键枢纽,LPT_lib.h和LPT_lib.c是WinDriver提供的己包装好的可直接使用的函数库。在其他文件中,LPT_diag.h和LPT_diag.c是WinDriver提供的并口传输测试程序,可作为书写应用程序的参考。下面给出产生的几个主要函数。

3.1 并口开关函数

  BOOL LPT_Open (LPT_HANDLE*phLPT);

  void LPT_Close(LPT_HANDLE hLPT);

3.2 并口读写函数

  BYTE LPT_Readstrobe_addr (LPT_HANDLE hLPT)

                       //用于读并口地址

  void LPT_Writestrobe_addr (LPT_HANDLE hLPT,BYTE data)

                       //用于写并口地址

  BYTE LPT_Readstrobe_data_0 (LPT_HANDLE hLPT)

                       //用于读并口数据

  void LPT_Writestrobe_data_0 (LPT_HANDLE hLPT,BYTE data)

                       //用于写并口数据

  BYTE LPT_Readcontrol (LPT_HANDLE hLPT);

                       //读并口控制寄存器

  void LPT_Writecontrol (LPT_HANDLE hLPT,BYTE data);

                       //写并口控制寄存器

3.3 并口中断函数

  void LPT_IntADisable (LPT_HANDLE hLPT);  //用于禁止并口中断

  BOOL LPT_IntAEnable (LPT_HANDLE hLPT,LPT_IntA_

  HANDLER funcIntHandler);    //用于使能并口中断

                      //funcIntHandler是中断处理函数,其函数原型如下:

  void (*LPT_IntA_HANDLER)(LPT_HANDLE hLPT,LPT_IntA_

  RESULT*intResult)

4  可视化应用程序的设计

  设计可视化应用程序时,要在人机界面窗口中做主、备CAN总线选择和接收对象选择。下面给出采用C++Builder5.5开发的部分程序片段(为简化叙述,这里给出的是总线活动全部接收,按1次接收按钮只接收1帧数据的程序,若总线无活动则定时自动退出)。

4.1 数据通信函数的构造

  void TForm1+∷bring(char addr,char data)

{LPT_Writestrobe_addr(hLPT,addr);

 LPT_Writestrobe_data_0 (hLPT,data);

}         //通过并口向指定外部地址写数据

char TForm1∷take(char addr)

{ LPT_Writestrobe_addr (hLPT,addr);

 return (LPT_Readstrobe_data_0 (hLPT));

}         //通过并口从指定外部地址读数据

4.2 接收数据程序的设计

void __fastcall TForm1∷Button1Click

       (TObject*Sender)

{

  char cc;

  cc=StrToInt(ComboBox1->Text);//选择主或备CAN_设备

  port=cc&0x040;

  LPT_Open(&hLPT);       //打开并口驱动程序

  LPT_IntAEnable(hLPT,LPT_IntAHandlerRoutine);

                //开放并口中断,指明中断服务地址

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

                //开放并口中断

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

  bring(0x00,0x01);      //使SJA1000进入复位模式

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

           {ShowMessage(″进入复位设置失败!″);exit;}

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

  bring(0x07,0x14);

  bring(0x04,0x0);    //指定总线活动全部接收

  bring(0x05,0xff);

  bring(0x08,0xfa);   //Tx输出控制设置

  take(0x03);        //清SJA1000所有中断

  bring(0x00,0x00);   //使SJA1000回到工作模式

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

         {ShowMessage(″退回工作模式失败!″);exit;}

  bring(0x00,0x01);   //开放CAN接收中断

  bring(0x01,0x04);   //释放接收缓冲区

  Timer1->Enabled=true;     //使能超时接收定时器

}

4.3 接收超时程序段的设计

  这里使用定时器完成总线上无数据活动时的定时自动退出。

void __fastcall TForm1∷Timer1Timer(TObject*Sender)

{

  Timer1->Enabled=false;   //关闭定时器

  LPT_IntADisable(hLPT);   //关闭并口中断

  bring(0x00,0x00);     //关闭SJA1000中断

  LPT_Writecontrol(hLPT,

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

  Label4->Caption=″没有接收到任何数据!″;

  LPT_Close(hLPT);        //关闭底层驱动程序

}

4.4 中断服务程序的设计

void LPT_IntAHandlerRoutine(LPT_HANDLE hLPT,LPT_IntA_

RESULT*intResult)

{char t,m[16];

  int i;

  Form1->Timer1->Enabled=false;  //关闭定时器

  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++)        //读取接收数据字节

         {m[2*i]=Form1->take(0x16+i);m[2*i+1]=′,′;}

  m[16]=′.′;

  Form1->Edit3->Text=m;

  Form1->Label4->Caption=″1帧数据接收完毕!″;

  EE:

  Form1->bring(0x00,0x00);//关闭SJA1000中断

  LPT_Writecontrol(hLPT,

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

   LPT_IntADisable(hLPT);   //关闭并口中断

  LPT_Close(hLPT);    //关闭底层驱动程序

} 

4.5 程序的编译与发行

  程序编译前,为建立起与WinDriver底层驱动程序的链接,必须做到:

  (1)在工程项目.cpp文件开始嵌入:

  #include

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

  (2)在unit.cpp文件开始嵌入:

  #include

  (3)在unit.cpp文件开始定义变量:

  LPT_HANDLE hLPT;

  程序分发使用前,对于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和计算机并口的高速数据通讯.国外电子测量技术,2001;(1)

2 姚振东.Windows95下基于EPP的ECG信号采集系统.电子工程师,2000;(9)(10)

3 梁再信.增强性并行口协议及其在CAN监控节点中的应用.PHYLIPS单片机世界,1999;(2)

4 刘正权.关于CAN控制器SJA1000新特性的一些应用.电子技术,2000;(11)

5 黄讯.利用WinDriver开发设备驱动程序.电子技术应用, 2001;(3)

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。