圖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網絡來調整BTR0、BRT1的參數*/
CANADR=AMR10;/*設定接收屏蔽寄存器的址*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器1無關,允許任何數據通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器無關,允許任何數據通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器3無關,允許任何數據通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存4無關,允許任何數據通過濾波器*/
CANADR=ACFMODE;/*設定接收濾波器模式寄存器的地址*/
CANDAT=0x01;/*設定BANK1為單濾波模式,標準幀*/
CANADR=ACFENA;/*設定接收濾波器使能寄存器的地址*/
CANDAT=0x01;/*使能BANK1的濾波器*/
CANMOD=0x00;/*請求進入CAN的激活模式*/
while(CANSTA & 0x80);/*等待總線激活*/
}
結語
在CAN網絡節點的設計中,使用集成的CAN控制器是大勢所趨。本文從硬件和軟件的角度對內嵌CAN控制器(SJA1000)的P87C591進行了詳細的介紹。不僅給出了P87C591 CAN應用的外圍電路接法,還給出了應用的初始化程序,這為以后的系開發提供了一個很好的基礎。





