现在市场上主要有两种CAN的接口卡,使用PCI总线和使用USB接口。前者具有传输速度快的特点,但却要占用一个计算机的插槽,并且设计上十分困难;后者的传输速度也很快,且价格较便宜,但要花费很大的精力进行USB的固件开发和维护,并要编写复杂的驱动程序。根据此,需要设计一种能够方便读取CAN总线数据,并通过RS 232串行口将数据送给PC机处理和显示的接口卡;此外还需对其串行传输的协议进行加强,以使能有效地降低传输过程中出现的错误。
1 接口卡的硬件设计
硬件部分主要包括主控制器、CAN总线控制器、CAN总线收发器以及与计算机的RS 232通信接口芯片等。系统的总体结构如图1所示。主控制器通过CAN总线接口接收和缓存数据。根据PC机的命令进行选择性的数据传输。
1.1 与CAN总线接口
如图2所示,接口卡的控制器选用Atmel公司的AT89S51,该单片机的引脚和功能与8051兼容,并且内部含有4 KB的FLASH ROM,支持在系统编程(ISP),这样可以很方便地将应用程序下载到单片机里。
CAN总线控制器选用Philips公司生产的SJA1000,该芯片是PCA82C200CAN控制器的替代品,而且新增加了一种PeliCAN工作模式,能够支持CAN 2.0B协议。它还支持错误中断、报警限制、验收滤波器扩展和自接收请求等功能。在系统中,将SJA1000的中断输出引脚INT接到单片机的中断输入引脚,这样可以在接收数据或者总线错误时产生中断,由控制器进行相应的处理。SJA1000的片选CS端接单片机的P2.7引脚,这样SJA1000的地址就确定为7F00H~7FFFH。
选用芯片82C250作为CAN控制器和物理总线间的驱动接口,可以提供对总线的差动发送能力和对CAN控制器的差动接收能力,其最高速可达1 Mb/s。由于实际系统中存在干扰,故增加高速光隔6N137,以起到隔离的作用。电气接口很简单,有CANH和CANL两根线,用以完成CAN的数据传输。在CAN总线的两端有一个120Ω的电阻,其作用为匹配总线阻抗,用于提高数据通信的抗干扰性及可靠性。具体电路如图2所示。
1.2 与RS 232接口
RS 232标准是美国电子工业联合会(EIA)制定的一种串行物理接口标准,它适合于数据传输率在O~20 000 b/s范围内的通信,目前广泛用于计算机与终端或外设之间的近端连接。实际工作时,应保证电平在5~15V之间。所以为了与单片机进行通信。必须对其电平进行转换。现在常用的转换芯片是MAX232。MAX232内部有电压倍增电路和转换电路,只需5V电源便可实现TTL电平与RS 232电平的转换,使用十分方便。串口接口电路如图3所示。
2 接口卡的软件设计
2.1 RS 232接口软件设计
单片机与PC端的数据通信需要设计一个通信协议,采用同步通信方式进行。将通信协议分成命令帧、应答帧和数据帧三种格式。每种帧都包含有起始字节、数据长度、校验字节和帧结束字节。具体格式如图4所示。
命令帧共6个字节,传输方向为PC机到单片机。以0X00H作为帧起始,数据长度为2,当数据1和数据2同为0X00时,表示启动接口卡,单片机接收到该信号后.会初始化SJA1000,并将结果反馈给PC机(成功或失败);当数据1和数据2同为0XFFH时,表示要求接口卡停止工作,单片机会让 SJA1000进入睡眠模式,以退出总线;当数据1为0X01H时,表示PC机要求只接收某个节点的数据,数据2则表示该接点的节点号,单片机会重新设置 SJA1000的验收滤波器,屏蔽掉其他不需要的节点数据。
应答帧共6个字节,传输方向为单片机到PC机。以0X11H作为帧起始,数据长度为2,当单片机接收到PC机的启动或停止命令,并设置成功后,发送两字节数据同为0X00H给PC,若设置失败,则发送两字节数据同为0XFFH给PC;对于PC要求读取特定节点的命令,单片机以0X10H作为应答起始,并以两字节同为0X00H表示成功,两字节同为0XFFH表示失败。
数据帧为接口卡从总线上读到的数据,因为总线上数据有标准帧、远程帧等之分,而且每个帧中装载的数据长度未知,所以数据帧的长度不定,其传输方向也为单片机到PC,起始字节为0X22H。SJA1000每次接收到有效数据后会让单片机产生接收中断,单片机则在中断处理中将数据首先读入到RAM中暂时存放,然后计算其数据长度和校验和,将数据封装成帧,然后将帧通过串口送给PC处理和显示。
各种类型的帧以0X33H作为帧结束标识。校验和字节用来保证数据的准确性,单片机在发送数据前将各个字节相加,并将结果填人校验字节。PC端接收到数据后,重新计算校验和,并与单片机发送的校验和相比较,相同则正确接收,否则要求单片机重新发送。
2.2 协议的透明性分析
在同步传输数据的过程中,帧的起始字节和结束字节是非常重要的,它能够保证数据帧的准确性。但因为这两个字节的存在,同时也引出了另一个待解决的问题,就是当数据场中出现了与起始字节相同的数据时,很有可能会导致PC端把它看成一个新的帧起始,从而导致数据的处理和显示错误,这也就是数据传输的透明性问题。针对串口的数据传输,有一种比较好的解决方案。该方法将数据转换成为ASCII字符来进行传送,就是将每个字节的数据进行拆分,将一个16进制的字节拆分成两个字节,如5AH,5BH,5CH,…,可以拆分为50H,0AH,50H,0BH,50H,OCH,…,PC机再接收到数据后,再将数据进行两两相或组合。这样,只需要32个字节就可以组合成为00H~0FFH中任一个数据。但这种办法的缺点也是显而易见的,应用它所发送的有效数据量是正常发送的两倍,对于串口这种传输速度不高的通信介质而言,在数据量较大的情况下,不是一种可取的方法。
在该接口卡中作者采取了另一种转义字符的方法。首先定义一个转义字符标识OXDBH。对于CAN总线而言,其每个帧的最大数据长度为8,即使将CAN的帧信息和识别码全部当作数据发送,其长度最大也只有13 B。这样可以肯定的是,正常情况下数据帧中数据长度字节的高4位必然为0。因此在数据发送之前,首先检查该数据中是否有与起始字节0X22H、结束字节 0X33H和转义标识0XDBH相同的数据,如果没有,则正常发送;如果有,则检测出与这两个字节相同数据的个数,并将该个数填充到数据长度字节的高4位中;同时,将这些数据前添加转义字符标识,并将该数据进行转义。如数据0X22H。0X33H,0XDBH…,则转义成0XDBH。0XD2H。 0XDBH,0XD3H,0XDBH,0XDDH…。PC机在接收到数据帧后,首先检查数据长度字节,看其高4位是否为0,如果为0,说明该数据组不存在转义字符,可以直接处理;如果为N。则表明数据组中存在N个转义字符,并且每个转义字符都以0XDB开始,需要首先将它们重新修改回原始数据。相比而言,这种办法有很好的稳定性和接口利用率,其数据流量也不会很高。
2.3 CAN接口程序设计
CAN总线的接口程序主要就是进行SJA1000的初始化过程和后面的接收中断处理过程。CAN初始化主要是设置CAN的通信参数。需要初始化的CAN控制寄存器有:模式寄存器(MOD)、验收代码寄存器(ACR)、验收屏蔽寄存器(AMR)、总线定时寄存器(RTR)、输出控制寄存器(OC)、中断寄存器(IR)和中断使能寄存器(IER)等。这些寄存器都只能在SJA1000处于复位状态下才可写访问。当SJA1000进入工作模式后,就能够自动接收总线上的数据,并将其放入接收缓冲区,同时产生接受中断,单片机进入中断后将数据从缓冲区中读出,并释放缓冲区。中断返回后,再将数据封装成帧发送给PC 机。
2.4 PC端程序设计
PC端程序使用VB 6.0进行开发。VB 6.O在图形界面的制作上比较方便,使用Mscomm组件能够轻松地制作串口的监视环境。只要在软件设计时将上述协议添加进行。图5给出了使用VB 6.0开发的软件调试情况。
3 结 语
该CAN总线接口卡经过实验验证,证明可以达到预期的要求,能够良好地监视总线上的数据,而且结构简单,有较大的利用价值。当CAN总线系统数据流量较大时,可以考虑使用USB接口和PC机进行通信,这样就能够更好地解决速度匹配和应用场合受限的问题。
上一篇:基于双向透明串口扩展技术的多参数监护仪设计方案
下一篇:基于EZ-USB的电脑眼接口设计
推荐阅读最新更新时间:2024-05-02 21:24