[驱动开发篇] Can通信进阶 --- CanFD 的三次采样

驱动开发篇] Can通信进阶 --- Can报文的三次采样

    • [一、CAN FD的采样次数](#一、CAN FD的采样次数)
      • [1.1. 标准规定](#1.1. 标准规定)
      • [1.2. 传统标准CAN采样](#1.2. 传统标准CAN采样)
      • [1.3. CAN FD的采样策略](#1.3. CAN FD的采样策略)
        • [1.3.1. 基础采样策略](#1.3.1. 基础采样策略)
      • [1.4. 配置位置](#1.4. 配置位置)
      • [1.5. 常见步骤](#1.5. 常见步骤)
    • [二、CAN FD与标准CAN在采样机制上的主要区别](#二、CAN FD与标准CAN在采样机制上的主要区别)
    • 三、使用建议
    • [四. 芯片厂商实现](#四. 芯片厂商实现)
      • [4.1. 实际市面情况](#4.1. 实际市面情况)
      • [4.2. 例子](#4.2. 例子)
        • [① Microchip MCP2517FD](#① Microchip MCP2517FD)
        • [② NXP S32K CAN FD](#② NXP S32K CAN FD)
        • [③ Infineon XMC4000 CAN FD](#③ Infineon XMC4000 CAN FD)
    • 五、总结对比表

一、CAN FD的采样次数

CAN数据通信中,采样次数(sample points/number of samples)通常指的是在位时间(bit time)内,CAN收发器对总线上电平取样的次数,以判断该位的值。两类协议之间的主要差异体现在采样机制和位时序的调整能力上。

1.1. 标准规定

  • CAN FD 协议本身 并没有强制要求必须支持三次采样。它只是允许三次采样作为一种选项存在于控制器设计中,主要是为了兼容老旧设备或改善某些特殊情况下的噪声容忍度。
  • **ISO 11898-1(CAN FD标准)**规定:
    • 必须支持单次采样
    • 三次采样是可选功能,标准并不要求所有芯片必须支持。

1.2. 传统标准CAN采样

  • 采样次数
    • 标准CAN(ISO 11898-1,也叫Classical CAN)只允许单点采样(single sampling)。
    • 即:在每一个位周期的采样点(sample point),收发器只对总线电平采样一次,用于判断该位是"显性"还是"隐性"。
  • 工作机制
    • 通过**重同步段(Re-Sync Segment)再同步(Resynchronization)**机制去提升通信稳定性。

1.3. CAN FD的采样策略

1.3.1. 基础采样策略
  • 采样次数

    • CAN FD由两类采样模式决定:
      1. 单点采样(Single Sampling):同标准CAN一样,在采样点取一次样。
      2. 三点采样(Triple Sampling):在某些实现(尤其用于抗干扰)或者特定配置下,CAN FD允许配置为三点采样。
  • 三点采样的机制(可选项,一般只在仲裁段低速通信才启用):

    • 在位时内选定的三个时间点各取一次样,然后采用"多数原则"判定该位的最终电平(即有两个以上为某状态则认为该位是该状态)。
    • 在**Data Phase(数据段)**高速部分,通常仍为单点采样,以减少时序复杂度和资源消耗。
  • 实现方式

    • 三点采样在高速阶段一般不用,因为对同步要求更高,只有在某些兼容性或特殊要求下可配置。
    • 当前主流CAN FD控制器大多数只在仲裁段支持三点采样。

传统 CAN/CAN FD 控制器在每个位时间内的特定采样点对总线取样一次。启用三次采样时,控制器会在靠近采样点前后各加一次,再在采样点取一次,也就是:

  • S1(采样点之前)
  • S2(采样点)
  • S3(采样点之后)

最终结果由多数原则决定(即至少两次一致则取该值),用来提升抗干扰能力。

1.4. 配置位置

  • 三次采样仅在仲裁段(Arbitration Phase)有效,数据段(Data Phase)通常不支持。
  • 配置项通常在控制器的相关寄存器中。

1.5. 常见步骤

  1. 进入CAN控制器初始化/休眠/配置模式
  2. 设置三次采样相关的寄存器或位
  3. 配置其他位时序参数(BSP、BRP、SJW、TSEG1、TSEG2等)。
  4. 退出配置模式,进入正常运行。

二、CAN FD与标准CAN在采样机制上的主要区别

  1. 采样次数的灵活性

    • 标准CAN :通常只能选择单点采样
    • CAN FD :可支持三点采样,但通常只有在仲裁段(Arbitration Phase)低速模式、需要兼容老模块时才用。
  2. 为什么有三点采样?

    • 三点采样在噪声较大、信号完整性较差场合(尤其长线、旧线束、物理层匹配不好时)可以提升抗干扰能力。
    • 但在高速数据传输(CAN FD数据段),三点采样会带来更大的时序复杂度,得不偿失,因此高速阶段通常关闭。

三、使用建议

  • 如果是全新设计,多采用单点采样,除非你遇到实际的信号质量问题或需兼容老旧节点,可以尝试三点采样。
  • CAN FD的最大优势体现在"数据段速率提升"而不是采样次数本身,但灵活的采样机制为工程师调试提供了更多选项。

四. 芯片厂商实现

4.1. 实际市面情况

  • 大部分主流CAN FD控制器(如NXP、Microchip、Infineon、TI等)
    • 默认或始终 采用单次采样 ,尤其是在数据段(Data Phase) ,几乎都是单采样,以保证高速与精度。
    • 对于仲裁段(Arbitration Phase),部分芯片可通过寄存器配置启用"三次采样",但并不是所有控制器计数器提供。
    • 有的芯片(如Microchip MCP2517FD,NXP S32K,TI TCAN系列等)三次采样仅作为可选项出现,在默认配置和大多数应用中不开启。

4.2. 例子

  • Microchip MCP2517FD:支持三次采样,但需通过配置寄存器显式打开;且只对仲裁段有效,不支持数据段三次采样。
  • Infineon XMC4000 系列:三次采样支持受限,也只用于兼容特殊要求。
  • NXP S32K 系列:文档明确指出仅在仲裁段、低速情况下可用。
  • 部分国产以及老旧CAN控制器:干脆不实现三次采样功能。
① Microchip MCP2517FD
  • 三次采样开关寄存器位为SAM,位于寄存器CxNBTCFG(Nominal Bit Time Configuration)。
  • 这个位只作用于仲裁时段(Nominal Bit Time)。
c 复制代码
// 伪代码示例(以MCP2517FD为例)
// 假定NBTCFG寄存器已定义,位0(SAM)为三次采样使能
CxNBTCFGbits.SAM = 1;      // 启用三采
// 其他时序参数配置同CAN基本位时序
② NXP S32K CAN FD
  • 三次采样由寄存器FDCTRL[SAMP]控制。
  • SAMP = 1 时为三次采样,SAMP = 0 为单次采样。
c 复制代码
CAN->FDCTRL |= CAN_FDCTRL_SAMP_MASK;   // 启用三采(SAMP=1)
③ Infineon XMC4000 CAN FD
  • 在Node Control Register(NPCR)的SUSEN(SAM)位控制;
  • 只有仲裁段有效,数据段不支持。
c 复制代码
XMC_CAN_NODE->NCR |= XMC_CAN_NCR_SAM_Msk;  // 启用三采

五、总结对比表

标准CAN CAN FD
采样次数 单点采样 默认单点采样,仲裁段可选三点采样
速率 最高1Mbps(典型) 仲裁段1Mbps,数据段最高8Mbps+
异常处理 冗余(重同步机制) 更灵活且可配置采样机制
推荐配置 通用单点 默认单点,特殊需求下三点采样

Q:三次采样(Triple Sampling)是否被所有支持CAN FD帧的芯片普遍支持?

三次采样并不是所有支持CAN FD帧的芯片的"标配"功能。它通常只在一些控制器或在仲裁段作为可选项支持。现实应用中,CAN FD 的高速数据段普遍采用单点采样。


相关推荐
cxr8283 天前
SPARC方法论在Claude Code基于规则驱动开发中的应用
人工智能·驱动开发·claude·智能体
sukalot3 天前
window显示驱动开发—显示适配器的子设备
驱动开发
Evan_ZGYF丶3 天前
【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?
linux·驱动开发·android14·rk3576
sukalot4 天前
window显示驱动开发—视频呈现网络简介
驱动开发
sukalot5 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
驱动开发
zwhSunday5 天前
Linux驱动开发(1)概念、环境与代码框架
linux·运维·驱动开发
sukalot5 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(三)
驱动开发
sukalot5 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(一)
驱动开发
cxr8287 天前
基于Claude Code的 规范驱动开发(SDD)指南
人工智能·hive·驱动开发·敏捷流程·智能体
zwhSunday7 天前
Linux驱动开发(2)进一步理解驱动
linux·驱动开发