新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 基于飞利浦P8XC591的CAN总线节点扩展

基于飞利浦P8XC591的CAN总线节点扩展

作者:飞利浦半导体深圳应用实验室时间:2004-02-16来源:电子设计应用
摘要:本文介绍一种基于P8XC591 扩展的原理及实现方案。

关键词:

引言

由于具有通讯速率高,可靠性高,连接方便和性能价格比高等诸多特点,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 特性等。图1为P83C591 ROM 或P87C591 OTP 的方框图。


图1 P83C591 ROM 或P87C591 OTP 的方框图

图2 P8XC591与CAN 网络2的连接

图3 P8XC591通过SJA1000与CAN 网络1的连接

图4 P87C591的初始化流程图

图5 CAN网络1接点N与CAN网络2接点N信息交换的示意图

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。两者都支持CAN2.0B协议。P87C591片上自带的CAN控制器在软件上是向上兼容SJA1000的。相应的硬件电路如图2和图3所示。
P8XC591所连接的CAN 节点电路所需要的外部元件仅仅是一个晶振加两个电容驱动片内振荡器、一个连接到复位脚的电阻、电容。使用片内上电复位电路以及一个收发器用于将P8XC591 连接到CAN 总线。
P87C591通过对CAN的特殊功能寄存器,如地址寄存器(CANADR)、数据寄存器CANDAT)、模式寄存器(CANMOD)、控制寄存器(CANCON)、状态寄存器(CANSTA)、总线定时寄存器(BTR0、 BTR1)等的设置,以及对收发缓冲区的读写(接收缓冲区为64字节的FIFO缓冲区,最多储存21帧CAN信息),从而完成和其它CAN节点的数据交换。
CAN的控制器分别采用了P8xC591和SJA1000,可完成物理层和数据链路层的所有功能。CAN收发器使用飞利浦公司的PCA82C250,它是连接CAN控制器和物理总线之间的接口,提供了对总线的差动发送和接收能力。它与ISO11898标准完全兼容,有三种不同的工作方式即高速、斜率控制和待机,可根据实际情况选择。为了进一步提高系统的抗干扰能力,在控制器SJA1000和收发器PCA82C250之间,P87C591和收发器PCA82C250之间均增加了由高速隔离器件6N137构成的隔离电路。硬件电路中使用PCA82C250是为了增加通信距离,提高系统的瞬间抗干扰能力,保护总线,降低干扰等。
微处理器P87C591和SJA1000均使用12MHz的石英晶体,以获得相同的时钟信号。由于P87C591含有片上的CAN控制器,通过TXDC,RXDC两个管脚,P87C591就可和外部的CAN节点交换数据。另一方面,P87C591直接控制SJA1000的AD0~AD7、、、ALE、RST 和管脚,SJA1000的MODE管脚接高电平,工作在Intel模式下;片选管脚接地,使SJA1000始终处于选通状态。P87C591对 SJA1000的操作主要是对寄存器中的模式寄存器 (MOD)、命令寄存器(CMR)、状态寄存器(SR)、中断寄存器( IR)、中断允许寄存器(IEP)、总线定时寄存器(BTR0、 BTR1)、输出控制寄存器(OCR)、时钟分频计数器(CDR)进行设置和检测,以及对收发缓冲区进行读写,从而完成和其它CAN节点的数据交换。
如图2和图3所示,为了能使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(见图4)基本类似。
?CAN网络1接点与CAN网络2接点信息交换的示意图如图5。
·初始化部分的原程序如下:
#include
void init_can_controller ( void )
{
 CANMOD = 0x01; /*进入复位模式,启动CAN初始化 */
 P1M2 = P1M2 | 0x02;     /* 管脚TXDC 设置为推挽模式*/
 CANSTA = 0x03;       /* 使能接收和发送中断*/
 CANADR = BTR0;       /* BTR0和BTR1编程为125 kbit/s @12 MHz */
 CANDAT = 0x45;
 CANADR = BTR1;       /* TSEG1 = 12, TSEG2 = 3, SJW = 2 */
 CANDAT = 0x2B;       /*用户可根据具体的CAN网络来调整BTR0,BTR1的参数*/
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网络信息的交换奠定了基础。■(软件设计部分的详细内容见本刊网站www.eaw.com.cn)

参考文献
1 Philips SJA1000--Stand-alone CAN Controller. DATA SHEET.1999
2 Philips PCA82C250 CAN Controller Interface. DATA SHEET.1997
3 邬宽明.CAN总线原理和应用系统设计.北京航空航天大学出版社.1996


评论

技术专区

关闭