新唐MCU技术
直播中

杨帆

8年用户 1472经验值
私信 关注
[问答]

如何使用 M460 CAN FD 收发器延迟补偿功能?


  • 如何使用 M460 CAN FD 收发器延迟补偿功能

回帖(1)

卞轮辉

2025-8-21 18:25:21

好的,我们来详细解释一下如何在 Nuvoton M460 系列微控制器中使用 CAN FD 控制器的延迟补偿功能。


核心概念:



  1. 目的: 延迟补偿功能旨在补偿信号在 CAN 总线物理层(收发器芯片如 TJA146x/TJA104x 等 + PCB 走线 + 线缆 + 连接器等)上传播时产生的固定传播延迟

  2. 问题: 在高速 CAN FD 通信中(尤其是数据段波特率很高时,如 2Mbps 或 5Mbps),信号的物理传播时间可能占到单个位时间的很大一部分。这个延迟会导致:

    • 节点发送的信号到达其他节点的接收采样点位置发生偏移。

    • 如果偏移过大,可能引起采样错误(错误采样到位的值),进而导致通信失败。


  3. 解决: 延迟补偿通过微调发送节点发送位的位置,使得信号在接收节点的采样点位置更接近理想状态。它本质上是将发送点提前了补偿的延迟时间。

  4. 何时需要:

    • 总线长度较长: 物理延迟随着总线长度增加而增加。

    • 数据段波特率非常高: 每个位的时间更短,相对延迟更大。

    • 使用高延迟的 CAN 收发器。

    • 节点观察到在高速数据段传输时通信不稳定或出现错误帧。



在 M460 CAN FD 控制器中的使用步骤:


M460 的 CAN FD 控制器(通常称为 MCAN)内置了延迟补偿功能。启用和使用它主要涉及配置两个关键寄存器位域:




  1. 配置 TDCR(Timing Delay Compensation Register):



    • TDC(Timing Delay Compensation): 这是最重要的位域之一。

      • CANx_TDCR_b.TDC[6:0]: 这 7 个位定义了延迟补偿位置。它指定了补偿值 (TDCO) 被插入的点在采样点之前多少个时间份额 (TQ)

      • 设置 TDC = (Nominal Bit Time - Phase_Seg1) - 1

      • Nominal Bit Time: 标称位段(仲裁段)的时间份额总数 (TQ)。

      • Phase_Seg1: 标称位段的 Phase_Seg1 时间份额数。

      • 重要限制: TDC 的值必须小于 Nominal Bit Time - 2。否则延迟补偿可能不会正常工作或会被禁用。


    • TDCO(Timing Delay Compensation Offset):

      • CANx_TDCR_b.TDCO[6:0]: 这 7 个位定义了实际要补偿的时间份额数量 (TQ)。这就是需要提前发送的量。

      • 需要根据你的网络物理延迟来计算:

        • 测量或估算信号从你节点到最远节点并返回所需的总传播时间 (t_prop_max)。

        • 根据当前标称波特率 (Nominal Baud Rate) 计算单个 TQ 的持续时间 (t_q_nom)。t_q_nom = 1 / (Nominal Baud Rate * TQ per Bit)

        • TDCO = ceil(t_prop_max / t_q_nom)


      • 重要限制: TDCO 的值必须小于 TDC 的值。如果软件设置的 TDCO >= TDC,控制器会自动将 TDCO 设为零(即禁用延迟补偿)。


    • EDTSP (Enable Data Timing Synchronization and Prescaler):

      • CANx_TDCR_b.EDTSP: 通常需要置为 1。这样控制器会在高速数据段使用来自标称波特率预分频器 (NBTP) 的 PBRP 值来计算数据段的 TQ 时间。这对于后续计算 TDCO 很重要。





  2. 配置 DBTP (Data Bit Timing and Prescaler):



    • SSP(Secondary Sample Point):

      • CANx_DBTP_b.SSP[3:0]: 定义一个相对于数据段位结束点的早期采样点。

      • 关键点: 必须将 SSP 配置为位于 Phase_Seg2 内部

      • 公式: SSP = Phase_Seg2 - TDCO - 1

      • 实际上,当启用延迟补偿 (TDCO > 0) 时,硬件会自动强制启用 SSP 模式,并使用 SSP 值作为补偿后在接收点的有效采样点位置。我们配置 SSP 是为了让硬件知道我们预期的最终采样点位置。





  3. 启用延迟补偿:



    • 配置好 TDCR(特别是 TDCTDCO)和 DBTP 后,设置 TDCR.TDCO > 0 就是主要的启用操作。

    • 如果计算的 TDCO 大于 0,在设置了 TDCTDCO 后,功能即被启用。硬件在发送高速数据段时,会将发送时间提前 TDCO 个 TQ。




使用示例概要(简化):


假设:



  • 标称波特率: 1 Mbps

  • Nominal Bit Time = 16 TQ (NSJW=1, NBRP=1, NTSEG1=10, NTSEG2=3 -> Phase_Seg1 ≈ 7? 需根据实际配置精确计算)

  • 物理环路延迟:估算为 300 ns

  • Data 段波特率: 5 Mbps


计算:



  1. TDC = (16 TQ - Phase_Seg1) - 1 -> 假设计算结果是 8。

  2. 标称段 t_q_nom = 1 / (1e6 * 16) = 62.5ns/TQ

  3. TDCO = ceil(300ns / 62.5ns/TQ) = ceil(4.8) = 5 TQ

  4. 检查 TDCO (5) < TDC (8) -> 条件满足。

  5. 配置 CANx_TDCR_b.TDC = 8, CANx_TDCR_b.TDCO = 5

  6. 配置 DBTP:

    • 确保数据段位时间足够长(例如,数据段设置为 10 Mbps 的位时间太短就不行了,需要降低实际波特率或增加位时间 TQ)。

    • 计算 SSP。例如,数据段位时间为 10 TQ (DSJW=1, DBRP=0, DTSEG1=7, DTSEG2=2 -> Phase_Seg2 = ? 可能是 2)。SSP = Phase_Seg2 - TDCO - 1 = 2 - 5 - 1 = -4 -> 无效!说明在当前数据段位时间配置下补偿 5 TQ 是不可能的。

    • 解决: 为了补偿足够的时间,需要增加数据段的位时间

      • 增加 DBRP -> 降低实际波特率(不太理想)。

      • 增加 DTSEG1 和/或 DTSEG2 -> 增加位时间。

      • 例如,将数据段位时间增大到 15 TQ (DTSEG1=10, DTSEG2=4, Phase_Seg2=4?)。

      • 重新计算 SSP = 4 - 5 - 1 = -2 -> 仍然无效!需要更大的位时间!

      • 继续尝试,直到 SSP >= 0。比如位时间 20 TQ (Phase_Seg2=9), SSP=9-5-1=3



  7. 将调整后的 SSP=3 写入 CANx_DBTP_b.SSP[3:0]


重要注意事项:



  1. TDCTDCO 的限制: TDCO 必须严格小于 TDC (TDCO < TDC),并且 TDC 必须小于 (Nominal Bit Time - 2)。否则补偿会被禁用。

  2. SSP 依赖: 延迟补偿功能强制依赖 SSP 模式。当 TDCO > 0 时,SSP 模式会自动激活。你必须正确配置 DBTP.SSP 值(确保 SSP <= Phase_Seg2 - 1SSP > 0)以确保新的补偿后采样点有效。

  3. 物理延迟测量/估算: 精确测量或估算网络中的最大环路传播延迟 (t_prop_max) 是获得最佳补偿效果的关键。这需要通过测试、示波器测量或经验公式估算。

  4. 数据段位时间: 如上例所示,为了容纳大的补偿值 (TDCO),你可能需要牺牲一点数据段波特率的最大值(增加位时间的总 TQ 数)。

  5. 复杂性: 精确配置延迟补偿需要对 CAN 位时序和物理层有较深的理解。Nuvoton 的技术参考手册是最终权威指南。

  6. 验证: 在实际硬件上使用示波器分析 CAN 总线信号是验证延迟补偿是否按预期工作(发送点是否提前,接收点是否对齐)的最佳方法。同时测试通信的稳定性和正确性。


总结步骤:



  1. 确定必要性: 评估总线长度、波特率、是否遇到高速数据段问题。

  2. 计算物理延迟 (t_prop_max): 测量或估算信号到最远节点并返回的时间。

  3. 配置标称段位时序 (NBTP): 根据应用需求设置好仲裁段波特率。

  4. 计算 TDC:
    TDC = (Nominal_Bit_Time_TQ - Nominal_Phase_Seg1_TQ) - 1。确保 TDC < (Nominal_Bit_Time_TQ - 2)

  5. 计算 TDCO 初值:
    TDCO_calc = ceil(t_prop_max / t_q_nom), 其中 t_q_nom = 1 / (Nominal_Baud_Rate * Nominal_Bit_Time_TQ)

  6. 检查和调整 TDCO:
    设置 TDCO = min(TDCO_calc, TDC - 1) (确保 TDCO < TDC)。

  7. 配置数据段位时序 (DBTP):

    • 设置满足数据波特率需求的预分频和段长度。

    • 关键: 计算 SSP = Data_Phase_Seg2_TQ - TDCO - 1

    • 验证: 必须 SSP >= 0

    • 如果 SSP < 0, 需要增加数据段位时间的总 TQ 数(可能需降低实际波特率或增加 DTSEG1DTSEG2),然后重新计算 SSP 直到 SSP >= 0

    • 将计算得到的 SSP 写入 DBTP.SSP[3:0]


  8. 写入寄存器:

    • TDCTDCO 写入 CANx_TDCR (TDCR.EDTSP=1 通常也需要设置)。

    • 将包含 SSP 的完整 DBTP 配置写入 CANx_DBTP


  9. 测试和验证: 在实际总线条件下,使用示波器和工具(如收发器错误计数器、成功报文计数)验证通信的稳定性和补偿效果。


请务必参考 Nuvoton M460 系列的技术参考手册 (Technical Reference Manual - TRM) 中关于 CAN (MCAN) 模块的详细章节,特别是描述 TDCR 寄存器、DBTP 寄存器和 SSP/Limitation/TDC/TDCO 功能的部分。手册中可能有具体的公式、限制条件、寄存器布局和推荐值的示例。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分