4. CAN FD协议基础:经典CAN vs CAN FD、数据场长度、波特率、位时序、CAN FD帧格式
CAN FD(Controller Area Network Flexible Data-Rate)是经典CAN 2.0协议的扩展,由Bosch在2012年发布,旨在突破经典CAN在带宽和有效载荷上的瓶颈。在NXP S32K3平台上,CAN FD与DMA的结合是实现高吞吐、低延迟通信的关键。本节从协议层面剖析CAN FD的核心差异与帧结构。
4.1 经典CAN vs CAN FD:核心差异对比
经典CAN(CAN 2.0A/B)与CAN FD在数据场长度、波特率、帧格式和错误处理上存在显著差异。下表从工程应用角度进行对比:
| 对比维度 | 经典CAN (CAN 2.0) | CAN FD |
|---|---|---|
| 数据场长度 | 固定 8 字节 | 可变 0~64 字节 |
| 波特率 | 单一固定波特率(如 500 kbps) | 双波特率:仲裁段(≤1 Mbps)+ 数据段(≤8 Mbps) |
| 帧格式 | 标准帧(11位ID)或扩展帧(29位ID) | 兼容经典帧格式,新增FDF/BRS/ESI位 |
| 位填充 | 从SOF到CRC结束,每5个相同位插入1个反相位 | 数据段采用更高效的填充规则(≤5个相同位后插入) |
| CRC校验 | 15位CRC(多项式 x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1) | 17位CRC(数据场≤16字节)或21位CRC(数据场>16字节) |
| 向后兼容 | — | CAN FD节点可与经典CAN节点共存于同一网络(仲裁段波特率一致) |
工程提示:在S32K3上移植CAN FD驱动时,必须确保总线上的所有节点在仲裁段使用相同的波特率。如果网络中存在经典CAN节点,CAN FD节点发送FD帧时,经典CAN节点会触发错误帧。因此,混合网络中需通过配置FDF位为0来发送经典CAN帧。
4.2 数据场长度与DMA传输优势
经典CAN的8字节数据场在传输大型诊断数据(如UDS 0x22/0x2E服务)或固件升级时,需要拆分为多个帧,导致协议开销大、延迟高。CAN FD将数据场扩展至64字节,显著提升了单帧有效载荷。
数据场长度与DLC(Data Length Code)的映射关系如下:
| DLC (4位) | 经典CAN 数据字节数 | CAN FD 数据字节数 |
|---|---|---|
| 0~8 | 0~8 | 0~8 |
| 9 | 8 | 12 |
| 10 | 8 | 16 |
| 11 | 8 | 20 |
| 12 | 8 | 24 |
| 13 | 8 | 32 |
| 14 | 8 | 48 |
| 15 | 8 | 64 |
DMA传输适配:64字节的数据场非常适合与S32K3的eDMA(增强型直接存储器访问)引擎配合。在CAN FD接收中断中,只需触发一次DMA传输,即可将64字节数据从CAN RAM搬移到用户缓冲区,CPU占用率相比经典CAN的8字节多次中断降低约87.5%。
4.3 波特率与位时序
CAN FD采用双波特率机制:仲裁段(从SOF到BRS位之前)使用标准CAN波特率(通常为500 kbps或1 Mbps),保证与经典CAN节点兼容;数据段(从BRS位之后到CRC结束)使用高速波特率(最高8 Mbps),提升数据传输速率。
位时序由以下参数构成:
- Sync_Seg(同步段):固定为1个时间量子(Tq),用于同步总线上的节点。
- Prop_Seg(传播段):补偿物理延迟(总线长度、收发器延迟),可编程1~8 Tq。
- Phase_Seg1(相位段1):用于补偿边沿相位误差,可编程1~8 Tq。
- Phase_Seg2(相位段2):用于补偿边沿相位误差,可编程1~8 Tq。
- SJW(同步跳转宽度):决定重同步时相位段可调整的最大Tq数,通常为1~4 Tq。
波特率计算公式:
Bit_Rate = F_CLK / (Prescaler × (Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2))
其中:
- F_CLK:CAN模块时钟频率(S32K3中通常为80 MHz或40 MHz)
- Prescaler:预分频器(1~256)
- 总Tq数 = Sync_Seg + Prop_Seg + Phase_Seg1 + Phase_Seg2(通常为8~25 Tq)
配置陷阱:在S32K3的FlexCAN模块中,CAN FD数据段的位时序必须独立配置。如果仲裁段波特率为500 kbps(总Tq=16),数据段波特率设为2 Mbps时,数据段的总Tq数必须相应减少(例如从16 Tq减为4 Tq),否则采样点位置会偏移,导致位错误。
4.4 CAN FD帧格式详解
CAN FD帧在经典CAN帧的基础上增加了三个控制位:FDF(FD格式指示位)、BRS(波特率切换位)和ESI(错误状态指示位)。下图展示了CAN FD数据帧的完整结构:
4.5 CAN FD帧类型与位填充规则
CAN FD定义了四种帧类型:
- 数据帧:携带数据场,用于节点间数据传输。FDF位=1标识为FD帧。
- 远程帧:请求数据,数据场为空。CAN FD中远程帧的DLC必须≤8,且FDF位=0(保持经典格式)。
- 错误帧:由检测到错误的节点主动发送,由6个显性位(主动错误)或6个隐性位(被动错误)组成。
- 过载帧:用于在数据帧或远程帧之间插入延迟,由6个显性位组成。
位填充规则在CAN FD中有所优化:
经典CAN位填充:
- 范围:从SOF到CRC结束
- 规则:每连续5个相同位后,插入1个反相位
- 填充位计入CRC计算
CAN FD位填充:
- 仲裁段:与经典CAN相同(从SOF到BRS位)
- 数据段:从BRS位之后到CRC结束,采用固定填充规则
- 每连续5个相同位后,插入1个反相位
- 填充位不参与CRC计算(CRC使用填充位计数校验)
- 优势:减少填充位数量,提升数据段有效吞吐量
4.6 S32K3 FlexCAN模块的CAN FD硬件支持
NXP S32K3系列集成了FlexCAN模块,支持CAN FD协议规范(ISO 11898-1:2015)。其硬件特性包括:
| 特性 | 描述 |
|---|---|
| CAN FD帧格式 | 支持标准帧(11位ID)和扩展帧(29位ID)的CAN FD数据帧 |
| 数据场长度 | 支持0~64字节,DLC自动映射 |
| 双波特率 | 仲裁段和数据段独立配置位时序,支持最高8 Mbps数据段速率 |
| 硬件CRC | 自动计算和校验17位/21位CRC,支持填充位计数校验 |
| 消息缓冲区 | 每个FlexCAN实例支持最多128个消息缓冲区(MB),可配置为CAN FD格式 |
| DMA触发 | 每个消息缓冲区可独立配置DMA请求,接收完成或发送完成时触发eDMA传输 |
| 错误状态指示 | 硬件自动维护ESI位,反映发送节点的错误被动状态 |
DMA传输流程:在S32K3上,CAN FD接收流程可设计为:CAN FD帧到达 → FlexCAN硬件将数据存入消息缓冲区 → 硬件置位接收标志 → DMA控制器响应请求 → 将64字节数据从MB搬移到用户定义的RAM缓冲区 → DMA传输完成中断通知CPU。整个过程CPU仅在最后阶段参与,极大降低中断负载。