P87C591内嵌CAN控制器的应用设计
(凹丫丫范文网fanwen.oyaya.net收集整理)
③CANMOD对PeliCAN模块寄存器CANMOD是直接进行读写访问的,模式寄存器位于PeliCAN模块中的地址00H。
④CANSTA根据访问方向的不同,CANSTA提供对PeliCAN的状态寄存器和中断使能寄存器的直接访问。对CANST
A的读操作是对PeliCAN的状态寄存器(地址2)进行访问。对CANSTA的写操作是对中断使能寄存器(地址4)进行访问。
⑤CANCON。根据访问方向的不同,CANCON提供对PeliCAN的状态寄存器中断使能寄存器的直接访问。对CANSTA的CANSTA的读操作是对PeliCAN的状态寄存器(地址2)进行访问。对CANSTA的写操作是对中断使能寄存器(地址4)进行访问。
4 基于P87C591的CAN节点接口应用电路
基于87C591的CAN节点接口应用电路十分简单,只需要附加一些CAN收发电路就可以进行CAN总线数据传输。CAN收发芯片采用philips公司的TJA1050收发器。为了增强CAN总线节点的抗干扰能力 ,SJA1000的TX0和RX0并不是直接与TJA1050的TXD和RXF相连,而是通过高速光电耦合器6N167与TJA1050相连。这样,就可以很好地实现总线上的总CAN节点间的电器隔离。不过,应该特别说明的一点是,光电耦合器采用的是两个独立的电源供电,电源Vcc和CAN_V必须完全隔离,否则光耦也就失去了意义。电源的完全隔离可采用小功率的电源隔离模块或通过带多路5V隔离输出的开关电源模块实现。这样虽然电路复杂些,但却提高了节眯的稳定性和安全性,具体节点电路如图3所示。
图3
5 CPU对PeliCAN的软件访问
除了CANMOD、CANSTA、CANCON等PeliCAN常用特殊寄存器可以进行直接读/写访问除外,所有其它的CAN寄存器都需要进行间接寻址。CANADR寄存器指向PeliCAN寄存器的地址,在写操作时将要送到被寻址寄存器的数据写入CANDAT;读操作时被寻址寄存器的数据可以从CANDAT中读出。下面的例子说明了对PeliCAN寄存器的直接和间接寻址功能。
/*模式寄存器的直接寻址*/
CANMOD=0x01;/*位RM置1进入复位模式*/
/*对位定时寄存器0和1的间接寻址*/
CANADR=BTR0;/*将地址设置到BTR0寄存器*/
CANDAT=0x45;/*将数据写入BTR0寄存器*/
CANADR=BTR1;/*将地址设置到BTR1寄存器*/
CANDAT=0x2B;/*将数据写入BTR1*/
下面给出上述节点电路的CAN初始化部分的程序。该程序可以直接应用到其它的系统程序之中。初始化部分的源程序如下:
#include<reg591.h>
void ini_can_controller(void)
{
CANMOD=0x01;/*进入复位模式,启动CAN初始化*/
P1M2=P1M2 I 0x02;/*引脚TXDC设置为推挽模式*/
CANSTA=0x03;/*使能接收和发送中断*/
CANADR=BTR0;/*BTR0和BTR1编程为125kb/s,在12MHz条件下*/
CANDAT=0x45;
CANADR=BTR1;/*TSEG1=12,TSEG2=3,SJW=2*/
CANDAT=0x2B;/*用户可根据具体的CAN网络
《P87C591内嵌CAN控制器的应用设计(第2页)》