CAN总线学习笔记四:CAN总线通信
扫描二维码
随时随地手机看文章
在理解了CAN总线的自通信程序后,再来探讨CAN总线间的相互通信变得容易了许多。对于是自通信还是相互通信,这个肯定是需要对寄存器进行必要的设置 的,分析PIAE的两个程序后不难发现,自通信和互通信需要设置的知识模式寄存器,这个是在SJA1000的初始化时进行设定的。
SJA1000的初始化程序我根据习惯,直接把它独立成一个子程序了。如下,是工作于自通信时的初始化程序。
///////////////////////////////////////////////
//函数:init_sja1000
//说明:独立CAN控制器SJA1000的初始化
//入口:无
//返回:无
///////////////////////////////////////////////
void init_sja1000(void)
{
uchar state;
uchar ACRR[4];
uchar AMRR[4];
// 接收代码寄存器
ACRR[0] = 0xff;
ACRR[1] = 0x22;
ACRR[2] = 0x33;
ACRR[3] = 0x44;
// 接收屏蔽寄存器,只接收主机发送的信息
AMRR[0] = 0xff;
AMRR[1] = 0Xff;
AMRR[2] = 0xff;
AMRR[3] = 0xff;
// 使用do--while语句确保进入复位模式
do
{ // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器
MODR = 0x09;
state = MODR;
}
while( !(state & 0x01) );
// 对SJA1000部分寄存器进行初始化设置
CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, //CDR.7=0---basic CAN, CDR.7=1---Peli CAN
BTR0 = 0x31; // 总线定时寄存器0 ;总线波特率设定
BTR1 = 0x1c; // 总线定时寄存器1 ;总线波特率设定
IER = 0x01; // IER.0=1--接收中断使能;IER.1=0--关闭发送中断使能
OCR = 0xaa; // 配置输出控制寄存器
CMR = 0x04; // 释放接收缓冲器
// 初始化接收代码寄存器
ACR0 = ACRR[0];
ACR1 = ACRR[1];
ACR2 = ACRR[2];
ACR3 = ACRR[3];
// 初始化接收屏蔽寄存器
AMR0 = AMRR[0];
AMR1 = AMRR[1];
AMR2 = AMRR[2];
AMR3 = AMRR[3];
// 使用do--while语句确保进入自接收模式
do
{ //MOD.2=1--进入自接收模式,MOD.3=0--双滤波器模式
MODR = 0x04;
state = MODR;
}
while( !(state & 0x04) );
}