摘要:针对越来越多的CAN接口设备,设计了一种CAN总线与PC串口之间通信的双向转换器。阐述了转换器的硬件电路设计方法,介绍了CAN与PC机之间的数据收发过程,并给出CAN总线协议与串口协议转换的软件设计流程。
关键词:CAN总线;串行通信;协议;控制器
随着串行通信进入更多的应用领域,计算机的串行口与CAN总线间的通信越来越具有实际意义。现有的PC一般都没有CAN收发功能,但大多有串口。串口协议是硬件协议,采用三线制传输,CAN总线协议是高速二线制协议;串口一次只能传输一个字节,CAN一次最少可以传输两个字节,最多可以传输十个字节;PC机向CAN总线传输时,传输内容包括数据和两个描述符,而CAN向PC机传输时,只取数据传输。由于它们之间诸多差异的存在,所以为了实现两者之间的通信,就需要进行协议转换。在串行口的三线与CAN的两线之间用一个转换器即可实现两者数据的传输,该部分包括了硬件电路和软件协议。本文探讨了CAN与PC机之间数据收发过程,并详细介绍了CAN总线与PC串口之间双向转换器的软硬件设计。
1 硬件电路设计
PC机与CAN总线之间的转换电路主要包括四个模块:微控制器AT89C51、独立的CAN控制器SJA1000、CAN总线收发器82C250和高速光电耦合器6N137。[1]PC机与AT89C51单片机之间在串口上用MAX232进行电平转换。
SJA1000主要在汽车和一般工业环境中使用,通常位于微控制器和CAN收发器之间。SJA1000内部寄存器的地址空间为0~31,分为控制段和信息缓冲区两部分。微控制器以访问外部存储器的方式来访问SJA1000,即把SJA1000当作其外部RAM,通过访问SJA1000内部寄存器来控制SJA1000的数据读写。[2]初始化时微控制器对控制段编程实现通信参数的配置和CAN总线通信状态的监控,收发数据时微控制器对信息缓冲区进行数据读写操作。信息缓冲区分为发送缓冲区和接收缓冲区,发送时,微控制器向发送缓冲区写入数据,并启动发送命令;接收时,微控制器读出接收缓冲区中的数据,并进行处理。82C250是一种高性能的CAN总线收发器,它对CAN总线提供差动发送能力,对CAN控制器提供差动接收能力。[3]接收来的数据通过收发器传到SJA1000的接收缓冲区,要发送的数据由SJA1000的发送缓冲区通过收发器发出去。
电路设计时,将SJA1000的8位数据线与AT89C51的P0口相连,用AT89C51的P2.0引脚控制SJA1000片选信号,低电平时可对SJA1000执行读写操作。SJA1000的中断输出引脚与AT89C51的外部中断引脚相连,使AT89C51可通过中断方式访问SJA1000。另外,SJA1000的收发端不能直接与82C250的收发端相连,否则会产生信号干扰,为了增强抗干扰能力,需在SJA1000和82C250之间增加一个高速光电耦合器6N137,[4]6N137可以实现CAN节点间的电气隔离,提高了节点的稳定性和安全性。
AT89C51通过MAX232与PC机串行通信,如图1所示。AT89C51单片机的输入、输出均采用TTL电平,而PC机串行口为RS-232C标准接口。显然,两种接口规范不一致,这就需要进行电平转换,电路采用了MAXIM公司的MAX232标准RS232接口芯片,并且将AT89C51的P1.0作为模拟发送端,P1.1作为模拟接收端。MAX232仅需+5V电源供电,它可将两路TTL电平转换成RS-232C电平,也可将两路RS-232C电平转换成TTL电平。[5]

图1 串口电路原理图
信息传送时,由PC机发送的数据通过AT89C51写入SJA1000,并经过CAN收发器82C250发送至CAN总线上。信息接收时,CAN总线上的数据经CAN收发器82C250接收,并写入SJA1000的接收缓冲区,然后通过中断申请AT89C51读取,读取的数据由RS232口上传给PC机。
2 协议转换软件设计
2.1 软件总体设计
CAN总线协议与串口协议转换编程时,首先要将CAN控制器SJA1000和CPU初始化,然后实现它们之间的数据传输。在编程过程中,要注意各种中断的使用。在主程序中,要多次调用子程序。流程图如图2所示。

图2 主程序流程图
2.2 SJA1000初始化
CPU访问SJA1000时,SJA1000有两种不同的模式:复位模式和工作模式。[2]对SJA1000的初始化只能在SJA1000的复位模式下进行,[6]设置复位请求后,一定要校验,以确保设置成功。初始化包括设置CAN总线波特率、设置验收滤波器、设置输出控制寄存器等。
2.3 PC串口向CAN总线数据传输软件设计

图3 PC串口向CAN总线数据传输流程图
数据传输时,由PC机串口传到单片机串口,再经过CAN控制器发送到CAN总线上。编程时,首先调用串口接收中断的子程序,将信息由SBUF放入内部RAM中,然后调用数据送入SJA1000发送缓冲器的子程序,最后启动发送请求命令字,将信息发到CAN总线上。PC机向CAN总线数据传输的流程图如图3所示。
单片机的串口接收到PC机传来的信息,RI= 0,接收控制器发出“装载SBUF”的信号,将8位数据装入接收数据缓冲器,并置RI=1,向CPU申请中断,CPU响应中断后,将RI清0,开始接收下一帧信息。
在单片机内部RAM中设置一10字节的接收数组,编程时先设一中间变量,将SBUF中信息先赋给该中间变量,再将中间变量的值赋给接收数组,从而完成从SBUF到内部RAM的传送。由单片机定义数组中前两个字节为描述符,第一个字节由仲裁场中识别符的高8位ID.10-ID.3组成,它表示了目的CAN节点的地址;第二个字节由识别符的低3位ID.2-ID.0、远程发送请求位RTR位和控制场中的4位数据长度代码组成,它表示了所传数据的字节数量。根据RTR位判断数据长度,若为远程帧,只发送前两个字节;若为数据帧,则将需要传送的数据连同这两个字节一起传到SJA1000的发送缓冲区中,再由SJA1000发送到CAN总线上。
2.4 CAN总线向PC串口数据传输软件设计
数据传输时,由CAN总线经过CAN控制器传到单片机的串口,再上传至PC机的串口。CAN总线向PC机数据传输的流程图如图4所示。

图4 CAN总线向PC串口数据传输流程图
CAN总线上传来的信息首先传到SJA1000的接收缓冲区中,CAN产生中断,单片机的外部中断0向CPU申请中断,CPU响应中断后,读SJA1000的接收缓冲区。
在单片机内部RAM中设置一10字节的发送数组,将接收缓冲区中信息放入发送数组变量中,并清空接收缓冲区。CAN一次最少可传输2个字节,最多可传输10个字节。其中第一个字节由仲裁场中识别符的高8位ID.10-ID.3组成,表示了串口-CAN转换器的地址;第二个字节由识别符的低3位ID.2-ID.0、远程发送请求位RTR位和控制场中的4位数据长度代码组成,表示了所传数据的字节数量。通过第二个字节低4位的值的计算确定所传数据长度,CPU向串口传送时将前两个字节去掉,从第三个字节开始传送,按字节装入发送数据缓冲器SBUF,直至发送完毕。保持TI≡0,发送完毕置位发送中断标志TI,向CPU申请中断,然后用软件将其清零。数据从SBUF经TXD上传给PC机。
3 结束语
CAN总线因具有很高的实时性能,广泛应用于汽车工业、航空工业、安全防护等领域,[7]很多生产厂家都开始致力于研究带CAN总线接口的设备。本文设计的CAN总线-PC串口转换器已开发成功,且具有一定的通用性,可用于数据采集、监控网络等多种工业控制现场。该转换器可以方便地实现CAN接口设备和串口设备之间的通信,且转换速率高,具有较强的实用价值。