十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

深入解析CAN总线位周期:从时序原理到工程配置实战

深入解析CAN总线位周期:从时序原理到工程配置实战 1. 从“位”到“周期”理解CAN通信的基石如果你接触过汽车电子或者工业控制CAN总线这个词一定不陌生。它就像设备之间的“神经系统”负责传递各种控制指令和状态信息。但很多人包括一些刚开始接触的工程师往往把重点放在“报文ID是什么”、“数据域怎么解析”上却忽略了支撑这一切稳定运行的最底层、最核心的物理规则——位周期。这就像我们日常交流大家更关心对方说了什么话报文内容却很少去深究每个字发音的时长、音节间的间隔位周期。然而正是这些最基础的时序规则决定了通信是否可靠、会不会“听错”或“说错话”。尤其是在汽车这种对安全性和实时性要求极高的场景下一个配置不当的位周期轻则导致通信错误帧频发重则让整个ECU电子控制单元节点“掉线”也就是进入令人头疼的“Bus Off”状态。所以今天我们不谈高层的应用协议就扎扎实实地把CAN的位周期掰开揉碎了讲清楚。我会结合实际的配置经验和踩过的坑告诉你位周期到底是什么、由哪几部分组成、以及最关键的——如何根据你的晶振频率和期望的通信速率一步步计算出那些关键的参数。理解了这些你才能从“会用CAN”进阶到“懂CAN”在调试和排错时心里有底。2. 位周期的本质CAN总线上的“时间标尺”首先我们得建立一个基本概念CAN通信是一种异步串行通信。它没有像I2C或SPI那样的独立时钟线来同步收发双方。那么接收方如何知道发送方何时开始发送一个位、这个位是0还是1、又何时结束呢答案就是依靠双方预先约定好的、完全相同的位时间也就是位周期。你可以把位周期想象成一把精确的尺子但这把尺子量的不是长度而是时间。总线上所有的节点都必须使用同一把“时间尺”来度量每一个比特位。发送节点按照这个周期来驱动总线电平变化接收节点也按照同样的周期来采样总线状态。如果大家的“尺子”刻度不一致比如发送方认为1微秒发一个位接收方却用1.1微秒来采样那么采样点就可能对不准位的中间稳定区域采到电平跳变的边缘从而导致误判产生错误。一个标准的CAN位周期CAN 2.0 A/B并不是一个简单的时间片。为了应对信号在总线上的传播延迟、晶振频率的微小偏差以及信号边沿的抖动这个周期被精细地划分成了四个不重叠的段Segment。这种划分是CAN总线高可靠性的重要设计之一。2.1 位周期的四段式结构下图清晰地展示了一个完整位周期的构成一个位周期 (Nominal Bit Time) |----------------------------------------------------------| | 同步段 | 传播时间段 | 相位缓冲段1 | 相位缓冲段2 | | 1Tq | (Prop_Seg) | (Phase_Seg1) | (Phase_Seg2)| | | | | | | SYNC_SEG| PROP_SEG | PHASE_SEG1 | PHASE_SEG2 | |----------------------------------------------------------| ^ ^ ^ ^ ^ 采样点? 不这里是位起点 这里是真正的采样点 这里是再同步的补偿区间1. 同步段 (SYNC_SEG)时长固定为1个时间份额Time Quantum, Tq。作用这是位周期的起点期望的信号边沿从隐性位到显性位的下降沿或反之应该发生在这个段内。接收硬件利用这个边沿来实现与发送节点的硬同步将自己的位计时调整到与总线信号对齐。2. 传播时间段 (PROP_SEG)作用这是为了补偿信号在物理总线上传输所固有的延迟。信号从发送节点发出经过导线、连接器到达最远的接收节点是需要时间的。这个段就是为了容纳这个往返的传播延迟确保当信号在总线上稳定下来后才进行采样。经验之谈在低速或短距离网络中这个段可以设置得很短。但在高速或长距离例如几十米的CAN网络中必须根据实际物理长度计算并留足余量。如果设置过短可能采样时信号还未稳定导致错误。3. 相位缓冲段1 (PHASE_Seg1) 相位缓冲段2 (PHASE_Seg2)作用这两个段是位计时系统的核心调节器主要用于补偿节点间晶振的频率偏差晶振不可能100%精确通常有几十ppm的误差。它们共同定义了采样点的位置。采样点通常位于相位缓冲段1的末尾。这是接收节点读取总线电平并判定该位是0显性还是1隐性的时刻。采样点太靠前容易采到不稳定的信号太靠后则留给后续处理的时间不足。再同步如果在相位缓冲段1内检测到非预期的边沿由于晶振稍慢边沿来晚了则通过延长PHASE_Seg1来“等待”这个边沿这称为正相位误差补偿。如果在相位缓冲段2内检测到非预期的边沿由于晶振稍快边沿来早了则通过缩短PHASE_Seg2来“追赶”这称为负相位误差补偿。这个机制使得不同节点的内部时钟即使有微小差异也能长期保持同步。2.2 时间份额位周期的基本单位上面反复提到了TqTime Quantum它是位计时的最小分辨率。一个位周期的总长度以Tq计是各个段之和Nominal Bit Time (in Tq) 1 PROP_SEG PHASE_SEG1 PHASE_SEG2而一个Tq的实际时间长度则由微控制器的系统时钟APB时钟和CAN控制器的波特率预分频器Baud Rate Prescaler, BRP共同决定Tq (BRP) / (APB Clock Frequency)例如APB时钟为48MHzBRP设置为4那么Tq 4 / 48MHz 83.33 ns。 如果我们配置一个位周期为16个Tq那么实际的位时间就是16 * 83.33 ns 1.333 us对应的波特率就是1 / 1.333 us ≈ 750 kbps。理解Tq是进行参数计算的第一步。几乎所有MCU的CAN外设配置都围绕着如何选择合适的BRP和各个段的Tq数来展开。3. 核心参数计算与配置实战理论说完了我们来看怎么用。配置位周期的目标就两个1) 得到我们想要的通信波特率如500kbps2) 让采样点位于一个合理的位置通常推荐在75%-90%之间。3.1 计算步骤与参数选择原则假设我们使用STM32系列MCUAPB1时钟为36MHz目标波特率为500kbps。步骤一确定位时间总Tq数常见的总Tq数有8, 10, 12, 16, 20等。选择的原则是在满足采样点位置要求的前提下总Tq数越多时间分辨率越高配置越灵活抗抖动能力也越强。对于500kbps及以上的高速CAN通常选择16或20 Tq。这里我们以16 Tq为例。步骤二计算所需的Tq时间长度和目标BRP目标位时间 1 / 500kbps 2 µs。 每个Tq的时间 2 µs / 16 125 ns。 BRP Tq * APB1_CLK 125ns * 36MHz 4.5。 BRP必须是整数所以我们取整为4或5。若 BRP4 实际 Tq 4 / 36MHz ≈ 111.11 ns 实际位时间 16 * 111.11ns ≈ 1.778 µs 实际波特率 ≈ 562.5kbps (偏差较大)。若 BRP5 实际 Tq 5 / 36MHz ≈ 138.89 ns 实际位时间 16 * 138.89ns ≈ 2.222 µs 实际波特率 ≈ 450kbps (偏差较大)。看来36MHz时钟直接配500kbps不太理想。调整总Tq数为20再试 目标位时间 2 µs。 每个Tq的时间 2 µs / 20 100 ns。 BRP 100ns * 36MHz 3.6 取整为4。 实际 Tq 4 / 36MHz ≈ 111.11 ns 实际位时间 20 * 111.11ns ≈ 2.222 µs 实际波特率 ≈ 450kbps。结论36MHz的APB时钟很难精确配出500kbps。这就是为什么很多实际项目中MCU的时钟源如外部晶振和PLL配置需要仔细计算以使APB时钟频率恰好是目标波特率与一个合适整数BRP、整数总Tq数的乘积。例如将APB1时钟配置为48MHz则 BRP 4 Tq 4 / 48MHz 83.33 ns。 对于500kbps (2µs) 总Tq数 2µs / 83.33ns 24。 24不是标准推荐值可以调整BRP3 Tq62.5ns 总Tq数32 也可以。或者BRP6 Tq125ns 总Tq数16。显然16是更常见的选择。 实际位时间 16 * 125ns 2 µs 完美匹配500kbps。步骤三分配各段Tq数并确定采样点我们以48MHz APB1, BRP6, 总Tq16 目标采样点85%为例。 总位时间Tq数 1(SYNC) PROP_SEG PHASE_SEG1 PHASE_Seg2 16。 采样点位于 (1 PROP_SEG PHASE_SEG1) 的末尾。 采样点百分比 (1 PROP_SEG PHASE_SEG1) / 16 ≈ 85%。 因此 1 PROP_SEG PHASE_SEG1 ≈ 13.6 取整为14。 那么 PHASE_Seg2 16 - 14 2。 PROP_SEG 和 PHASE_SEG1 的分配需要权衡。CAN标准建议 PROP_SEG PHASE_SEG1 ≥ PHASE_Seg2。同时PROP_SEG应能覆盖物理延迟。假设我们网络很短分配 PROP_SEG 5 则 PHASE_SEG1 14 - 1 - 5 8。 最终配置 SYNC_SEG1, PROP_SEG5, PHASE_SEG18, PHASE_Seg22。 采样点位于第14个Tq末尾占比87.5%。3.2 不同MCU平台的配置差异虽然位周期的原理通用但不同厂商的CAN控制器寄存器命名和配置方式有差异STM32 (bxCAN / FDCAN) 通过CAN_BTR寄存器配置。BRP,TS1(对应PHASE_SEG1),TS2(对应PHASE_Seg2)SJW(同步跳转宽度)。PROP_SEG通常包含在TS1中。配置时直接设置TS1和TS2的Tq数。NXP (S32K, LPC) 寄存器可能直接命名为PROPSEG,PSEG1,PSEG2,RJWM。概念上与标准一一对应。TI (C2000) 在CANBTC寄存器中配置TSEG1(PROP_SEGPHASE_SEG1),TSEG2(PHASE_Seg2),BRP。关键点在查阅数据手册和编写驱动时一定要弄清你用的芯片其“时间段1”到底指的是PROP_SEG PHASE_SEG1还是仅指PHASE_SEG1。这是最常见的配置错误来源之一。4. 采样点优化与网络稳定性采样点的位置不是随便定的它直接影响通信的鲁棒性。采样点过早70%此时信号可能尚未完全稳定振铃未平息容易采样到错误的电平尤其在网络负载重、边沿累积抖动时。采样点过晚95%留给控制器处理当前位、准备下一个位的时间非常紧张容易因处理不及时而出错。同时对后续的再同步也不利。推荐范围高速CAN (500kbps) 通常设置在75% - 90%之间。汽车行业常用80%-90%。例如CiACAN in Automation推荐500kbps时采样点在87.5%左右1Mbps时在85%左右。低速CAN (125kbps及以下) 由于位时间长容错能力强采样点可以稍晚一些但一般也不建议超过90%。如何优化理论计算如上节所示根据时钟和波特率先计算出一个初始值。实际测试这是最关键的一步。使用CAN分析仪如PCAN, ZLG, Vector等连接网络。发送压力测试让节点持续发送高优先级报文用分析仪监控错误帧特别是位错误、格式错误。调整与观察微调PHASE_SEG1或TSEG1的值改变采样点。观察在相同压力下哪种配置出现的错误帧最少甚至为零。那个点就是针对你这个特定硬件和网络的最佳采样点。注意同一个网络中所有节点的波特率和采样点必须配置为完全一致。即使波特率相同采样点相差太大也会导致同步困难产生间歇性错误。5. 同步机制与容错设计位周期中的同步段和相位缓冲段共同构成了CAN强大的同步与容错机制。5.1 硬同步与再同步硬同步只在帧开始的“帧起始”SOF隐性到显性的下降沿发生。接收节点会立即将自己的位定时计数器复位从SYNC_SEG重新开始当前位周期。这确保了每一帧的开始所有节点都站在同一起跑线上。再同步在帧传输过程中如果接收节点在非预期的地方即不在SYNC_SEG内检测到一个边沿就会触发再同步。根据边沿出现在PHASE_SEG1还是PHASE_Seg2来延长或缩短当前位周期进行补偿。这就像跑步过程中不断微调步伐以跟上领跑者。5.2 同步跳转宽度这里引入另一个关键参数同步跳转宽度。它定义了在一次再同步中相位缓冲段可以被延长或缩短的最大Tq数。SJW通常设置为1到4个Tq且必须满足SJW ≤ min(PHASE_SEG1, PHASE_Seg2)。SJW设置过小如果节点间晶振偏差较大一次再同步的补偿量可能不足以纠正相位误差误差会累积最终导致采样点漂移出安全窗口而产生错误。SJW设置过大虽然纠偏能力强但过大的跳转会扭曲位时序可能干扰正常的位采样。一般设置为2或3是常见选择。配置建议在满足不等式的前提下对于晶振精度较差如±100ppm或环境恶劣的应用可以适当选择较大的SJW如3或4以增强容错能力。6. CAN FD中的位周期演进传统的CAN2.0波特率最高1Mbps。为了满足更高的数据吞吐需求CAN FD应运而生。CAN FD的位周期有一个革命性的变化可变速率。一帧CAN FD报文分为两部分仲裁段采用标准的、相对较低的波特率如500kbps确保与经典CAN节点的后向兼容性和可靠的仲裁机制。数据段在仲裁完成后切换到更高的波特率如2Mbps, 5Mbps甚至更高来传输数据域和CRC等部分从而大幅提升有效数据速率。这就意味着在CAN FD节点中需要配置两套独立的位定时参数一套用于仲裁阶段一套用于数据阶段。数据阶段的位周期配置原理与经典CAN相同但因其速率高对时序的要求更为严苛Tq更短需要更高的系统时钟或更小的BRP。传播延迟影响更大高速下信号传输延迟占位时间的比例增大需要更精确地计算或缩小PROP_SEG。采样点通常更靠前为了给信号处理留出足够时间数据段的采样点常设置在70%-80%之间。配置CAN FD时必须确保控制器硬件支持FD模式并仔细计算和测试两套波特率参数任何一套配置不当都会导致通信失败。7. 调试排错位周期相关的典型问题在实际开发中很多CAN通信问题都源于位定时配置不当。问题一频繁出现“位错误”或“格式错误”可能原因采样点位置不合理太靠前或太靠后或者节点间波特率/采样点不一致。排查步骤使用高精度示波器或专业的CAN总线分析仪测量实际总线上的位时间验证是否与配置值相符。检查网络中所有节点的配置代码确认波特率、采样点参数各段Tq数完全一致。尝试逐步微调采样点通过改变PHASE_SEG1观察错误是否减少。问题二通信距离变短或节点增多后不稳定可能原因PROP_SEG设置过短未能覆盖信号在最远节点间的往返延迟。排查步骤估算网络最大长度。信号在双绞线中的传播速度约为光速的2/3即~5ns/米。计算最远两个节点间信号往返的延迟时间。将延迟时间换算成Tq数确保PROP_SEG ≥ 2 * (总线传输延迟 收发器延迟)。通常需要留出2-3个Tq的余量。如果总Tq数已固定且PROP_SEG无法增加可以考虑适当降低波特率以增加位时间从而在物理上容纳更长的延迟。问题三特定节点容易进入“Bus Off”状态可能原因该节点的本地时钟晶振偏差过大长期无法通过再同步跟上网络节奏导致错误计数器累积至Bus Off阈值。排查步骤检查该节点晶振的精度是否满足CAN通信要求通常至少±40ppm以内高速时要求更高。适当增大SJW值给予其更强的同步补偿能力。如果问题依旧可能需要更换精度更高的晶振。一个实用的调试技巧在项目初期如果对硬件延迟不确定可以先将采样点设置在一个比较保守的、靠后的位置例如90%优先保证通信连通。然后在稳定通信的基础上逐步将采样点前移例如每次移动5%同时进行压力测试如长时间满负荷发送找到错误率开始上升的临界点然后回退到一个安全的位置临界点之前几个百分点。这样找到的采样点是针对你当前硬件布局的最优解。理解并正确配置CAN的位周期是构建稳定可靠CAN网络的基础。它不像编写应用层协议那样有直接的“功能感”但却是所有“功能”得以实现的无声基石。下次当你配置CAN参数时不妨多花几分钟思考一下这些数字背后的物理意义这能帮助你在遇到棘手的通信问题时更快地定位到根源。
返回列表