发表于:2007-05-04 10:07:00
楼主
很多CAN初学者,对SJA1000的初始化感到没有头绪,这里给出一个BASIC模式初始化实验程序。
实际上,对一个通信控制器初始化应该是很简单的几条语句。而且像CDR、OCR等等这样的寄存器一般实验中都是标准设置。不必人人都去化时间研究它的设置原理。
应该像操作系统一样,有人做过了,只管调用就行。节省下时间,多做些有创意的工作。
还有波特率设置参数,有人算过了,我们就不必重复再去计算,只要会调用就行。
#pragma SMALL
#include<reg51.h>
#include<sjaregb1.h>
#define uchar unsigned char
uchar xdata *SJA_Adr=0x7f00;
#define can_read(RegAdr) SJA_Adr[RegAdr]
#define can_write(RegAdr,Val) SJA_Adr[RegAdr]=Val
//BASIC模式初始化程序,调用时直接输入标识符ID、屏蔽码、波特率3个参数.
//例如:initial(0x78,0,500k);
void initial(uchar B_ACR,uchar B_AMR,uchar Fbps)
{
uchar c, B_CDR=0x40, B_OCR=0xfa;
can_write(CDR,B_CDR); //时钟分频寄存器,默认0x40
IE=0;
c=can_read(IR);
can_write(CR,0x61); //进入复位模式
can_write(OCR,B_OCR); //输出控制寄存器,默认0xfa
can_write(BTR0,BTR_TAB[Fbps]); //波特率设置
can_write(BTR1,BTR_TAB[Fbps+1]);
can_write(ACR,B_ACR); //验收代码寄存器
can_write(AMR,B_AMR); //验收屏蔽寄存器
can_write(CR,0x06); //进入工作模式
}
void main(void)
{
uchar c;
initial(0x54,0,250k); //SJA1000初始化
.
.
.
.
.
.
}
其他在sjaregb1.h里,实际程序initial( )也应在sjaregb1.h里。