兄弟们求助个事,最近被一个CANopen从站搞到头大。设备是工业伺服驱动器,主控STM32F407VGT6,CAN走的是片内bxCAN,收发器TJA1050,波特率500k,总线挂了12个从站,线长大概25米,终端电阻两端各120Ω。小批量试产30台,老化房里跑两天,有5台会随机掉线,掉线时间不固定,有时十几分钟,有时几个小时。掉线后从站心跳停发,但MCU没死机,本地串口还能打印,复位CAN外设就恢复。已经查过的:电源纹波测了,3.3V上大概40mV;TJA1050换过批次;CANH/CANL用示波器看了,掉线瞬间波形有毛刺但不是每次都抓得到;终端电阻和屏蔽接地也确认了。我怀疑是bxCAN的接收FIFO溢出或者错误被动状态没处理好,但看规格书第3页那个错误管理框图还是没吃透。有没有同行遇到过类似情况?到底是软件错误恢复机制的问题,还是硬件收发这块有坑?产线等着发货,急,先谢过。
掉线后MCU没死、复位CAN就恢复,八成是bxCAN进了Bus-Off或错误被动后没自动恢复,根子在错误计数边界上。先查这几个点:一是在HAL_CAN_ErrorCallback里打印ESR寄存器,看TEC/REC和历史错误码,确认是位错误还是ACK错误累积到255进Bus-Off;二是把自动总线恢复(ABOM)打开,HAL默认不使能,很多人栽这;三是掉线瞬间用CAN分析仪抓总线,看是不是某个节点ACK丢失或毛刺触发了连续错误。另外500k下25米12节点,支线长度和每节点收发器到连接器的走线也得看,支线超0.3米就容易反射,配合毛刺正好打中采样点。先把ESR日志和ABOM落实了,大概率能定位。