微处理器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网络信息的交换奠定了基础。