背景: 在最近的项目中遇到了客户反馈错误帧的问题。我们的节点在自己测试的时候没有发现有错误帧,CAN时间参数和采样点都是按照客户需求进行配置的。根据以往的项目经验正常是不会有问题的。 怀疑过整车的线束过长导致CAN点平不稳定,于是增加了CANFD的第二采样点SSP。但是并没有解决客户的问题。 然后又怀疑是因为终端电阻的问题导致的,整车的终端电阻应该是两个相距最远(拓扑上最远)的ECU分别接有120欧电阻。并联在总线上,总线的电阻就是60欧。
然后去车上测试验证,用万用表测量,需要断开整车电源才可以测量,一开始测试的同事没断电就用万用表去量CANH和CANL两条线了。我甚至都怀疑我的物理是不是学错误了,然后量出了一个匪夷所思的数据。 不过最后也断电进行测量了,发现总线上并没有终端电阻。于是在加上终端电阻后这个问题的已解决。
但是,没过多久新的错误帧又出现了,这次的车已经确认过终端电阻是正确的。然后让客户提供log进行分析:
这次只有IBC和其他供应商的ESP节点,客户经过验证发现是这两个节点同时存在的时候才会有错误帧。 并且错误帧的ID是我们的IBC节点,于是乎问题就丢到我这边来了。
之前因为对错误帧的理解不够深,认为错误帧的ID是谁,就应该是这个节点出了问题导致的。其实错误帧的产生是分两种的,一种是主动错误,另外一种是被动错误。
从上面的log可以看出,错误帧ID是0xB1 这个报文是IBC 也就是我们的节点发出的一帧CANFD报文,10ms周期。错误类型是stuff error。
什么是stuff error? CAN的填充机制是每检测到5个连续相同的位时,即填充一个相反的位,以提供足够的跳变沿来进行同步,当在总线上有报文时,检测到连续的6个相同的位时,即认为是填充错误。
那么你是不是也认为是我们IBC发送的ID 0xB0填充位有问题? 刚开始我也是这样认为的,觉得可能是IBC的第二采样点SSP 没有设置好,并且车上的线束较长 导致电压不稳定,所以导致的错误帧。
但是忽略了一个最重要的问题,就是对象是谁?你有对象吗?对象是谁?过年带回家吗?
这里的对象是只检测到错误帧的角色是谁?上面只有IBC和EPS两个节点,对象是不是就是其中一个?错! 之所以能够看到这些log 是因为接了CANOE,CANOE也是一个节点,只不过现在只接收不发送。
然后在回过头来看,stuff error 它一定是发送节点造成的吗?答案是:不一定, stuff error 如何被检测到?
第一: 对于EPS和CANOE来说是接收方,那么就会一直监测总线看有没有6个连续的点平出现,一旦6个连续的点平被检测到,那么EPS或者是CANOE就会发出错误标记
发出错误标记:6个连续的显性位,这个时候总线就会被拉低6个点平。与此同时发送方IBC在继续发下一个bit的时候就会被这6个错误标记拉低。 发送方有回读机制,就是会检测自己发出去的点平是否正确,此时发出的是1,回读的是0 就认为是错误(bit error)了。因为回读机制错误都是报bit error IBC就会记录错误并且进行重发数据。
很有意思的一个事情,此时总线肯定是错误了,但是 发送方IBC检测到的是bit error,接收方EPS 和CANOE检测到的是stuff error。那么就要找到是谁主动发出错误帧,就知道问题所在了。
分析了那么多,最后还是用最原始的方法,控制变量法。IBC CANOE 相连,CANOE模拟发送EPS的报文,此时没有错误帧。但是EPS和CANOE相连 ,CANOE模拟发送IBC的报文,出现了bit error。
问题基本确认,EPS 有问题!!! 最终通过更改CANOE采样点发现EPS的数据域采样点是65%, 而客户要求的是75%,IBC和CANOE设置的都是正确的。
最终确定问题所在,EPS采样点设置错误。
总结: 错误帧要分清楚对象,同一个问题引起的错误帧,发送方和接收方看到的是不一样的。