基于CAN总线的非智能适配卡设计
引言
控制器局域网can (controller area network)是目前被批准为国际标准的少数现场总线之一。can网络可采用多主方式工作。它采用非破坏性的总线仲裁技术,其信号传输和控制采用短帧结构,因而具有较强的抗干扰能力和低耦合性;cah网络的通讯速率范围为5
kbs/10 km~lmbs//40m,驱动节点数可达110个。它的传输介质可以是双绞线、同轴电缆或光纤,选择十分灵活;每帧信息都有crc校验及其它检错措施,因而数据出错率极低,可靠性很高;当其传输的信息出错严重时,节点可自动断开与总线的联系,以使总线上其它的操作不受影响。
虽然目前pci、usb等总线技术得到了快速发展,但在大量应用的测试微机及工控机中,用的最多的还是isa (industry standard
architecture.工业标准体系结构)总线。isa总线具有16位数据宽度,最高工作频率为8mhz,数据传输速率达到16mb/s,地址总线有24条,可寻址16mb的地址单元,其总线信号分为5类,分别为地址线、数据线、控制线、时钟线和电源线。
为了解决can控制器sja1000与isa总线各信号线的时序配合与逻辑配合问题,笔者设计了一种基于can总线的非智能适配卡。该适配卡已应用于笔者研制的"基于can总线的运动控制系统"中,运行情况良好。
非智能型isa总线can适配卡的总体结构
can控制器sja1000的地址数据总线是分时复用的,通过ale信号的下降沿可锁存总线上的地址信号;isa总线上的地址和数据总线是单独提供的,它不能直接和sja1000的地址数据总线相连。本设计利用地址译码电路来对地址信号线进行译码,从而为can适配卡分配出一定的端口地址。然后再利用74hc373芯片的数据锁存功能锁存第一次i/o操作中通过isa数据总线传送的数据信号,以便作为访问can控制器sja1000中寄存器的地址信号,最后在第二次i/o操作中完成对sja1000中相应地址寄存器的读写操作。其适配卡的总体结构如图1所示。
适配卡硬件的设计
基地址译码电路设计
图2所示是一种具体的基地址译码电路。一般情况下,根据系统需要,地址译码电路可对isa地址线的端口地址译码,并可用ao~a9来表示。基地址译码电路对a9~a2进行译码,则可作为卡上端口的基地址。
控制信号产生电路
该适配卡的控制信号产生电路如图3所示。该电路的主要作用是把cpu送来的控制线和地址线按照一定的逻辑关系进行组合,以生成一组新的功能信号输出。该信号可作为接口控制信号去控制sja1000、74hc373、74hc245等芯片的工作状态。由于基地址译码电路的输出信号为p=q的反(低电平有效),sja1000地址端口偏移地址为00h,数据端口偏移地址为01h,因此,根据控制逻辑,适配卡中各芯片的控制信号逻辑表达式为:
计算机通过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总线,以增加网络节点,扩大网络规模。另外,还可以在适配卡的应用程序中,根据应用系统需要编写各种监控程序来扩展系统功能。
评论