微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 低基于CAN总线的非智能适配卡设计

低基于CAN总线的非智能适配卡设计

时间:12-29 来源:互联网 点击:

阻态;当第二次访问数据端口301H时,SJA1000被选中,此时CPU可对SJA1000的相应单元进行读/写操作。具体的操作过程分为读、写两种情况。当第二次I/O操作到来时,SJA1000会在BALE信号下降沿将第一次I/O操作时锁存在74HC373中的数据作为地址锁存,该过程中,74HC245的E反为高电平,输出呈高阻态,74HC373的OE的反为低电平,输出端有效,可向SJA1000传送地址信号。当地址被SJA1000锁存以后,此时如果进行的是读操作,那么,在读信号有效期间(低电平),74HC373的输出允许OE反端为高电平,74HC373输出端呈高阻态,这时SJA1000可将选中单元的寄存器内容输出到数据总线,并通过74HC245驱动送入CPU中。而在地址锁存后,如果进行的是写操作,那么,74HC373的输出允许端始终有效,此时可在写信号有效期间,将数据写入SJA1000的相应单元中。

  计算机通过ISA总线对CAN控制器SJA1000进行读写的时序分别如图4和图5所示。

  复位电路

  SJA1000正常工作前,只有通过复位引脚对其进行可靠的硬件复位,才能对SJA1000中的寄存器进行正确的读写操作。使SJA1000可靠复位的电平持续最小时间为0.1μs,PC系统复位电平持续时间可达几微秒。系统复位信号RESET在系统电源接通时为高电平,经反向器后可直接用于对SJA1000进行复位。图6所示是适配卡的复位电路,对SJA1000的复位具有开机上电复位、程序复位以及按键复位等三种方式。

  在图6中,A1和A0经过与非门74LSl0后,为复位电路产生的偏移地址为11,该地址信号与IOW反、P=Q反等信号经过逻辑组合,同时配合程序设计可产生对SJA1000的复位信号。程序设计时只需对复位端口写入一个数据即可实现程序复位。而按键复位则可在系统运行出现通信故障时,直接用于对CAN控制器SJA1000进行硬件复位。

  适配卡的软件设计

  软件设计的关键部分是CAN通信程序的设计。通信程序(流程如图7、8、9所示)可分为三部分:CAN初始化程序、接收程序、发送程序。初始化是通信的前提,主要完成对CAN控制器的一些寄存器的设置。由于SJA1000支持中断操作,因此可以用中断服务程序来完成数据的接收和发送,以提高系统的工作效率。

  实际上,只有在复位模式下才可以对SJA1000进行初始化,初始化主要包括工作方式的设置、接收滤波方式的设置、接收屏蔽寄存器和接收代码寄存器的设置、波特率参数设置和中断允许寄存器的设置等。完成初始化后,即可将SJA1000设置为工作状态,以进行正常的通信。发送子程序负责节点报文的发送。发送时,读取状态寄存器并对各位进行适当判断,并将待发送的数据按特定格式组合成一帧报文,送入SJA1000发送缓存区中,然后启动SJA1000发送;接收子程序则负责节点报文的接收以及其它情况的处理。在处理接收报文的过程中,还要对总线关闭、错误报警、接收溢出等情况进行处理。

  CAN适配卡与计算机可采用中断方式通信。但在WIN API中不能直接控制中断,只有在操作系统底层为CAN适配卡编写虚拟设备驱动程序(VxD)才可以利用中断。这需要在虚拟设备驱动程序中将中断虚拟化,并在中断事件响应函数中编写所需代码,同时为应用程序提供访问接口。应当注意的是:计算机通过ISA总线对CAN适配卡上的SJA1000进行访问采用的是两次I/O操作,第一次往地址端口送地址,第二次对数据端口进行访问。其具体的实现代码如下:

  //向指定的SJA1000寄存器(地址为addr)写一个字节数据(data),CAN_BASE为基地址

  void CanIRQ::writeByte(int CAN_BASE,unsigned char addr,unsigned char data)

  {

  _outp(CAN_BASE,addr);

  _outp(CAN_BASE+1,data);

  }

  //从指定的SJA1000寄存器(地址为addr)读一个字节数据(data)

  unsigned char CanIRQ::ReadByte(int CAN_BASE,unsigned char addr)

  {

  unsigned char result;

  _outp(CAN_BASE,addr);

  result=_inp(CAN_BASE+1);

  return result;

  }

  在访问SJA1000的程序中,可以直接调用以上两子函数。这样,其发送程序段代码为:

  Bool CanIRQ::CanTrans(int CAN_BASE,unsigned char*pTransBuf)

  {

  status=ReadByte(CAN_BASE,SR); //SR为状态寄存器地址

  for(i=0;i

  {

  WriteByte (CAN_BASE,*pTFansBuf,ptbuf;//pTransBuf为发送缓冲区地址

  ptbuf++;pTransBuf++;

  }

  }

  结束语

通过解决计算机ISA总线与CAN控制器SJA1000的逻辑配合与时序配合可完成基于CAN总线的非智能适配卡设计。该适配卡现已成功地应用于笔者所研制的基于CAN总线的测控系统中。实际上,若在适配卡上增加CAN通信控制器,也可使一卡带多条CAN总线,以增加网络节点,扩大网络规模。另外,还可以在适配卡的应用程序中

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top