sja1000怪问题求救??????????

2020-01-25 15:20发布

一个CAN中继项目,51单片机带4路CAN控制器SJA1000,波特率5kbps,SJA1000的16脚分别连接到单片机的INT0 T0 INT1 T1脚上,中断接收CAN数据
我做了2版电路版,第一版全部正常 ,第二版出现问题
现在的现象是连接到INT0 T1脚上的SJA1000可以正常进入中断,用示波器能看到16脚上的电平变化,
而连接到T0 INT1的SJA1000的16脚由高变低后,在也不拉高,我使用查询方式接收这两路CAN数据,就正常,
现在死活找不到原因,

/************************************************************************
*函数原型:  void main(void)                                                                *
*参数说明:  无                                                         *
*返回值:         无                                                         *
*说明:主程序,完成CAN数据转发功能                                                                    *
************************************************************************/
void main(void)
{
        MCU_Init();
        RST_CAN = 1;
        Delay_Nms(100);
        RST_CAN = 0;
        DOG = !DOG;
        SJA0_Init();
        DOG = !DOG;
        SJA1_Init();
        DOG = !DOG;
        SJA2_Init();
        DOG = !DOG;
        SJA3_Init();
        Delay_Nms(10);
        EA = 1;
        while(1)
        {
                DOG = !DOG;
                if(Can0RevFrmCnt>0)
                {
                        Send_Can0RevData();
                        Can0RevFrmCnt--;
                }
                if(Can1RevFrmCnt>0)
                {
                        Send_Can1RevData();
                        Can1RevFrmCnt--;
                }
                if(Can2RevFrmCnt>0)
                {
                        Send_Can2RevData();
                        Can2RevFrmCnt--;
                }
                if(Can3RevFrmCnt>0)
                {
                        Send_Can3RevData();
                        Can3RevFrmCnt--;
                }
        }
}

/************************************************************************
*函数原型:  void MCU_Init(void)                                                        *
*参数说明:  无                                                         *
*返回值:         无                                                         *
*说明:该函数用于初始化MCU相关寄存器                                            *
************************************************************************/
void MCU_Init(void)
{
        TMOD = 0x66;        // T0:计数器、8位自动重载模式;T1:计数器、8位自动重载模式
        TH0 = 0xff;                // T0计数初值
        TL0 = 0xff;
        TH1 = 0xff;           // T1计数初值
        TL1 = 0xff;
        TCON = 0x55;        // TR1=1;TR0=1;IT1=1;IT0=1;
        ET1 = 1;                // 允许T1中断
        EX1 = 1;                // 允许INT1中断
        ET0 = 1;                // 允许T0中断
        EX0 = 1;                // 允许INT0中断
}

/************************************************************************
*函数原型:  void T1_IRQ() interrupt 3                                                *
*参数说明:  无                                                         *
*返回值:         无                                                         *
*说明:定时器1中断服务子程序,用于接收CAN3数据                         *
************************************************************************/
void T1_IRQ() interrupt 3                 // T1中断:CAN3接收中断
{
        u8 idata temp;
        EA = 0;
        DOG = !DOG;
        temp = IR3;
        if(temp&0x01)                        // 接收数据状态
                Can3RevData();
        if(temp&0x08)                        // 数据溢出中断
                CMR3 = 0x0c;                // 清除数据溢出位,释放缓存区
        if(temp&0x04)                        // 发生其他错误时,读取ALC0和ECC0,避免下次不进入中断
        {
                temp = ALC3;                // 读取仲裁丢失捕捉寄存器
                temp = ECC3;                // 读取错误代码捕捉寄存器
        }
        temp = SR3;
        if(temp&0x80)                        // 如果总线关闭,???
                MODE3 = 0x08;                // 单滤波
        EA = 1;
}

/************************************************************************
*函数原型:  void SJA3_Init(void)                                                        *
*参数说明:  无                                                         *
*返回值:         无                                                         *
*说明:该函数用于初始化CAN3的SJA1000                                            *
************************************************************************/
void SJA3_Init(void)
{
        u8 temp;
        MODE3 = 0x09;                                  // 单滤波,复位模式
        do{temp = MODE3;}
        while((temp&0x01)==0x00);        // 等待进入复位模式

        CDR3 = 0x88;        // PeliCAN模式;CBP = 1;关闭时钟;0x88???
        OCR3 = 0x1a;        // ???
        IER3 = 0x0d;        // 数据溢出中断使能;错误报警中断使能;接收中断使能

        AMR03 = 0xff;        // 验收屏蔽寄存器0
        AMR13 = 0xff;        // 验收屏蔽寄存器1
        AMR23 = 0xff;        // 验收屏蔽寄存器2
        AMR33 = 0xff;        // 验收屏蔽寄存器3
        ACR03 = 0x00;        // 验收代码寄存器0
        ACR13 = 0x00;        // 验收代码寄存器1
        ACR23 = 0x00;        // 验收代码寄存器2
        ACR33 = 0x00;        // 验收代码寄存器3

        BTR03 = 0x0f;        // 波特率5kb
        BTR13 = 0x7f;        // 波特率5kb

        TXERR3 = 0x00;        // 清空TX错误计数寄存器
        temp = ECC3;        // 读取错误代码捕捉寄存器,即清空

        MODE3 = 0x08;                        // 单滤波,正常模式
        do{temp = MODE3;}
        while(!(temp&0x08));        // 等待进入正常模式
}


51 (原文件名:未命名1.JPG)


SJA1000 (原文件名:未命名2.JPG)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。