很多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里。 |