FIBERIOT / 基础知识
在控制器里写入一组CAN数据后,示波器上看到的位数可能比按报文各字段相加所得的位数更多。多出的部分来自位填充。经典CAN发送器在一段适用范围内遇到连续五个同值位后,会插入一个反值位。接收控制器用同样的规则识别并移除它,再按原字段解释报文。这个过程既关系到接收端如何校正位时序,也关系到为什么等长报文的实际占线时间可以不同。
01一段平坦的信号仍在传输比特
高速CAN铜线上,收发器把控制器的逻辑位变成CAN_H与CAN_L之间的差分状态。显性位用逻辑0表示,隐性位用逻辑1表示。当一个节点驱动显性状态时,总线能够覆盖其他节点的隐性状态。在线路电平保持不变的期间,接收控制器仍按自己的位时间和采样点逐位判决。比如一段显性平台可能含有数个0,每个0都占一个位时间。
节点的时钟来自各自的振荡器,位时间可以设成相同的标称值,实际仍存在小偏差。接收器在帧起始时对齐位时序,并在帧内借助符合条件的边沿修正相位。连续很久没有合适的边沿时,接收采样与发送位边界之间的偏差会逐步累积。位填充让长同值串中出现转换,为同步提供机会。实际能否正确采样还受传播时延、采样点设置和信号质量影响。

02发送端数的是已经发到线上的位
取动态填充区内一段简化的逻辑序列,假设进入这段时已有的连续计数为零。应用希望送出五个0再跟一个1。发送器在送出第五个0后先插入一个1,然后继续送原来的1。线上就有五个0、一个用于填充的1和一个原始的1。插入位置可以落在一字节内部,也可以紧接某个字段结尾。控制器跟踪连续的位流,不会在每个数据字节边界清零。
图1的七格从左向右是 0、0、0、0、0、1、1。逻辑轨迹在第六格起跳,并在第七格继续保持;只有第六格是插入的,不能把两个隐性位一起丢掉。图2接着标出这个规则在哪个字段结束。
插入的反值位本身也是线上序列的一部分,会成为新同值串的第一个位。比如在上述五个0之后,若原始序列接着有四个1,这四个1会与刚插入的1凑成连续五个1,发送器便继续插入一个0。可见不能把规则记成“每五个原始位插一次”。相邻字段和前面插入过的位共同决定下一次何时触发。
接收端遇到五个同值位后,预期下一位是相反状态。采样正确时,它识别出这是填充位,更新线上连续位的状态,但不把该位交给字段解析。随后采样到的那个原始1仍要正常保留。两个1在线路上可以形成连续的平台,是否属于负载要由接收控制器结合当前位置和历史计数判断。

03到哪里停止数连续位
经典CAN数据帧从帧起始位开始,经过仲裁字段、控制字段、数据字段,一直到CRC序列结束,按动态规则填充。接收器要在处理这一段时同步跟踪字段长度。填充造成的额外位只增加线上位时间,报文中表示数据长度的DLC仍按其原有语义解释。逻辑字段排布与示波器读到的物理时间格可以不同。
CRC序列之后的CRC分隔位、ACK字段和帧结束段按各自的规定处理,不再套用前段的动态填充计数。例如经典CAN帧结束段规定有连续七个隐性位,看到这样的位串不能直接判为填充错误。抓波形时需要先确定帧边界及错误标志的位置,然后再判断那段平台在哪一个区间内出现。
发送器用从帧起始到数据字段末尾的未填充逻辑位计算经典CAN的CRC序列,再把CRC序列纳入发送时的填充范围。接收器先按规则移除动态填充位,再进行相应的CRC检查。这样,线路上的编码开销与协议字段的校验各有职责。CAN FD的CRC区使用不同的规则,帧格式与控制器配置需按对应规范另行核对。
远程帧也需要按经典CAN的适用字段跟踪动态填充。它可以通过DLC表达请求的数据长度,但帧内没有数据字段。用分析仪手工核对时,先确认帧类型,再找CRC序列,避免把远程帧的DLC当成线上紧跟的数据字节数,导致后续边界全都错位。
04同样的数据长度为什么会占用不同时间
看负载时还要区分单帧发送时间与报文等待时间。位填充影响该帧自身的线速开销,仲裁等待则取决于其他节点当时发送什么。测量周期报文时可分别记录帧起始之间的间隔和从帧起始到帧结束的时间,两项变化所指向的原因不同。
比较两个已经正常发送的经典CAN数据帧,数据字节数相同,标识符或数据模式仍可能不同。一个帧里反复出现长同值串,另一个帧里的0与1经常交替。前者可能需要插入更多填充位,CRC序列的具体位值也会影响总数。使用同一标称位率时,每多发一个填充位就多占一个位时间,因此负载估算需要考虑实际或保守估计的线上长度。
分析仪提供的解码视图通常显示标识符、DLC和还原后的数据。要核对占用时间,需要知道计时从何处开始、到何处结束。单帧发送时间、从排队到仲裁成功的等待,以及遇错后重发的时间属于不同项目。记录测量边界,就能避免把报文变长与网络繁忙混成同一种延迟。
05看到填充错误要定位发生在哪一段
在采用动态填充的字段内,如果接收器在该出现反值位的位置仍采样到第六个相同值,就会报告相应错误。过长的平台可能来自对端输出状态异常,也可能来自本地采样点、位率或波形失真。若错误主动节点发送主动错误标志,其他节点也可能随后看到违反规则的长显性串。因此一处日志里的填充错误有可能是更早错误的后果。
工程记录应同时保存错误类型、最早事件和可用波形。CRC错误提示接收端计算与传来的校验序列不一致,格式错误涉及规定格式的字段,ACK错误表示发送器在确认槽未观察到预期的显性确认。它们可以在同一次通信异常中先后出现。把记录按时间排序,再检查出错字段,可以缩小调查范围。

06经光纤延伸时把铜段和设备职责一起检查
飞畅工业轨式8路CAN光端机的官网资料列有CAN总线到光纤中继与点对点应用。工程上可把两端的CAN铜段、光纤和端设备分别列为观察对象。先按实际设备文件核对帧格式、位率、端接与连接方式,再在隔离测试条件下用已知报文检查两端接收情况。本文的图示用来标记观察位置,具体设备怎样跨光纤转发需查看对应型号文件。
如果发送端铜段上的信号和解码均稳定,而接收端附近出现间歇错误,可对照另一端的状态和时间戳,检查故障是否随线缆、端设备或特定负载变化。测试时保持报文周期及其他条件可追踪,每次调整一个变量。最后应记录字段是否还原正确、错误事件是否重现,以及更换路径后实际业务是否恢复。这样才能把正常的填充开销与真正的传输异常区分开来。
技术资料
Bosch:CAN与CAN FD的差错检测机制 · Microchip:CAN位填充与帧格式 · 飞畅工业轨式8路CAN光端机
现场常见问题
为什么连续五个同值位后要插位?
插入反值位会在线上形成一次跳变。满足条件的边沿可以用于重同步,从而限制无跳变区间持续的时间。
帧结束的七个隐性位会触发填充错误吗?
经典CAN的帧结束段是固定形式,合法的七个隐性位位于动态填充范围之外。
怎样在光纤链路上查填充错误?
同步捕获两端铜段的同一测试帧,核对位率、采样与端接,确认控制器报告错误的时间,再检查光端机的转发方式。
适用边界与延伸阅读
图示适用于经典CAN,现场位率、采样点和设备转发能力应按相应型号文件核实。


