本人用89c51+sja1000+tja1050,89c51的p26接sja_cs,p26接sja复位。现在用自收发模式(mod.2=1)调试,初始化sja1000总是失败,下面是初始化程序,请高手指点。
void init_sja1000(void) { uchar state,ss,status; uchar ACRR[4]; uchar AMRR[4];
// 接收代码寄存器 ACRR[0] = 0xff; ACRR[1] = 0xff; ACRR[2] = 0xff; ACRR[3] = 0xff;
// 接收屏蔽寄存器, AMRR[0] = 0xff; AMRR[1] = 0Xff; AMRR[2] = 0xff; AMRR[3] = 0xff;
// 使用do--while语句确保进入复位模式 do { MODR = 0x09; // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器 state = MODR; //state=0x09 ss=ECC; //ss=0x2f status=MODR; //status=0x09 } while( !(status & 0x01) );// status=MODR; //这条语句status=0x2f 应该是0x09这是为什么? ss=ECC; //ss=0x2f status=status & 0x01; //status=0x2f if(status==0x01) { state = MODR; ss=MODR; // 对SJA1000部分寄存器进行初始化设置 CDR = 0x88; // CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN BTR0 = 0x53; // 总线定时寄存器0 ;总线波特率设定 BTR1 = 0x2f; // 总线定时寄存器1 ;总线波特率设定 IER = 0x01; // IER.0=1--接收中断使能; IER.1=0--关闭发送中断使能 OCR = 0x1a; // 配置输出控制寄存器 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 { MODR = 0x0c; //MOD.2=1--进入自接收模式, MODR = 0x0c; state = ECC; status=MODR; } while( !(status & 0x0c) ); } }
|