ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CAN总线采样点配置:从位时间到错误帧排查的工程实战

CAN总线采样点配置:从位时间到错误帧排查的工程实战 做汽车电子或工业现场总线的同学应该都撞见过这种怪事波特率对得好好的终端电阻测过是60Ω线束长度也不算离谱可节点一联网就冒出错误帧单机测试却一切正常。换台设备、换块板子问题还复现。排查到最后十有八九是采样点Sample Point这个参数在捣鬼。这篇就绕着“采样点是啥、怎么算、怎么测、坏了怎么抓”四条线把我这几年在CAN/CAN FD总线上实测的经验和踩过的坑摊开聊。适合刚接触总线的嵌入式工程师也适合正在做车载网络测试、CAN一致性测试的老手。只要你有过被偶发错误帧折磨到深夜的经历这文章就值得看完。1. 采样点原理一个位到底在哪儿“取数”决定了通信生死1.1 位时间结构一个“比特”内部还有分段CAN和CAN FD的每一个位不是简单地发送高或低电平就结束了。在控制器内部一个位时间会被切成四段同步段SYNC_SEG、传播段PROP_SEG、相位缓冲段1PHASE_SEG1和相位缓冲段2PHASE_SEG2。接收节点会在一个非常精确的时间点去读取总线电平这个点就是采样点它通常位于PHASE_SEG1结束、PHASE_SEG2开始的那个时刻。每段都有各自的任务。同步段固定占用一个时间量子TQ用来处理总线边沿跳变收发双方靠它对齐节奏传播段用来补偿信号在总线上的延迟——线缆有长度收发器有响应时间信号不可能瞬间到对面再回来这段时间必须留出来相位缓冲段1和相位缓冲段2则是用来吸收振荡器偏差和干扰导致的相位误差左右各留一段缓冲采样点就夹在两者中间。这有点像打羽毛球对方击球后球要飞一会儿才过网你提前站好位置、举拍等着在球落到最佳击球点的那个瞬间挥拍。击球点太早或太晚球都会打飞。总线采样也是同样的道理。1.2 采样点选错位置会怎样如果采样点设得太靠前总线电平可能还处于信号边沿附近的暂态区。CAN总线上的显性位和隐性位切换时电平不会瞬间跳变而是一个有上升沿、下降沿的过渡过程。线缆长、节点多、寄生电容大的时候边沿会被拉得更缓。在这个窗口内采样读到的电平可能既不是1也不是0接收器就会报位错误触发错误帧。采样点设得太靠后同样麻烦。一个位时间结束前下一个位的边沿可能已经悄悄到来。尤其在连续相同位之后出现一个翻转位信号刚刚有个“苗头”你在这个临界点采样很容易把下一位的状态提前读进来。按CAN的机制接收节点检测到电平与期望不符时会发错误帧要求发送方重传。表现就是总线错误计数器蹭蹭上涨严重的直接Bus Off。需要注意采样点不是“越居中越好”。对于传统CAN业内普遍推荐的区间是75%到87.5%之间。为什么偏后而不是居中因为接收节点要等发送节点传过来的信号经历完整线缆延迟和收发器延迟后再结合自己的时钟去采样。信号到达得本来就晚采样点如果太靠前根本没等到对方电平稳定就已经取了数。1.3 CAN FD 对采样点更苛刻CAN FD相比经典CAN变化最大的就是数据段速率更高。经典CAN最高1Mbit/sCAN FD数据段可以到2Mbit/s、5Mbit/s甚至8Mbit/s。位时间越短物理延迟对采样窗口的压缩就越明显。比如8Mbit/s下一个位只有125ns而一个普通高速CAN收发器的TXD到RXD环回延迟往往就有150ns到250ns。也就是说信号绕一圈回来比你一个位的时间还长。这种时候采样点在数据段就不能按老CAN的习惯来设。实际工程中CAN FD通常分两段配置采样点仲裁段沿用CAN的策略75%到80%左右因为仲裁段速率低还要兼顾同网络里老节点的兼容数据段则建议安排在85%到90%左右给高速位流留出足够裕量。很多现代控制器比如带M_CAN内核的MCU允许仲裁段和数据段分开配置TQ参数这就是为FD准备的。老一代只支持CAN的控制器没这个能力跑FD自然就吃力了。2. 采样点怎么算公式、实例与常见误区2.1 采样点计算公式一页纸讲清楚现在看采样点公式先给定义采样点百分比 (SYNC_SEG PROP_SEG PHASE_SEG1) / 位时间总TQ数注意很多MCU的寄存器里不单独分PROP_SEG和PHASE_SEG1而是合并成一个TSEG1。这时候公式就简化为采样点百分比 (SYNC_SEG TSEG1) / (SYNC_SEG TSEG1 TSEG2)其中SYNC_SEG固定等于1个TQ。TSEG1是传播段与相位缓冲段1之和TSEG2就是相位缓冲段2。举一个实际算例。某项目用40MHz系统时钟目标波特率500kbps取BRP4则TQ 4 / 40MHz 100ns。一个位时间2000ns分成20个TQ。若想采样点落在75%则SYNC_SEG1TSEG114TSEG25计算(114)/20 75%成立。寄存器里TSEG1写14TSEG2写5完事。但如果你随手配成TSEG110TSEG29采样点就是11/2055%这个值在实际网络中必然出问题。我有一次在客户现场排查丢帧读出来的TSEG1/TSEG2正是这种“随手配置”问就是“默认值没改过”。默认值真不一定能用。2.2 传播段的工程估算方法很多人只关注采样点公式却忽略了一个关键前提传播段到底该留多少个TQ传播段是用来覆盖物理层延迟的包括三部分线缆传播延迟。双绞线信号传播速度约为光速的0.65到0.7倍换算下来大概每米5到7ns。这个数字看着小但总线动不动十几米乘上2发送到接收是单程但收发双方都需要经过总线工程上常按往返估算就得翻倍。收发器延迟。从TXD输入到RXD输出一个完整环回少说100多ns高速FD收发器可能超过200ns。这是延迟的大头也是最容易被忽略的部分。节点内部逻辑延迟。MCU内部滤波、比较器建立时间一般几十纳秒到上百纳秒取决于芯片设计。工程估算公式可以写成总传播延迟 ≈ 2 × (线缆长度 × 5~7ns/m) 2 × 收发器环回延迟举个例子总线长度10m收发器环回延迟按200ns算总延迟 ≈ 2 × 10 × 6ns 2 × 200ns 120ns 400ns 520ns在500kbps下一个位是2000ns520ns的延迟意味着采样点前至少要留出26%的位时间来等信号稳定。如果你设计采样点85%前面留给“信号到达稳定”的窗口大约是位时间的85%-边沿建立时间比例算下来是够的。但如果总线长度拉到40m延迟变成2×40×6400880ns接近半个位时间采样点就算设在87%信号稳定区也只剩不到380ns裕量很悬。这就是为什么长线缆必须重新算不能拿着短线的参数直接上。2.3 时间量子分配TQ数量直接限制你的调整精度还有一个常见的坑位时间总TQ数太少导致采样点只能粗调。还是用40MHz时钟算账。如果BRP1TQ25ns。跑1Mbps时位时间1000ns只有40个TQ采样点能以2.5%的步进调整还算灵活。但跑8Mbps FD时位时间125ns只有5个TQ想调出85%的采样点5×0.854.25只能取4或5实际采样点要么80%要么100%根本没法精准落在目标上。这不是算法问题是TQ数不够物理上就没法细调。所以做CAN FD高速配置时一个基本原则是数据段位时间内的TQ数一般不能少于8个太少的话采样点位置和SJW配置都会受限。有些控制器允许少到4个那是极限工程上别轻易碰。下表是几种典型配置的采样点对照方便快速验算SYNC_SEGTSEG1TSEG2总TQ采样点是否适合CAN1871656.3%否太早11051668.8%偏早短总线勉强11452075.0%推荐经典值11542080.0%推荐常见11321687.5%可用接近上限表格里“是否适合”只针对常规工业和车载短线场景。如果你的系统是收发器延迟极小、线缆极短的板级通信68.8%也能跑但抗干扰能力和兼容性会差市场上的ECU不一定会买账。3. 采样点测试实操从示波器到一致性测试3.1 工具选择与接线测试第一步就决定可信度测采样点工具选型和接线方式决定了数据的可信度。最基础的是数字示波器建议带宽至少100MHz采样率至少1GS/s。带宽不够边沿都测不准后面全是白做。探头方面强烈建议用差分探头因为CAN信号是CAN_H和CAN_L之间的差分电压用两个普通探头分别测然后相减寄生电容和共模噪声会污染波形测低速CAN还行测CAN FD的高速位流会得到一堆假边沿。如果手里只有普通探头也要把两个探头的地线夹尽量短并保证两个通道的垂直刻度、水平刻度完全一致再通过示波器的数学运算做差分。但这种方法只适合验证不适合出正式报告。更专业的做法是用CAN总线一致性测试工具比如CANscope、CANoe的一致性测试包或者带CAN触发的示波器。这些工具能直接解码CAN报文显示ID、数据场还能自动标注位时间和采样点的理论位置。测起来效率比纯手动高一个量级。接线有个容易被忽略的点探头的测量点要尽量靠近被测节点的CAN收发器引脚而不是在连接器处。因为连接器到收发器之间的PCB走线、TVS管结电容都会影响信号边沿你量到的可能是“板级噪声”不是真实总线信号。量产节点测试我都是直接在收发器的CANH/CANL引脚上飞线出来测。3.2 手动测量法一把示波器推算采样点位置没有专用工具的时候手动测采样点也能获得有用结果。步骤如下首先配置被测节点为循环发送模式不断向总线发送固定报文。示波器差分通道接好CAN_H和CAN_L触发模式设为下降沿触发。CAN的显性位对应差分电压约2V隐性位约0V显性到隐性的跳变是下降沿用它触发能看到完整的位流。其次打开示波器的解码功能。直接用波形解出波特率让示波器自己识别位时间。如果示波器支持CAN解码它会用带色块的方格把一个一个位标出来采样点位置也能覆盖显示。这一步是验证你的物理层波形是否与协议层对齐的关键。第三测量显性位宽度。用光标卡住一个显性位前后的两个下降沿读出位时间。多抓几个位求平均降低抖动误差。将这个位时间乘以你的目标采样点百分比在波形的对应位置放一条光标线。观察这条线所在位置的波形是否平坦——如果光标落在边沿附近而不是稳定的高电平或低电平区域说明采样点裕量不足。最后再做一次极限测试。用示波器的“余辉”模式把波形叠加几百次观察边沿的抖动范围。如果抖动导致某个位的边沿漂移到了采样时刻附近这个系统的时序裕量基本告急。实测中边沿抖动超过位时间的10%就建议回查晶振质量和收发器驱动能力。3.3 专用工具测试法直接测出采样点的实际边界手动测只能看到“配置的采样点在哪里”测不出“实际能容忍采样点偏移多少”。真正有工程价值的是边界测试——也就是把接收端的采样点向左向右逼逼到出错为止那个临界点就是实际采样点位置的近似。用CANscope一类的工具做这个测试很直接。让被测节点正常收发测试工具作为总线上的干扰源发送一个相对于被测节点时钟有一定相位偏移的帧。偏移量从0开始逐步增大观察被测节点是否出现错误帧。错误出现的那一刻说明干扰边沿已经越过采样点的稳定窗口两者的差值就是采样点裕量。更系统的方法是先测发送节点再测接收节点。测发送节点时干扰工具充当接收方记录它对偏移的容忍能力测接收节点时干扰工具充当发送方给被测节点喂偏移帧记录它能正常接收的偏移范围。把两个方向的结果一拼就得到整个链路在采样点维度上的时序窗口。CAN FD做这个测试时仲裁段和数据段要分开测。有些工具支持在报文的仲裁段保持标准速率进数据段切换到不同位速率此时要针对数据段的采样点做专门的偏移注入不能拿仲裁段的结果代替。3.4 干扰注入与相位裕量测试贴近真实场景的试金石干扰注入测试比单纯看波形更贴近实际。市面上有CAN总线干扰设备比如CANstress这类能在正常报文里插入短至几十纳秒的毛刺或者把一个位的边沿往前、往后挪动特定的量。测试思路是这样的先让DUT与干扰工具正常通信建立稳定基线记录错误帧率。然后逐步加大干扰强度——把边沿往前挪1个TQ、2个TQ或者调整毛刺的宽度。每加一档观察DUT的错误计数器变化和丢帧情况。直到DUT出现错误帧或者恢复不了通信时当前干扰量减去典型干扰量就是它的采样点裕量。这个测试的价值在于示波器只能告诉你“静态的采样点设在哪里”干扰注入能告诉你“动态情况下系统还能不能扛住”。我做过一个很有意思的对比两块硬件设计几乎一样的板子一块采样点设75%干扰容限有±6个TQ另一块设85%看着更靠后但因为相位缓冲段2只有2个TQ为了同步跳变SJW被压缩得很小实际干扰容限只有±3个TQ。这说明好配置不是单一采样点数值决定的而是采样点、SJW、TSEG2三者的组合结果。判断合格的标准业界一般要求至少能容忍±2个TQ的偏移而不产生错误帧。如果项目对EMC要求高比如过ISO 11452-4大电流注入BCI测试建议放宽到±4个TQ否则实际跑测试时总会有一两个极端频率点触发错误帧。4. 常见通信问题与调试心得4.1 典型故障现象速查表调试现场遇到的大部分通信问题都能从现象反推原因。下面这张表是我整理的排查速查表故障现象可能原因排查方向单节点正常多节点联调丢帧采样点靠前边沿未稳定就采样或不同节点采样点偏差过大读各节点TSEG配置统一采样点错误计数器反复增减偶发Bus Off采样点靠后接近下一位边沿同步条件恶化缩短相位段2或后移采样点但保留足够SJW线缆加长后通信失败传播段预留不足线缆延迟吃掉稳定窗口按总线长度重算传播段增大TSEG1高温或低电压下偶发错误帧收发器延迟变化振荡器漂移增大采样裕量不足复测常温下边界留出温度余量上电后首帧就错误随后恢复同步段和SJW配合差初始同步能力弱增大SJW检查BRP配置FD通信仲裁段正常数据段乱码数据段采样点偏早或偏晚TQ数太少数据段单独配置85%附近采样点4.2 多节点混用场景下的采样点协调真实车载或工业总线网络几乎不会所有节点用同一颗芯片。不同MCU内部时钟精度不同不同收发器的延迟特性也不同甚至线束分支长度都不一致。这种混合场景下“每个节点独立最优”不如“全网协调一致”来得重要。比如A节点振荡器容差±0.3%B节点±0.2%收发器延迟差50ns线束长度差3m。各节点都按自身参数校到最优采样点彼此间反而可能错开太大导致任何一边同步时另一边跟不上。最稳妥的做法是全网按最差节点的参数统一配置。线缆最长的那个节点它的传播段需求就是全网基准收发器延迟最大的那个节点它的采样点边界就是全网边界。别让好节点迁就坏节点但也不能让坏节点拖垮全网取中庸偏保守的值牺牲一点点单点优化换来全网的稳定。我见过一个项目因为两个ECU用了不同批次的晶振初始偏差差了一倍低速CAN死活不出问题一上CAN FD数据段就丢帧。最后就是统一采样点、增大SJW解决。4.3 经验与避坑指南几条拿实测换来的心得测试时千万别用默认配置代表“调好了”。很多控制器上电复位后的TSEG1/TSEG2默认值只是为了芯片能自测并不是给真实总线用的。凡是出过问题的节点第一步就是读寄存器实际值而不是问“你配了多少”因为很多人答不上来。测采样点时不要只看单次波形。采样点的稳定性本质上是个统计问题连续抓一屏波形用余辉模式看边沿分布重复上百次触发确认采样点所在的区域始终是“干净”的。只看一两个位就下结论很容易漏掉偶发性抖动。还有个容易栽的坑三次采样模式。某些控制器提供单次采样和三次采样两种模式三次采样是对采样点前后各取一次再做多数表决目的是抗毛刺。听起来很美但它有个副作用相当于把实际采样时刻往后挪了几个TQ因为多数表决需要等待后两次采样数据。这会让有效采样点比你配置的值偏后。如果你在三次采样模式下把采样点配到85%实际等效可能接近87%甚至更高。设计时要把这个隐藏偏移算进去。最后说一个关于CAN FD数据段的经验数据段采样点往85%以上调直观上越靠后给信号稳定留的时间越长但别忘了相位缓冲段2还在采样点后面。如果TQ总数固定采样点越靠后PHASE_SEG2就越短接收节点能用来吸收下一拍边沿误差的空间就越小。这个矛盾没法两头占只能在中间找平衡。我试过的组合里总TQ数20、数据段采样点87.5%配SJW4综合表现最稳。当然每套系统芯片不同值也不一样但思路是一致的——代价均衡别走极端。采样点这东西看着是个寄存器参数实际上牵动的是物理层延迟、时钟精度、协议层重传机制一整条链路。算好它测准它车载网络里一半的偶发通信故障都能在台架上提前揪出来而不是等整车路试了才暴露。真到了路试阶段再来查采样点那才叫一个痛苦。
返回列表