拓冰建站拓冰建站
首页 / 资讯中心 / 正文

CAN/CAN FD采样点详解:位时间结构与工程配置实践

如果你调试过一条跑着几十个节点的CAN总线你一定遇到过这种场景示波器探头夹上去波形是漂亮的显隐性跳变位时间测量也看不到异常但节点一多或者温度一变错误帧、Bus Off就像约好了一样扎堆出现。我过去几年处理CAN/CAN FD通信问题最后追到采样点上的次数大概占了一半。这篇就说说采样点到底是什么、怎么算、怎么测以及我在实测中踩出来的坑。这篇文章适合刚接触CAN协议栈的嵌入式工程师、正在做CAN FD量产落地的电子工程师以及被偶发通信问题折磨的现场调试人员。我会尽量少讲玄学直接讲能用得上的东西。1. 位时间拆开看采样点到底采的是什么1.1 一个位时间不是一整块而是四段拼起来的很多人学CAN协议时只记住了“显性0、隐性1”一提到位时间就只当成波特率的倒数。实际上一个CAN位时间在控制器内部是被切成若干等份的这个基本单位叫时间量子Time Quantum简称tq。一个典型的位时间由四段组成同步段SYNC_SEG通常是固定的1个tq用来检测总线上从隐性到显性或者从显性到隐性的跳变沿完成节点间的硬同步或重同步。传播段PROP_SEG用来补偿信号在总线上的传播延迟以及收发器、线缆带来的延迟。相位缓冲段1PHASE_SEG1用来吸收前一个跳变沿带来的相位误差重同步时可以向后延长。相位缓冲段2PHASE_SEG2同样用于吸收相位误差重同步时可以向前缩短。在实际控制器的寄存器里通常不会把传播段和相位缓冲段1分开暴露而是把它们合并成一个字段叫TSEG1相位缓冲段2单独叫TSEG2。于是位时间的关系可以简化为位时间 (1 TSEG1 TSEG2) × tq这里的“1”就是同步段。用排队传话类比可能更好理解同步段是发令枪响的那一瞬间传播段是声音传到队尾需要的时间相位缓冲段1和2则是为了防止有人听错、传错而预留的缓冲空间。没有缓冲整条队伍稍微有人快了或者慢了话传到后面就乱了。1.2 采样点就是“拍照”的时间点接收器在每个位时间内只在一个固定时刻对总线电平做采样通过这次采样的结果判断当前位是0还是1。这个时刻就是采样点它在位时间结构中的位置刚好在相位缓冲段1和相位缓冲段2的交界处。换句话说采样点百分比等于同步段加上TSEG1所占整个位时间的比例。计算公式采样点百分比 (1 TSEG1) / (1 TSEG1 TSEG2) × 100%所以只要改TSEG1或者TSEG2采样点就会移动。采样点太靠前相当于刚听到前半句话就急着做判断采样点太靠后相当于听完一整句之后还要等下一步才开始反应。CAN控制器没有“连续采样取平均”这种功能它就是在那个瞬间做一次判断错了就错了。1.3 经典CAN和CAN FD一个采样点还是两个采样点经典CANCAN 2.0整帧报文只使用同一套位时间参数所以对普通CAN来说全帧只有一个采样点。但CAN FD不一样。CAN FD报文引入了BRS位波特率切换位。当BRS为隐性时通信速率会从仲裁段速率切换到数据段速率数据段传输结束后再切换回来。这意味着CAN FD控制器内部至少有两套位时间配置仲裁段一套数据段一套对应就有两个采样点。很多刚从CAN 2.0切到CAN FD的工程师容易在这上面翻车只修改了普通CAN场景下的位时间参数没注意到CAN FD还有一组数据段位时间参数。结果仲裁段通信看着正常数据段一到高速率就疯狂出错排查半天才发现数据段采样点根本不在推荐范围内。2. 采样点选偏了总线上会发生哪些奇奇怪怪的事2.1 为什么不能让大家都在100%处采样我见过有人问“既然越晚采样信号越稳定为什么不把采样点放到位时间最后面”这其实是把CAN当成普通串口在理解。CAN是异步通信节点之间没有共享时钟接收节点必须从总线跳变沿中不断恢复出位时间。采样点不能太靠后主要有两个原因。第一位时间末尾已经很接近下一位的跳变沿。如果采样点设在95%甚至更高一旦接收节点本地时钟比发送节点稍快或稍慢采样时刻可能已经滑到下一个位里去了。第二采样点位置决定了重同步的调整余量。采样点靠后意味着PHASE_SEG2很短重同步时能向前缩短的余量很小这时候对发送方的时钟偏差就会非常敏感。2.2 采样点太早采样点太晚分别会发生什么采样点太早最典型的问题是“总线信号还没稳定就开始判断”。这种情况在长线缆、多节点、低速网络中尤为明显。信号在线上传播需要时间如果传播延迟接近半个位时间接收节点实际看到的电平还在跳变过程中早采就容易采到错误的电平。采样点太晚典型表现是网络对晶振误差非常敏感。假设两个节点一个晶振偏快、一个偏慢长报文传输过程中每个位的误差会不断累积。采样点靠后时累积误差很快透支接收节点的重同步余量导致从某个位开始连续出错。事件发生后控制器会报位错误或者填充错误严重时直接进入Error Passive甚至Bus Off。实际工程里采样点设置不当引发的问题往往不是100%必现而是概率性出现。可能常温下跑几千帧才错一次一旦温度升高、晶振漂移或者线束被干扰错误率就突然上升。这是采样点问题最让人头疼的地方。2.3 工程中推荐的范围是怎么来的广泛采用的推荐值大致是这样的通信类型推荐采样点范围常见典型值经典CAN低速容错网络75% ~ 83%83%经典CAN高速CAN网络75% ~ 87.5%87.5%CAN FD 仲裁段75% ~ 87.5%80% ~ 85%CAN FD 数据段80% ~ 90%80% ~ 85%这个范围不是拍脑袋定的而是综合了振荡器容差、总线传播延迟、收发器延迟和抗干扰余量之后得出的经验区间。经典CAN里ISO 11898-1和CiA相关规范对位时间结构和测试方法有明确要求很多OEM也会在企业标准里规定自家采样点必须落在某个区间内。有一点需要强调具体项目的采样点应该以项目规范的推荐值为准不要只看芯片默认值。很多MCU默认配置只能保证“能通”但不保证“又好又稳”。3. 采样点的计算公式和寄存器配置落地3.1 一个公式打通所有控制器的采样点配置无论是经典CAN还是CAN FD无论芯片是瑞萨、NXP、ST还是英飞凌位时间寄存器最终都能抽象成三个关键量同步段固定1 tq、TSEG1、TSEG2。前面已经给出公式采样点百分比 (1 TSEG1) / (1 TSEG1 TSEG2) × 100%同时位时间长度等于位时间周期 (1 TSEG1 TSEG2) × tq 1 / 波特率所以配置步骤一定是先确认CAN外设时钟频率计算出一个位时间对应多少个tq再根据目标采样点反推TSEG1和TSEG2。不要上来就猜寄存器值。3.2 实例500 kbps经典CAN咱们手算一次假设某MCU的CAN外设时钟频率是80 MHz目标波特率500 kbps。位时间 1 / 500 kbps 2 μstq数量 80 MHz × 2 μs 160 tq同步段固定1 tq所以TSEG1 TSEG2 159如果目标采样点87.5%则需要1 TSEG1 160 × 87.5% 140所以TSEG1 139TSEG2 20实际采样点验证(1 139) / (1 139 20) × 100% 140 / 160 87.5%完美命中。同步跳转宽度SJW可以选1到4 tq一般选1到2足够除非总线网络特别大或者节点时钟误差很大才考虑加大。如果目标采样点80%那么1 TSEG1 160 × 80% 128所以TSEG1 127TSEG2 32实际采样点同样是刚好80%。这里有个实操技巧如果计算结果不是整数就取最接近的整数然后反算实际采样点百分比。误差在1%以内通常可接受但CAN FD高速段要更小心因为tq总数少差1个tq就会多出好几个百分点。3.3 CAN FD的两套采样点配置示例CAN FD配置要同时算仲裁段和数据段。还是假设CAN外设时钟80 MHz。仲裁段500 kbps和上面的经典CAN一样位时间160 tq。若仲裁采样点目标85%则1 TSEG1 160 × 85% 136所以TSEG1 135TSEG2 24数据段2 Mbps位时间 80 MHz / 2 Mbps 40 tq。若数据段采样点目标80%则1 TSEG1 40 × 80% 32所以TSEG1 31TSEG2 8这个配置能精确命中80%。但如果数据段是5 Mbps位时间就只有80 MHz / 5 Mbps 16 tq。目标80%时1 TSEG1 12.8不能整除。可选方案TSEG1 12TSEG2 3采样点 13 / 16 81.25%TSEG1 11TSEG2 4采样点 12 / 16 75%这时候就不是“想要多少就有多少”了只能做取舍。很多MCU在5 Mbps下只能在75%到81%左右选一个近似值。这就是为什么CAN FD高速率对外设时钟频率要求更高时钟越高数据段单个位时间包含的tq越多采样点能配置得越精细。3.4 配置工具里的坑DAVinci、TSMaster、CANoe里的采样点不少工程师用AUTOSAR的DAVinci配置CAN驱动或者用TSMaster、CANoe这些工具做调试。工具里往往直接显示“Sample Point”百分比看起来填个数字就行。但这里有几个坑。第一工具自动计算TS1/TS2时必须依赖“CAN外设时钟频率”这个前提。如果工程里配的时钟源和芯片实际启动的时钟不一致工具算出的寄存器值实际对应的采样点根本不是显示的那个数。我见过一个案例工具显示采样点87.5%实际抓出来的波形按寄存器反算是78%就是因为时钟源配错了。第二CAN FD要分别确认仲裁段和数据段。很多工具界面里有两个Tab或者两组位时间参数只改一组就保存数据段还是默认值。第三SJW同步跳转宽度不参与采样点公式但会影响重同步能力。建议SJW不要设成0至少设1 tq。对于波特率跨度大的网络SJW设置得太小会导致重同步跟不上。另外如果工具支持导出位时间寄存器配置表务必在测试前导出并保存到项目文档里。这样出了问题可以精确回溯到每一组TS1/TS2。4. 采样点测试到底测什么方法与工具链4.1 示波器能不能直接测出采样点先说结论很多现场工程师的第一反应是拿示波器去测采样点。这里直接说结论示波器测不出控制器内部的采样时刻。示波器能测的是物理总线上的电压波形、位时间、边沿位置、显性/隐性电平幅值。它能帮你确认这条总线上的信号质量是否达标能看到有没有振铃、反射、幅值不足但控制器内部到底是什么时候触发采样的片子外面看不到。所以正确的思路是示波器用来排除物理层问题采样点是否在合理范围要靠寄存器反算和带相位偏移的总线测试工具来确认。4.2 一致性测试中采样点测试的原理CAN一致性测试里有一项专门针对采样点原理上用黑盒方法做。测试设备作为发送方被测节点作为接收方。测试设备发送经过受控相位偏移的报文也就是把某个位或者某些位的跳变沿人为提前或者滞后一定的量。随着偏移量从小到大变化被测节点会从正确接收变成出现错误帧。找到“还能正确接收”和“开始出现错误帧”的临界偏移量就能反推出被测节点实际采样点的位置。举个例子如果测试设备把某个位的信号沿逐步向时间轴前方移动移动到某一点时被测节点开始采错位说明这个节点的采样点对“提前到达”的信号已经没有余量了。这个边界值就反映了采样点到底靠前还是靠后。再用同样的方式往时间轴后方推就能得到另一个边界。两个边界之间的区间就是被测节点的可接收相位范围区间中心就是实际采样点位置。这种测试方式很有工程价值因为它测的是整个接收链路的综合裕量包括收发器延迟、MCU内部延迟、引脚电容、线束长度等不只是寄存器里那个百分比。4.3 用CANoe/TSMaster做采样点扫描的实操思路如果你手头有CANoe或者TSMaster这类总线开发工具可以在台架上做采样点扫描。大致步骤是搭建测试环境把被测节点接到工具的总线通道上确保终端电阻匹配。在工程里配置好通信参数包括仲裁段波特率、数据段波特率、采样点初始值。启动工具的位时序测试或采样点扫描功能设置扫描步长通常按1%或2%逐步改变偏移量。工具发送测试报文统计每个偏移量下的ACK响应、错误帧、Bus Off状态。生成接收通过范围曲线观察上下边界。这类功能在不同工具里名字不太一样有的叫“Bit Timing Test”有的叫“Sampling Point Scan”。实际使用时要注意扫描结果会受到总线长度、环境温度、供电电压影响因此测试条件要固定。建议至少做常温常压和高温/低温各一轮确认裕量稳定。4.4 实测结果判读采样点落在哪个范围算合格拿到扫描结果后不要只看“能不能通信”要看通过范围的边界对称性。举一个典型例子上边界很窄说明信号提前太多就出错采样点整体偏晚。下边界很窄说明信号延迟太多就出错采样点整体偏早。上下边界不对称往往说明网络延迟补偿没到位或者采样点没有落在推荐区间中部。一般项目里可以按这样的口径判断测试项常见接收标准经典CAN采样点中心75% ~ 87.5%CAN FD数据段采样点中心80% ~ 90%可接收偏移范围至少覆盖±10%以上位时间同一网络内节点间采样点差异尽量控制在5%以内不同OEM可能有自己的企业标准具体以项目规格书为准。但无论如何如果数据段高速率下的通过范围缩到个位数百分比那就说明配置余量不足需要重新审视位时间参数和外设时钟频率。5. 一次CAN FD偶发通信异常的排查复盘5.1 现象数据速率2M时概率性错误帧速率降到1M消失之前遇到一个台架项目双节点CAN FD通信仲裁段500 kbps数据段2 Mbps总线长度约3米两端120Ω终端电阻都正常。测试时偶发Error Passive错误帧没有固定周期压力测试时出现概率明显增加。把数据段降到1 Mbps之后问题几乎不再出现。很明显问题集中在CAN FD高速数据段。5.2 排查链路从波形、终端电阻到采样点第一步先上示波器看2 Mbps数据段的波形。差分电平正常边沿没有明显台阶也没有看到严重振铃。单帧看过去完全没问题于是把怀疑目标转向协议层配置。接下来检查代码里CAN FD两套位时间参数。经过寄存器反算发现一个很意外的结果数据段采样点被配到了约71%仲裁段倒是85%看起来正常。为什么会有这么低的默认值因为工程里用的工具自动生成位时间配置时没有针对该芯片的时钟做优化填了个“能跑”的默认组合随后也没人肉眼复核。为了验证这个71%是不是偶发错误帧的主因我用工具做了相位偏移扫描。结果数据段的下边界余量非常小测试偏移稍微增加错误帧就开始冒出来。也就是说这个节点对“晚到一点点”的信号几乎没有任何容忍度只要温度或晶振漂移稍微影响相位立刻出错。5.3 调整和复测把数据段采样点从71%改到80%确认原因后重新计算了2 Mbps数据段的位时间参数把采样点调整到80%。具体过程就是前面章节里算过的那组数80 MHz外设时钟2 Mbps对应40 tqTSEG131TSEG28。改完寄存器重新编译烧录再跑压测连续24小时无错误帧。温度循环测试也通过了再也没有出现偶发Error Passive。复盘这个案例有几个值得记住的点第一默认配置能通信不代表配置正确第二CAN FD数据段位时间短采样点偏差1到2个tq就可能让整个通信裕量崩溃第三偶发错误帧出现时先反算采样点往往比盲目换线、换芯片更高效。6. 关于采样点我这几年的几个习惯6.1 新项目配置后的三条自查不管是用AUTOSAR工具还是手动写寄存器我都会在第一次上电通信之前做三件事。第一反算采样点。打开位时间寄存器配置用公式手动算一遍实际采样点百分比确认仲裁段和数据段都在推荐范围内。这一步五分钟就能完成但能省掉后面几天的排障时间。第二检查SJW。很多项目里SJW被设成0虽然不影响采样点计算但会让节点重同步能力变弱尤其在长线缆和变频网络中问题明显。我习惯至少设1 tq。第三统一全网位时间参数。一个CAN/CAN FD网络上不同节点的采样点不必完全相同但必须落在同一可接受交集里。如果甲节点87%乙节点75%这个网络对噪声和温漂的耐受能力会大打折扣。6.2 遇到偶发错误帧我优先做的五件事野外的车载网络出现偶发问题我一般按这个顺序排查统计错误帧类型看是位错误、填充错误还是CRC错误反算发端和收端的采样点配置检查示波器波形和终端电阻尝试用温度变化或线束位置变化重现故障最后用采样点扫描工具做实测定边界。很多时候折腾半天硬件最后发现就是某个节点数据段采样点不在合理范围内。采样点这个东西搞懂了就是一层窗户纸没搞懂就是玄学。希望这篇文章能让你少走我当年走过的弯路。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门