在汽车电子和工业控制领域,CAN FD协议正逐步取代传统CAN成为高速通信的主流选择。当工程师首次接触CAN FD时,最常遇到的困惑之一就是:为什么需要配置两个采样点?更令人头疼的是,数据场的第二采样点(SSP)配置不当往往导致难以排查的间歇性通信故障。本文将带您深入CAN FD的时序核心,揭示双采样点的设计哲学,并提供可直接应用于NXP S32K、Infineon AURIX等主流控制器的实操配置方案。
传统CAN总线最高支持1Mbps速率,其采样点配置相对简单——整个报文使用统一的位定时参数。但当CAN FD将数据场速率提升至8Mbps时,物理层面临三个关键挑战:
c复制// 传统CAN与CAN FD位时间对比(假设8MHz时钟,预分频=1)
#define CAN_BIT_TIME (8 + 4 + 3 + 3) // 同步段+传播段+相位缓冲段1+相位缓冲段2
#define CANFD_ARB_TIME (8 + 4 + 3 + 3) // 仲裁场保持传统CAN时序
#define CANFD_DATA_TIME (2 + 1 + 1 + 1) // 数据场高速模式精简时序
CAN FD报文被明确划分为两个物理特性迥异的部分:
| 字段 | 典型速率 | 主要矛盾 | 采样策略 |
|---|---|---|---|
| 仲裁场 | ≤1Mbps | 多节点竞争可靠性 | 保守型采样(70-80%) |
| 数据场 | ≤8Mbps | 时序余量极度紧张 | 激进型采样(50-60%) |
| CRC界定符 | 切换过渡段 | 速率切换时的稳定性 | 固定延迟补偿 |
实际案例:某车载网关模块在-40℃低温下出现数据场CRC错误,最终定位为仲裁场采样点(75%)与数据场采样点(55%)温差补偿策略不一致导致。
SSP的本质是带有时延补偿的二次验证机制,其工作流程如下:
关键提示:SSP只在发送节点启用,接收节点无需配置此参数。这也是为什么实验室测试时接收正常,但实际组网后出现零星错误帧的常见原因。
NXP的FlexCAN模块通过以下寄存器控制采样点参数:
c复制// 仲裁场位定时配置(CANFD_CTRL1)
#define CAN_CTRL1_PROPSEG(pos) ((0x7UL << pos) & 0x7UL) // 传播段
#define CAN_CTRL1_PSEG1(pos) ((0x7UL << pos) & 0x7UL) // 相位缓冲段1
#define CAN_CTRL1_PSEG2(pos) ((0x7UL << pos) & 0x7UL) // 相位缓冲段2
// 数据场位定时配置(CANFD_CBT)
#define CAN_CBT_EPROPSEG(pos) ((0x1FUL << pos) & 0x1FUL) // 扩展传播段
#define CAN_CBT_EPSEG1(pos) ((0x1FUL << pos) & 0x1FUL) // 扩展相位缓冲段1
#define CAN_CBT_EPSEG2(pos) ((0x1FUL << pos) & 0x1FUL) // 扩展相位缓冲段2
#define CAN_CBT_BTF (1UL << 31) // 位时序格式化使能
以500Kbps仲裁场+4Mbps数据场为例:
计算时间份额(Tq):
仲裁场位定时:
数据场位定时:
SSP延迟配置:
c复制// 实际配置代码示例
FlexCAN_EnterFreezeMode(CAN0); // 进入配置模式
// 配置仲裁场
CAN0->CTRL1 = CAN_CTRL1_PROPSEG(30) | CAN_CTRL1_PSEG1(30) | CAN_CTRL1_PSEG2(19);
// 配置数据场及SSP
CAN0->CBT = CAN_CBT_EPROPSEG(3) | CAN_CBT_EPSEG1(3) | CAN_CBT_EPSEG2(3) | CAN_CBT_BTF;
FlexCAN_ExitFreezeMode(CAN0); // 退出配置模式
AURIX系列的多通道CAN FD模块需要额外注意:
调试技巧:当发现CRC错误率随温度变化时,检查NTC温度传感器的采样是否正常接入到CANFD_TDC寄存器。
现象描述:BRS位从显性跳变到隐性后,前2-3个数据位出现位填充错误。
根本原因:仲裁场到数据场的过渡阶段,时钟同步需要至少2个位时间的调整期。
解决方案:
当网络中混用不同厂商的CAN FD控制器时,建议采用以下兼容性策略:
| 节点类型 | 仲裁场采样点 | 数据场采样点 | SSP补偿量 |
|---|---|---|---|
| 主控节点(NXP) | 75%-80% | 60%-65% | ≥2Tq |
| 传感器节点(Bosch) | 70%-75% | 55%-60% | ≥1Tq |
| 网关节点(Infineon) | 72%-78% | 58%-63% | ≥3Tq |
使用CAPL脚本实现采样点自动扫描:
python复制on start
{
// 初始化测试参数
canAckOff(); // 关闭自动应答
setBusSpeed(500000, 4000000); // 仲裁500K, 数据4M
byte data[8] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
// 采样点扫描范围
for(int sp = 50; sp <= 90; sp += 5)
{
setSamplePoint(sp); // 设置待测采样点
output("Testing Sample Point: %d%%", sp);
// 发送干扰测试帧
canTriggerAdd(0, 0x123, data, 8, sp, 5); // 在采样点±5%区间干扰
canTriggerStart();
delay(100);
canTriggerStop();
// 统计错误帧
if(testGetErrorCount() > 0)
{
output("Error detected at %d%%", sp);
break;
}
}
}
测试结果分析要点:
使用高速示波器(≥2GHz带宽)捕获数据场信号时,建议设置:
典型异常波形对策:
即将发布的CAN XL协议(支持10Mbps+)带来新的挑战:
前沿开发团队已开始尝试:
在最近一个量产项目中,这种方案将极端温度下的通信故障率降低了83%。