问题描述:
使用 STM32F407 的 CAN 接口与多个设备通信,但偶尔会出现通信中断的情况。
排查过程:
使用 CAN 分析仪监测总线上的信号,发现有错误帧
查看 STM32 的 CAN 错误计数器,发现接收错误计数器经常接近上限
分析代码,发现没有完善的错误处理机制
解决方案:
添加 CAN 错误处理函数,当错误计数器接近上限时自动重启 CAN 控制器
优化 CAN 过滤器设置,减少不必要的中断
增加接收缓冲区,防止数据溢出
[color=rgba(0, 0, 0, 0.45)]// CAN错误处理函数void CAN_Error_Handler(void){ uint8_t errorCode = CAN_GetLastErrorCode(CAN1); uint8_t rxErrorCounter = CAN_GetReceiveErrorCounter(CAN1); uint8_t txErrorCounter = CAN_GetTransmitErrorCounter(CAN1); [color=rgba(0, 0, 0, 0.45)]// 记录错误信息 printf("CAN Error: Code=%d, RX Counter=%d, TX Counter=%d\r\n", errorCode, rxErrorCounter, txErrorCounter); [color=rgba(0, 0, 0, 0.45)]// 如果错误计数器接近上限,重启CAN控制器 if(rxErrorCounter > 96 || txErrorCounter > 96) { printf("CAN Error Counter too high, restarting CAN controller...\r\n"); [color=rgba(0, 0, 0, 0.45)]// 禁用CAN控制器 CAN_Cmd(CAN1, DISABLE); [color=rgba(0, 0, 0, 0.45)]// 重新初始化CAN控制器 CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = ENABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler = 4; CAN_Init(CAN1, &CAN_InitStructure); [color=rgba(0, 0, 0, 0.45)]// 重新配置过滤器 CAN_FilterInit(&CAN_FilterInitStructure); [color=rgba(0, 0, 0, 0.45)]// 使能CAN控制器 CAN_Cmd(CAN1, ENABLE); }}
|
|