基于飞利浦P8XC591的CAN总线节点扩展
扫描二维码
随时随地手机看文章
引言
由于CAN总线具有通讯速率高、可靠性高、连接方便和性能价格比高等诸多特点,CAN的应用范围遍及从高速网络到低成本的多线路网络。在自动化电子领域的汽车发动机控制部件、传感器、抗滑系统、工业自动化、建筑物环境控制、机床或电梯控制、医疗设备等领域得到了较为广泛的应用。
CAN 的信号传输采用短帧结构,每一帧的有效字节数为 8个,因而传输时间短、受干扰的概率低。当节点严重错误时,具有自动关闭的功能以切断该节点与总线的联系,使总线上的其它节点极其通信不受影响,具有较强的抗干扰能力和检错能力。CAN控制器支持四种不同的CAN协议类型:数据帧、远程帧、出错帧和超载帧。
CAN支持多主方式工作,网络上任何节点均可在任意时刻主动向其它节点发送信息,支持点对点、一点对多点和全局广播方式接收/发送数据。它采用总线仲裁技术,当出现几个节点同时在网络上传输信息时,优先级高的节点可继续传输数据,而优先级低的节点则主动停止发送,从而避免了总线冲突。
CAN总线信号传输介质使用特性阻抗为120欧姆的双绞线,信号传输方式和RS485一样,也采用差动发送和差动接收的方式。理论上使用CAN2.0A总线的节点可达到2032个,CAN2.0B则可以达到5亿多个。使用PCA82C250作为CAN总线的收发器时,CAN直接通信距离最远可达到10km(传输率为5kbps),通讯速率最高可达1Mbps(传输距离为40m);由于收发器的限制, CAN总线上节点数实际上最多可达110个。对于节点超过110个的CAN网络,可以使用CAN网关对CAN总线进行扩展,以达到用户的要求。
网关可以采用特定的控制逻辑去控制一对背-背相接的收发器PCA82C250,连接两个物理上完全独立的CAN网,双向传输数据,从物理层上来看,它实现了CAN总线信号的中继,也可以采用P8XC591+SJA1000的结构去实现。下面将着重介绍后者的硬件及软件实现。
P8XC591片上自带CAN的微控制器
P8XC591是一个高性能的微控制器,它的硬件接构及增强型的飞利浦“RX+内核”使得其可以广泛用于工业控制和汽车领域。片上自带的CAN控制器为CAN的应用提供了许多专用的硬件功能。P8XC591完全履行CAN2.0B规范,并提供一个直接从SJA1000独立CAN控制器的软件移植路径。P8XC591具有CAN的扩展特性,其中包括增强型接收滤波器、支持系统维护、诊断、系统优化以及接收FIFO特性等。
P8XC591除了标准的外围功能以外,还有一个强大的CAN控制器模块。该嵌入式CAN控制器还包括了下列功能模块:CAN内核模块,根据CAN2.0B规范控制CAN帧的发送和接收;CAN接口模块,包含5个实现CPU与CAN控制器连接的特殊功能寄存器,对重要CAN寄存器的访问通过快速自动增加的寻址特性和对特殊功能寄存器的位寻址来实现;CAN控制器的发送缓冲区模块,能够保存一个完整的CAN信息扩展或标准帧格式。只要通过CPU启动发送信息,字节就从发送缓冲区传输到CAN内核模块。当接收一个信息时,CAN内核模块将串行位流转换成并行数据输入到接收滤波器,通过该可编程滤波器,P8XC591确定实际收到的信息,所有由接收滤波器接收的数据都保存在接收FIFO(64字节)中,由于操作模式和数据长度的不同,该接收缓冲区最多可保存21个CAN信息。这使用户在指定系统的中断服务和中断优先级时有更多的灵活性,因为数据溢出的可能性大大降低。
除了普通的CAN特性以外,P8XC591还提供增强型PeliCAN。PeliCAN具有4个独立可配置的接收滤波器组,每个组都有4个可选的接收滤波器配置;每个接收滤波器都有32位区分符、32位代码和32位屏蔽;所有滤波器配置都可在运行中改变;支持更高层的协议的接收滤波器;接收FIFO特性;只听模式及自检测模式;只有达到FIFO接收中断级才产生接收中断;在接收到高优先级数据帧时立即产生接收中断;系统维护诊断和优化特性。
硬件电路设计
硬件电路的设计采用了飞利浦片上自带CAN控制器的单片机P8XC591和独立的CAN控制器SJA1000。两者都支持CAN 2.0B协议。P87C591片上自带的CAN控制器在软件上是向上兼容SJA1000的。
P8XC591所连接的CAN节点电路所需要的外部元件仅仅是一个晶振加两个电容驱动片内振荡器、一个连接到复位脚的电阻、电容。使用片内上电复位电路以及一个收发器用于将P8XC591连接到CAN总线。
P8XC591通过对CAN的特殊功能寄存器,如地址寄存器(CANADR)、数据寄存器(CANDAT)、模式寄存器(CANMOD)、控制寄存器(CANCON)、状态寄存器(CANSTA)、总线定时寄存器(BTR0,BTR1)等的设置,以及对收发缓冲区的读写(接收缓冲区为64字节的FIFO缓冲区,最多储存21帧CAN信息),从而完成和其它CAN节点的数据交换。
CAN的控制器分别采用了PXC591和SJA1000,可完成物理层和数据链路层的所有功能。CAN收发器使用飞利浦公司的PCA82C250,它是连接CAN控制器和物理总线之间的接口,提供了对总线的差动发动和接收能力。它与ISO11898标准完全兼容,有三种不同的工作方式即高速、斜率控制和待机,可根据实际情况选择。为了进一步提高系统的抗干扰能力,在控制器SJA1000和收发器PCA82C250之间,P87C591和收发器PCA82C250之间均增加了由高速隔离器件6N137 构成的隔离电路。硬件电路中使用PCA82C250是为了增加通信距离,提高系统的瞬间抗干扰能力,保护总线、降低干扰等。
微处理器P87C591和SJA1000均使用12MHz的石英晶体,以获得相同的时钟信号。由于 P87C591含有片上的CAN控制器,通过TXDC,RXDC两个管脚,P87C591就可和外部的CAN节点交换数据。另一方面,P87C591直接控制SJA1000的AD0~AD7, RD, WR, ALE, RST和INT管脚,SJA1000的MODE管脚接高电平,工作在Intel模式下;片选CS管脚接地,使SJA1000始终处于选通状态。P87C591对SJA1000的操作主要是对寄存器中的模式寄存器(MOD)、命令寄存器(CMR)、状态寄存器(SR)、中断寄存器(IR)、中断允许寄存器(IEP)、总线定时寄存器(BTR0, BTR1)、输出控制寄存器(OCR)、时钟分频计数器(CDR)进行设置和检测,以及对收发缓冲区进行读写,从而完成和其它CAN节点的数据交换。
为了能使CAN网络1(最多110个节点)的信息和CAN网络2(最多110个节点)的信息共享,P87C591在软件上必须使得任何格式的数据能实时的从CAN网络1传送到CAN网络2,以及信息从CAN网络2传送到CAN网络1。这样,两个不同的子网就实现了互联,CAN网络的节点得到了扩展。
软件设计
*在初始化SJA1000时,必须设置接收代码寄存器ACRn,接收代码屏蔽寄存器AMRn的值为FF,以能收发所有的数据。由于P87C591片上自带的CAN控制器在软件上是向上兼容SJA1000的,所以对SJA1000的初始化,读、写的流程与P87C591基本类似。
初始化部分的原程序如下:
#include<reg591.h>
viod ini_can_controller (void)
{
CANMOD=0x01; /*进入复位模式,启动CAN初始化*/
P1M2=P1M2 I 0x02; /*管脚TXDC设置为推挽模式*/
CANSTA=0x03; /*使能接收和发送中断*/
CANADR=BTR0; /*BTR0和BTR1编程为125kbit/s@12MHz*/
CANDAT=0x45;
CANADR=BTR1; /*TSEG1=12, TSEG2=3, SJW=2*/
CANDAT=0x2B; /*用户可根据具体的CAN网络来调整BTR0, BRT1的参数*/
CANADR=AMR10; /*设定接收屏蔽寄存器的地址*/
CANDAT=0xFF; /*Bank1: 与接收屏蔽寄存器1无关,允许任何数据通过滤波器*/
CANDAT=0xFF; /*Bank1: 与接收屏蔽寄存器2无关,允许任何数据通过滤波器*/
CANDAT=0xFF; /*Bank1: 与接收屏蔽寄存器3无关,允许任何数据通过滤波器*/
CANDAT=0xFF; /*Bank1: 与接收屏蔽寄存器4无关,允许任何数据通过滤波器*/
CANADR=ACFMODE; /*设定接收滤波器模式寄存器的地址*/
CANDAT=0x01; /*设定BANK1为单滤波模式,标准帧*/
CANADR=ACFENA; /*设定接收滤波器使能寄存器的地址*/
CANDAT=0x01; /*使能BANK1的滤波器1*/
CANMOD=0x00; /*请求进入CAN的激活模式*/
while (CANSTA & 0x80); /*等待总线激活*/
}
类似以上的设置可以使得所有的CAN信息都通过CAN的连接滤波器而到达接收缓冲区,从而为不同CAN网络信息的交换奠定了基础。