CAN總線學(xué)習(xí)筆記四:CAN總線通信
在理解了CAN總線的自通信程序后,再來探討CAN總線間的相互通信變得容易了許多。對于是自通信還是相互通信,這個肯定是需要對寄存器進(jìn)行必要的設(shè)置 的,分析PIAE的兩個程序后不難發(fā)現(xiàn),自通信和互通信需要設(shè)置的知識模式寄存器,這個是在SJA1000的初始化時進(jìn)行設(shè)定的。
SJA1000的初始化程序我根據(jù)習(xí)慣,直接把它獨立成一個子程序了。如下,是工作于自通信時的初始化程序。
///////////////////////////////////////////////
//函數(shù):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;
// 接收屏蔽寄存器,只接收主機(jī)發(fā)送的信息
AMRR[0] = 0xff;
AMRR[1] = 0Xff;
AMRR[2] = 0xff;
AMRR[3] = 0xff;
// 使用do--while語句確保進(jìn)入復(fù)位模式
do
{ // 設(shè)置MOD.0=1--進(jìn)入復(fù)位模式,以便設(shè)置相應(yīng)的寄存器
MODR = 0x09;
state = MODR;
}
while( !(state & 0x01) );
// 對SJA1000部分寄存器進(jìn)行初始化設(shè)置
CDR = 0x88; // CDR為時鐘分頻器,CDR.3=1--時鐘關(guān)閉, //CDR.7=0---basic CAN, CDR.7=1---Peli CAN
BTR0 = 0x31; // 總線定時寄存器0 ;總線波特率設(shè)定
BTR1 = 0x1c; // 總線定時寄存器1 ;總線波特率設(shè)定
IER = 0x01; // IER.0=1--接收中斷使能;IER.1=0--關(guān)閉發(fā)送中斷使能
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語句確保進(jìn)入自接收模式
do
{ //MOD.2=1--進(jìn)入自接收模式,MOD.3=0--雙濾波器模式
MODR = 0x04;
state = MODR;
}
while( !(state & 0x04) );
}