实验配置:
1 、下位机采用飞思卡尔s12的芯片收发CAN数据,收发器用的是TJA1050
2、上位机采用周立功的canalyst-II,CANPro协议分析平台
3、还有一个监测节点。
实验目的:
上位机和下位机互发互收并正常响应。
实验现象:
下位机发送几次后进入“死机”状态,但是上位机还是一直在接收数据。
实验问题展示:
1、将飞思卡尔芯片仿真运行,进入假死状态后,“停止”运行,发现程序似乎是陷在CAN_ERR(用PE 生成的CAN错误处理子程序)中了。
2、在CAN_SEND(can发送子程序)中设置断点,程序运行不到此处。
3、上位机接收的数据帧是下位机进入“假死”之前的最后一帧。
4、用示波器挂在总线上,发现总线上确实有数据在传输,但波形不是特别整齐。
5、去掉周立功模块,总线上的数据整齐,重新仿真下位机表现正常(数据被检测节点接收)。
初步推断:
1、周立功模块干扰较大,但其自身对CAN数据的纠错能力较强
2、周立功模块接收成功,但是下位机由于总线干扰严重,认为发送失败,进入canERR子程序,命令can收发器进入自动重发模式。
后续解决办法:
将CAN_ERR子程序里添加清除错误,返回,程序也可正常运行。
后续发现:
将周立功模块设置为只听模式这种干扰也会消失,但是只听模式是不能发送的。
打开周立功模块,发现其电源设计部分没有采用稳压电路或电源芯片,仅仅使用了隔离电源模块,怀疑这是干扰产生的原因。
由于本人对CAN收发的机制不是特别清楚,所以不知道这样设计(改写CAN_ERR子程序)对不对,是否违背了CAN总线应用机制,另外想知道分析的周立功模块产生这种干扰的原因对不对。 |