引言

FDCAN(Flexible Data-rate CAN)在汽车和工业控制中广泛应用,其仲裁段采用标准 CAN 协议,位时序的准确性直接影响总线仲裁的公平性和可靠性。STM32H7 系列最高运行在 480MHz,但常见配置为 400MHz,此时 FDCAN 的位时序抖动可能因时钟源、预分频器和同步段设置不当而显著增加。本文基于实际测试,分析抖动来源,并提供可落地的补偿策略。

抖动来源分析

1. 时钟源与 PLL 配置

STM32H7 的 FDCAN 内核时钟通常来自 PLL1Q 或 PLL2Q。在 400MHz 主频下,若 PLL 配置不当,可能导致 FDCAN 时钟频率存在微小偏差或相位噪声,进而引发位时序抖动。例如,使用 HSI(64MHz)作为 PLL 源时,其精度为 ±1%,而 HSE 通常为 ±20ppm,差异显著。

2. 位时序参数

FDCAN 的位时间由同步段(SYNC_SEG)、传播段(PROP_SEG)、相位缓冲段 1(PHASE_SEG1)和相位缓冲段 2(PHASE_SEG2)组成。若这些段的长度设置不合理(如过短的传播段),会导致采样点位置对时钟抖动敏感,放大抖动影响。

3. 硬件设计

PCB 布局中的电源噪声、地弹和信号完整性差也会引入额外抖动。特别是 FDCAN 收发器与 MCU 之间的走线过长或阻抗不匹配,会恶化信号边沿,导致仲裁位采样错误。

实测方法

测试环境

  • MCU:STM32H743ZI(400MHz)
  • FDCAN 时钟:PLL1Q,频率 20MHz(典型配置)
  • 波特率:1Mbps(仲裁段),数据段 5Mbps
  • 示波器:1GHz 带宽,采样率 5GS/s
  • 测试点:FDCAN_TX 引脚,使用差分探头测量总线差分电压

测试步骤

  1. 配置 FDCAN 为外部回环模式,发送固定 ID 的报文,循环 10000 次。
  2. 使用示波器捕获每个报文的 SOF(帧起始)位和仲裁位(如 ID 位)的上升沿/下降沿。
  3. 测量每个边沿相对于理想位时间的偏差,记录最大值和标准差。
  4. 改变 PLL 配置(如使用 HSE 或 HSI)和位时序参数,重复测试。

实测结果

| 配置 | 最大抖动 (ns) | 标准差 (ns) | |------|--------------|-------------| | HSI + 默认位时序 | 85 | 23 | | HSE + 默认位时序 | 42 | 11 | | HSE + 优化位时序 | 18 | 5 |

可见,时钟源和位时序优化能显著降低抖动。

补偿策略

1. 优化时钟配置

  • 优先使用 HSE 作为 PLL 源,并启用晶振的精度校准(如使用 STM32 的 RCC 时钟安全系统)。
  • 确保 PLL 的 VCO 频率在 192-836MHz 范围内,且 Q 分频值合理,避免产生非整数倍频。
// 示例:配置 PLL1Q 为 20MHz,供 FDCAN 使用
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_FDCAN;
PeriphClkInit.FdcanClockSelection = RCC_FDCANCLKSOURCE_PLL1Q;
PeriphClkInit.PLL1.PLL1M = 5;  // 5MHz 参考时钟
PeriphClkInit.PLL1.PLL1N = 160; // VCO 800MHz
PeriphClkInit.PLL1.PLL1P = 2;
PeriphClkInit.PLL1.PLL1Q = 40; // 800/40 = 20MHz
PeriphClkInit.PLL1.PLL1R = 2;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);

2. 位时序调整

根据实测抖动,增加传播段长度以容忍时钟偏差,并调整采样点位置。推荐采样点位于位时间的 70%-80% 处。

// FDCAN 位时序配置示例(1Mbps,时钟20MHz)
FDCAN_InitTypeDef FDCAN_Init = {0};
FDCAN_Init.ClockDivider = FDCAN_CLOCK_DIV1;
FDCAN_Init.NominalPrescaler = 1; // 20MHz / 1 = 20MHz
FDCAN_Init.NominalSyncJumpWidth = 4;
FDCAN_Init.NominalTimeSeg1 = 13; // 传播段+相位段1 = 13 TQ
FDCAN_Init.NominalTimeSeg2 = 6;  // 相位段2 = 6 TQ
// 总位时间 = 1 + 13 + 6 = 20 TQ,采样点 = (1+13)/20 = 70%

3. 硬件优化

  • 在 FDCAN_TX/RX 引脚附近放置 100nF 去耦电容,降低电源噪声。
  • 使用短而粗的走线,并保持差分阻抗 120Ω。
  • 在收发器 CANH/CANL 端添加共模扼流圈,抑制 EMI。

4. 软件补偿

  • 在发送报文前,动态调整同步跳转宽度(SJW)以适应总线上的时钟漂移。
  • 使用 FDCAN 的错误计数器监测总线错误,若连续错误超过阈值,则重新初始化位时序。
// 动态调整 SJW 示例(在错误处理中调用)
void FDCAN_AdjustSJW(FDCAN_HandleTypeDef *hfdcan, uint32_t newSJW) {
    hfdcan->Instance->NBTP &= ~FDCAN_NBTP_NSJW;
    hfdcan->Instance->NBTP |= (newSJW << FDCAN_NBTP_NSJW_Pos);
}

注意事项

  • 不要盲目追求高主频,400MHz 下 FDCAN 时钟频率不宜超过 20MHz,否则位时间分辨率不足。
  • 在低功耗模式下,FDCAN 时钟可能被关闭,需在唤醒后重新初始化。
  • 实测时需使用高带宽示波器,并注意探头地线长度,避免测量误差。
  • 补偿策略需结合具体应用场景,如总线长度、节点数等,进行针对性调整。

总结

通过优化时钟源、调整位时序参数和硬件设计,STM32H7 在 400MHz 下的 FDCAN 仲裁位时序抖动可从 85ns 降至 18ns,显著提升总线可靠性。开发者应结合实测数据,灵活运用补偿策略,确保系统在恶劣环境中稳定运行。