我的系统:51+SJA1000
现象:只要一发数就复位
SJA1000初始化代码:
///////////////////////////////////////////////
//函数:init_sja1000
//说明:独立CAN控制器SJA1000的初始化
//入口:无
//返回:无
///////////////////////////////////////////////
void init_sja1000(void)
{
uchar state,ss,status;
uchar ACRR[4];
uchar AMRR[4];
// 接收代码寄存器
//ACRR[0] = can_node_id;
ACRR[0] = 0xff;
ACRR[1] = 0xff;
ACRR[2] = 0xff;
ACRR[3] = 0xff;
// 接收屏蔽寄存器,只接收主机发送的信息
AMRR[0] = 0x00;
AMRR[1] = 0x00;
AMRR[2] = 0x00;
AMRR[3] = 0x00;
WDTCR|=0x10;
// 使用do--while语句确保进入复位模式
do
{
REMODE = 0x01; // 设置MOD.0=1--进入复位模式,以便设置相应的寄存器
delay(2);
state = REMODE;
ss=ECC;
status=REMODE;
}
while( !(status & 0x01) );
WDTCR|=0x10;
// 对SJA1000部分寄存器进行初始化设置
CDR = 0xc8; // CDR为时钟分频器,CDR.3=1--时钟关闭, CDR.7=0---basic CAN, CDR.7=1---Peli CAN
BTR0 = 0x67; //10K
BTR1 = 0x2f;
IER = 0xfd; // 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
{
//REMODE = 0x00; //MOD.2=1--进入自接收模式,MOD.3=0--双滤波器模式
status=REMODE;
REMODE = 0x08;
delay(2);
state = ECC;
state = SR;
delay(2);
state = REMODE;
}
while( !(status & 0x08) );
CMR = 0X04;
WDTCR|=0x10;
}
求指点!
|