好的,我们来详细解释一下如何在 Nuvoton M460 系列微控制器中使用 CAN FD 控制器的延迟补偿功能。
核心概念:
- 目的: 延迟补偿功能旨在补偿信号在 CAN 总线物理层(收发器芯片如 TJA146x/TJA104x 等 + PCB 走线 + 线缆 + 连接器等)上传播时产生的固定传播延迟。
- 问题: 在高速 CAN FD 通信中(尤其是数据段波特率很高时,如 2Mbps 或 5Mbps),信号的物理传播时间可能占到单个位时间的很大一部分。这个延迟会导致:
- 节点发送的信号到达其他节点的接收采样点位置发生偏移。
- 如果偏移过大,可能引起采样错误(错误采样到位的值),进而导致通信失败。
- 解决: 延迟补偿通过微调发送节点发送位的位置,使得信号在接收节点的采样点位置更接近理想状态。它本质上是将发送点提前了补偿的延迟时间。
- 何时需要:
- 总线长度较长: 物理延迟随着总线长度增加而增加。
- 数据段波特率非常高: 每个位的时间更短,相对延迟更大。
- 使用高延迟的 CAN 收发器。
- 节点观察到在高速数据段传输时通信不稳定或出现错误帧。
在 M460 CAN FD 控制器中的使用步骤:
M460 的 CAN FD 控制器(通常称为 MCAN)内置了延迟补偿功能。启用和使用它主要涉及配置两个关键寄存器位域:
配置 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 很重要。
配置 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 是为了让硬件知道我们预期的最终采样点位置。
启用延迟补偿:
- 配置好
TDCR(特别是 TDC 和 TDCO)和 DBTP 后,设置 TDCR.TDCO > 0 就是主要的启用操作。
- 如果计算的
TDCO 大于 0,在设置了 TDC 和 TDCO 后,功能即被启用。硬件在发送高速数据段时,会将发送时间提前 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
计算:
TDC = (16 TQ - Phase_Seg1) - 1 -> 假设计算结果是 8。
- 标称段
t_q_nom = 1 / (1e6 * 16) = 62.5ns/TQ。
TDCO = ceil(300ns / 62.5ns/TQ) = ceil(4.8) = 5 TQ。
- 检查
TDCO (5) < TDC (8) -> 条件满足。
- 配置
CANx_TDCR_b.TDC = 8, CANx_TDCR_b.TDCO = 5。
- 配置 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。
- 将调整后的
SSP=3 写入 CANx_DBTP_b.SSP[3:0]。
重要注意事项:
TDC 和 TDCO 的限制: TDCO 必须严格小于 TDC (TDCO < TDC),并且 TDC 必须小于 (Nominal Bit Time - 2)。否则补偿会被禁用。
- SSP 依赖: 延迟补偿功能强制依赖 SSP 模式。当
TDCO > 0 时,SSP 模式会自动激活。你必须正确配置 DBTP.SSP 值(确保 SSP <= Phase_Seg2 - 1 且 SSP > 0)以确保新的补偿后采样点有效。
- 物理延迟测量/估算: 精确测量或估算网络中的最大环路传播延迟 (
t_prop_max) 是获得最佳补偿效果的关键。这需要通过测试、示波器测量或经验公式估算。
- 数据段位时间: 如上例所示,为了容纳大的补偿值 (
TDCO),你可能需要牺牲一点数据段波特率的最大值(增加位时间的总 TQ 数)。
- 复杂性: 精确配置延迟补偿需要对 CAN 位时序和物理层有较深的理解。Nuvoton 的技术参考手册是最终权威指南。
- 验证: 在实际硬件上使用示波器分析 CAN 总线信号是验证延迟补偿是否按预期工作(发送点是否提前,接收点是否对齐)的最佳方法。同时测试通信的稳定性和正确性。
总结步骤:
- 确定必要性: 评估总线长度、波特率、是否遇到高速数据段问题。
- 计算物理延迟 (
t_prop_max): 测量或估算信号到最远节点并返回的时间。
- 配置标称段位时序 (
NBTP): 根据应用需求设置好仲裁段波特率。
- 计算
TDC:
TDC = (Nominal_Bit_Time_TQ - Nominal_Phase_Seg1_TQ) - 1。确保 TDC < (Nominal_Bit_Time_TQ - 2)。
- 计算
TDCO 初值:
TDCO_calc = ceil(t_prop_max / t_q_nom), 其中 t_q_nom = 1 / (Nominal_Baud_Rate * Nominal_Bit_Time_TQ)
- 检查和调整
TDCO:
设置 TDCO = min(TDCO_calc, TDC - 1) (确保 TDCO < TDC)。
- 配置数据段位时序 (
DBTP):
- 设置满足数据波特率需求的预分频和段长度。
- 关键: 计算
SSP = Data_Phase_Seg2_TQ - TDCO - 1。
- 验证: 必须
SSP >= 0!
- 如果
SSP < 0, 需要增加数据段位时间的总 TQ 数(可能需降低实际波特率或增加 DTSEG1、DTSEG2),然后重新计算 SSP 直到 SSP >= 0。
- 将计算得到的
SSP 写入 DBTP.SSP[3:0]。
- 写入寄存器:
- 将
TDC 和 TDCO 写入 CANx_TDCR (TDCR.EDTSP=1 通常也需要设置)。
- 将包含
SSP 的完整 DBTP 配置写入 CANx_DBTP。
- 测试和验证: 在实际总线条件下,使用示波器和工具(如收发器错误计数器、成功报文计数)验证通信的稳定性和补偿效果。
请务必参考 Nuvoton M460 系列的技术参考手册 (Technical Reference Manual - TRM) 中关于 CAN (MCAN) 模块的详细章节,特别是描述 TDCR 寄存器、DBTP 寄存器和 SSP/Limitation/TDC/TDCO 功能的部分。手册中可能有具体的公式、限制条件、寄存器布局和推荐值的示例。
好的,我们来详细解释一下如何在 Nuvoton M460 系列微控制器中使用 CAN FD 控制器的延迟补偿功能。
核心概念:
- 目的: 延迟补偿功能旨在补偿信号在 CAN 总线物理层(收发器芯片如 TJA146x/TJA104x 等 + PCB 走线 + 线缆 + 连接器等)上传播时产生的固定传播延迟。
- 问题: 在高速 CAN FD 通信中(尤其是数据段波特率很高时,如 2Mbps 或 5Mbps),信号的物理传播时间可能占到单个位时间的很大一部分。这个延迟会导致:
- 节点发送的信号到达其他节点的接收采样点位置发生偏移。
- 如果偏移过大,可能引起采样错误(错误采样到位的值),进而导致通信失败。
- 解决: 延迟补偿通过微调发送节点发送位的位置,使得信号在接收节点的采样点位置更接近理想状态。它本质上是将发送点提前了补偿的延迟时间。
- 何时需要:
- 总线长度较长: 物理延迟随着总线长度增加而增加。
- 数据段波特率非常高: 每个位的时间更短,相对延迟更大。
- 使用高延迟的 CAN 收发器。
- 节点观察到在高速数据段传输时通信不稳定或出现错误帧。
在 M460 CAN FD 控制器中的使用步骤:
M460 的 CAN FD 控制器(通常称为 MCAN)内置了延迟补偿功能。启用和使用它主要涉及配置两个关键寄存器位域:
配置 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 很重要。
配置 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 是为了让硬件知道我们预期的最终采样点位置。
启用延迟补偿:
- 配置好
TDCR(特别是 TDC 和 TDCO)和 DBTP 后,设置 TDCR.TDCO > 0 就是主要的启用操作。
- 如果计算的
TDCO 大于 0,在设置了 TDC 和 TDCO 后,功能即被启用。硬件在发送高速数据段时,会将发送时间提前 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
计算:
TDC = (16 TQ - Phase_Seg1) - 1 -> 假设计算结果是 8。
- 标称段
t_q_nom = 1 / (1e6 * 16) = 62.5ns/TQ。
TDCO = ceil(300ns / 62.5ns/TQ) = ceil(4.8) = 5 TQ。
- 检查
TDCO (5) < TDC (8) -> 条件满足。
- 配置
CANx_TDCR_b.TDC = 8, CANx_TDCR_b.TDCO = 5。
- 配置 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。
- 将调整后的
SSP=3 写入 CANx_DBTP_b.SSP[3:0]。
重要注意事项:
TDC 和 TDCO 的限制: TDCO 必须严格小于 TDC (TDCO < TDC),并且 TDC 必须小于 (Nominal Bit Time - 2)。否则补偿会被禁用。
- SSP 依赖: 延迟补偿功能强制依赖 SSP 模式。当
TDCO > 0 时,SSP 模式会自动激活。你必须正确配置 DBTP.SSP 值(确保 SSP <= Phase_Seg2 - 1 且 SSP > 0)以确保新的补偿后采样点有效。
- 物理延迟测量/估算: 精确测量或估算网络中的最大环路传播延迟 (
t_prop_max) 是获得最佳补偿效果的关键。这需要通过测试、示波器测量或经验公式估算。
- 数据段位时间: 如上例所示,为了容纳大的补偿值 (
TDCO),你可能需要牺牲一点数据段波特率的最大值(增加位时间的总 TQ 数)。
- 复杂性: 精确配置延迟补偿需要对 CAN 位时序和物理层有较深的理解。Nuvoton 的技术参考手册是最终权威指南。
- 验证: 在实际硬件上使用示波器分析 CAN 总线信号是验证延迟补偿是否按预期工作(发送点是否提前,接收点是否对齐)的最佳方法。同时测试通信的稳定性和正确性。
总结步骤:
- 确定必要性: 评估总线长度、波特率、是否遇到高速数据段问题。
- 计算物理延迟 (
t_prop_max): 测量或估算信号到最远节点并返回的时间。
- 配置标称段位时序 (
NBTP): 根据应用需求设置好仲裁段波特率。
- 计算
TDC:
TDC = (Nominal_Bit_Time_TQ - Nominal_Phase_Seg1_TQ) - 1。确保 TDC < (Nominal_Bit_Time_TQ - 2)。
- 计算
TDCO 初值:
TDCO_calc = ceil(t_prop_max / t_q_nom), 其中 t_q_nom = 1 / (Nominal_Baud_Rate * Nominal_Bit_Time_TQ)
- 检查和调整
TDCO:
设置 TDCO = min(TDCO_calc, TDC - 1) (确保 TDCO < TDC)。
- 配置数据段位时序 (
DBTP):
- 设置满足数据波特率需求的预分频和段长度。
- 关键: 计算
SSP = Data_Phase_Seg2_TQ - TDCO - 1。
- 验证: 必须
SSP >= 0!
- 如果
SSP < 0, 需要增加数据段位时间的总 TQ 数(可能需降低实际波特率或增加 DTSEG1、DTSEG2),然后重新计算 SSP 直到 SSP >= 0。
- 将计算得到的
SSP 写入 DBTP.SSP[3:0]。
- 写入寄存器:
- 将
TDC 和 TDCO 写入 CANx_TDCR (TDCR.EDTSP=1 通常也需要设置)。
- 将包含
SSP 的完整 DBTP 配置写入 CANx_DBTP。
- 测试和验证: 在实际总线条件下,使用示波器和工具(如收发器错误计数器、成功报文计数)验证通信的稳定性和补偿效果。
请务必参考 Nuvoton M460 系列的技术参考手册 (Technical Reference Manual - TRM) 中关于 CAN (MCAN) 模块的详细章节,特别是描述 TDCR 寄存器、DBTP 寄存器和 SSP/Limitation/TDC/TDCO 功能的部分。手册中可能有具体的公式、限制条件、寄存器布局和推荐值的示例。
举报