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脚的就不好使了 求解
什么时候出了STC32G128K 引脚少了
引脚是否复用 狂热主宰 发表于 2026-2-4 14:42
引脚少了
引脚是否复用
之前有个板子因为驱动电机问题改了一下 通讯这里没改 之前是可以用的 但是这回就怎么都不好使用了48脚的程序 下在里面 也不行疯了都 产生BEI中断是CAN模块在发送或者接收过程中产生了总线错误。
先排查硬件连接,发送时用示波器逐步测量CANTX,CANH/CANL信号是否正常?
CAN总线上有没有接其它节点,双方的波特率设置是否一样? 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交流社区
乘风飞扬 发表于 2026-2-4 18:05
产生BEI中断是CAN模块在发送或者接收过程中产生了总线错误。
先排查硬件连接,发送时用示波器逐步测量CANTX ...
{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:} 王昱顺 发表于 2026-2-4 18:12
首先排查是否为焊接问题导致。
然后你这个硬件接的P00和P01,使用的是CAN1模块
{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}{:baoquan:}
页:
[1]