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基本类似。 *CAN网络1接点与CAN网络接点2信息交换的示意图略(详见《电子设计应用》2003.3)。 初始化部分的原程序如下: #include 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
|