圖3
5 CPU對PeliCAN的軟件訪問
除了CANMOD、CANSTA、CANCON等PeliCAN常用特殊寄存器可以進行直接讀/寫訪問除外,所有其它的CAN寄存器都需要進行間接尋址。CANADR寄存器指向PeliCAN寄存器的地址,在寫操作時將要送到被尋址寄存器的數(shù)據(jù)寫入CANDAT;讀操作時被尋址寄存器的數(shù)據(jù)可以從CANDAT中讀出。下面的例子說明了對PeliCAN寄存器的直接和間接尋址功能。
/*模式寄存器的直接尋址*/
CANMOD=0x01;/*位RM置1進入復位模式*/
/*對位定時寄存器0和1的間接尋址*/
CANADR=BTR0;/*將地址設(shè)置到BTR0寄存器*/
CANDAT=0x45;/*將數(shù)據(jù)寫入BTR0寄存器*/
CANADR=BTR1;/*將地址設(shè)置到BTR1寄存器*/
CANDAT=0x2B;/*將數(shù)據(jù)寫入BTR1*/
下面給出上述節(jié)點電路的CAN初始化部分的程序。該程序可以直接應(yīng)用到其它的系統(tǒng)程序之中。初始化部分的源程序如下:
#include<reg591.h>
void ini_can_controller(void)
{
CANMOD=0x01;/*進入復位模式,啟動CAN初始化*/
P1M2=P1M2 I 0x02;/*引腳TXDC設(shè)置為推挽模式*/
CANSTA=0x03;/*使能接收和發(fā)送中斷*/
CANADR=BTR0;/*BTR0和BTR1編程為125kb/s,在12MHz條件下*/
CANDAT=0x45;
CANADR=BTR1;/*TSEG1=12,TSEG2=3,SJW=2*/
CANDAT=0x2B;/*用戶可根據(jù)具體的CAN網(wǎng)絡(luò)來調(diào)整BTR0、BRT1的參數(shù)*/
CANADR=AMR10;/*設(shè)定接收屏蔽寄存器的址*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器1無關(guān),允許任何數(shù)據(jù)通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器無關(guān),允許任何數(shù)據(jù)通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存器3無關(guān),允許任何數(shù)據(jù)通過濾波器*/
CANDAT=0xFF;/*Bank1:與接收屏蔽寄存4無關(guān),允許任何數(shù)據(jù)通過濾波器*/
CANADR=ACFMODE;/*設(shè)定接收濾波器模式寄存器的地址*/
CANDAT=0x01;/*設(shè)定BANK1為單濾波模式,標準幀*/
CANADR=ACFENA;/*設(shè)定接收濾波器使能寄存器的地址*/
CANDAT=0x01;/*使能BANK1的濾波器*/
CANMOD=0x00;/*請求進入CAN的激活模式*/
while(CANSTA & 0x80);/*等待總線激活*/
}
結(jié)語
在CAN網(wǎng)絡(luò)節(jié)點的設(shè)計中,使用集成的CAN控制器是大勢所趨。本文從硬件和軟件的角度對內(nèi)嵌CAN控制器(SJA1000)的P87C591進行了詳細的介紹。不僅給出了P87C591 CAN應(yīng)用的外圍電路接法,還給出了應(yīng)用的初始化程序,這為以后的系開發(fā)提供了一個很好的基礎(chǔ)。





