woshiguowe 发表于 2026-2-4 13:25:29

STC32G128K LQFP32 CAN总线总是进入ISR 报错

//========================================================================
// 函数: void CANSetBaudrate()
// 描述: CAN总线波特率设置函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANSetBaudrate()
{
                CanWriteReg(MR, 0x04);                //使能Reset模式
        CanWriteReg(BTR0, 0x04);        //SJW(1), BRP(4)
        CanWriteReg(BTR1, 0x13);        //SAM(0), TSG2(1), TSG1(3)
        CanWriteReg(MR, 0x00);                //退出Reset模式
}

//========================================================================
// 函数: void CANInit()
// 描述: CAN初始化函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANInit()
{
        CANEN = 1;          //CAN1模块使能
        CanWriteReg(MR,0x05);//使能 Reset Mode, 采用单滤波设置

        CANSetBaudrate();        //设置波特率
       
        //设置过滤ID为:xxF8xxxx 的帧才接收
//        CanWriteReg(ACR0,0x07);                //总线验收代码寄存器
//        CanWriteReg(ACR1,0xc0);
//        CanWriteReg(ACR2,0x00);
//        CanWriteReg(ACR3,0x00);
//        CanWriteReg(AMR0,0xF8);                //总线验收屏蔽寄存器
//        CanWriteReg(AMR1,0x07);
//        CanWriteReg(AMR2,0xFF);
//        CanWriteReg(AMR3,0xFF);

        //取消过滤ID,所有帧都接收
        CanWriteReg(ACR0,0x00);                //总线验收代码寄存器
        CanWriteReg(ACR1,0x00);
        CanWriteReg(ACR2,0x00);
        CanWriteReg(ACR3,0x00);
        CanWriteReg(AMR0,0xFF);                //总线验收屏蔽寄存器
        CanWriteReg(AMR1,0xFF);
        CanWriteReg(AMR2,0xFF);
        CanWriteReg(AMR3,0xFF);

        CanWriteReg(IMR ,0xff);                //中断寄存器
        CanWriteReg(ISR ,0xff);                //清中断标志
        CanWriteReg(MR,0x01);                //退出 Reset Mode, 采用单滤波设置(设置过滤器后注意选择滤波模式)
//        CanWriteReg(MR,0x00);                //退出 Reset Mode, 采用双滤波设置(设置过滤器后注意选择滤波模式)

        P_SW1 = 0; //端口切换(CAN_Rx,CAN_Tx) 0x00:P0.0,P0.10x10:P5.0,P5.10x20:P4.2,P4.50x30:P7.0,P7.1
        CANICR = 0x02;                //CAN中断使能
}


//========================================================================
// 函数: void CANBUS_Interrupt(void) interrupt CAN1_VECTOR
// 描述: CAN总线中断函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期: 2020-11-19
// 备注:
//========================================================================
void CANBUS_Interrupt(void) interrupt CAN1_VECTOR
{
        u8 isr;
        u8 arTemp;
        arTemp = CANAR;   //CANAR现场保存,避免主循环里写完 CANAR 后产生中断,在中断里修改了 CANAR 内容
       
        isr = CanReadReg(ISR);
        if((isr & 0x04) == 0x04)//TI
    {
                CANAR = ISR;
                CANDR = 0x04;    //CLR FLAG

      B_CanSend = 0;
    }       
        if((isr & 0x08) == 0x08)//RI
    {
                CANAR = ISR;
                CANDR = 0x08;    //CLR FLAG

                B_CanRead = 1;
    }

        if((isr & 0x40) == 0x40)//ALI
    {
                CANAR = ISR;
                CANDR = 0x40;    //CLR FLAG
    }       

        if((isr & 0x20) == 0x20)//EWI
    {
                CANAR = ISR;
                CANDR = 0x20;    //CLR FLAG
    }       

        if((isr & 0x10) == 0x10)//EPI
    {
                CANAR = ISR;
                CANDR = 0x10;    //CLR FLAG
    }       

        if((isr & 0x02) == 0x02)//BEI
    {
                CANAR = ISR;
                CANDR = 0x02;    //CLR FLAG
    }       

        if((isr & 0x01) == 0x01)//DOI
    {
                CANAR = ISR;
                CANDR = 0x01;    //CLR FLAG
    }       

        CANAR = arTemp;    //CANAR现场恢复
}

总是进入这个 BEI
这个例程
之前用48脚的没问题 现在换成 32脚的就不好使了 求解

狂热主宰 发表于 2026-2-4 14:37:12

什么时候出了STC32G128K

狂热主宰 发表于 2026-2-4 14:42:52

引脚少了
引脚是否复用

woshiguowe 发表于 2026-2-4 14:54:09

狂热主宰 发表于 2026-2-4 14:42
引脚少了
引脚是否复用

之前有个板子因为驱动电机问题改了一下 通讯这里没改 之前是可以用的 但是这回就怎么都不好使用了48脚的程序 下在里面 也不行疯了都

乘风飞扬 发表于 2026-2-4 18:05:30

产生BEI中断是CAN模块在发送或者接收过程中产生了总线错误。
先排查硬件连接,发送时用示波器逐步测量CANTX,CANH/CANL信号是否正常?
CAN总线上有没有接其它节点,双方的波特率设置是否一样?

王昱顺 发表于 2026-2-4 18:12:14

woshiguowe 发表于 2026-2-4 14:54
之前有个板子因为驱动电机问题改了一下 通讯这里没改 之前是可以用的 但是这回就怎么都不好使用了48脚 ...

首先排查是否为焊接问题导致。
然后你这个硬件接的P00和P01,使用的是CAN1模块

但是我看你里面没有操作CANSEL的部分,需要初始化的时候设置一下AUXR2 &= ~(1<<3);//设置后续操作为CAN1模块

端口切换的时候,尽量不要影响到其他的位
P_SW1 = 0; //端口切换(CAN_Rx,CAN_Tx) 0x00:P0.0,P0.10x10:P5.0,P5.10x20:P4.2,P4.50x30:P7.0,P7.1

尽量使用P_SW1 &= ~(3<<4);//清除bit4,bit5位,选择P00,P01

或者你也可以尝试使用AiCube自动生成代码来配置这个CAN部分程序自动生成器,AiCube-ISP V6.96O, STC89/15/STC8H/STC32/8051U - AiCube-ISP , 程序自动生成工具, 支持STC89/15/8H/32/AI8051U 国芯人工智能技术交流网站 - AI32位8051交流社区

woshiguowe 发表于 2026-2-5 08:34:16

乘风飞扬 发表于 2026-2-4 18:05
产生BEI中断是CAN模块在发送或者接收过程中产生了总线错误。
先排查硬件连接,发送时用示波器逐步测量CANTX ...

{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}

woshiguowe 发表于 2026-2-5 08:34:34

王昱顺 发表于 2026-2-4 18:12
首先排查是否为焊接问题导致。
然后你这个硬件接的P00和P01,使用的是CAN1模块



{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}
页: [1]
查看完整版本: STC32G128K LQFP32 CAN总线总是进入ISR 报错