资讯详情

资讯详情

CAN 和 CANFD

一、引言CANController Area Network总线自 1986 年由 Bosch 公司推出以来已成为车载网络的事实标准。但随着现代汽车电子系统的日益复杂经典 CAN 的局限性逐渐凸显——单帧 8 字节、最高 1 Mbps 的带宽已无法满足域控制器、自动驾驶等场景下的大数据传输需求。2012 年发布的CAN FDCAN with Flexible Data rate在保持经典 CAN 最大兼容性的同时突破了这两大瓶颈。二、核心区别一览维度经典 CAN (CAN 2.0A/B)CAN FD单帧最大数据长度8 字节64 字节速率全程单一速率最高 1 Mbps仲裁段 ≤ 1 Mbps同 CAN数据段最高 5~8 Mbps帧结构全程同一速率仲裁段 →速率切换→ 数据段CRC 校验15-bit CRC17-bit CRC误检率更低兼容性—CAN FD 控制器能收经典 CAN经典 CAN收不了CAN FD 帧收发器经典 CAN 收发器必须用 CAN FD 收发器如 TJA1463总线长度500 kbps 下约 40 米数据段高速下约 10 米以内三、数据帧结构差异经典 CAN 和 CAN FD 的仲裁段ID 竞争阶段完全相同速率也一样。CAN FD 在仲裁结束后发送方通过一个FDFFD Format位通知接收方接下来要切到高速模式了。经典 CAN 帧 ┌─────────┬──────┬──────────┬──────┐ │ 仲裁段 │ 数据 │ CRC/ACK │ 结束 │ │ ≤1Mbps │ ≤8B │ 15-bit │ │ └─────────┴──────┴──────────┴──────┘ CAN FD 帧 ┌─────────┬──────┬──────────┬──────┐ │ 仲裁段 │ 数据 │ CRC/ACK │ 结束 │ │ ≤1Mbps │ ≤64B │ 17-bit │ │ └─────────┴──────┴──────────┴──────┘ ▲ │ 这里插入 FDF 位 BRS 位 │ 通知硬件切换数据段波特率这意味着 CAN FD 帧对经典 CAN 控制器来说仲裁段能看懂但一旦读到 FDF 位就会把整帧当作未知格式丢弃——这是硬件层面的不兼容无法通过软件解决。四、为什么需要 CAN FD经典 CAN 的 8 字节 1 Mbps 在现代车上面临三大压力4.1 域控制器架构下的数据瓶颈传统分布式架构中一个 ECU 只负责一个功能比如变速箱 ECU、刹车 ECUCAN 总线能撑住。但域控制器把十几个 ECU 整合成一个大脑需要传输的数据量呈数量级增长——固件升级、诊断日志、摄像头预览等场景下经典 CAN 一帧只能带 8 字节光升级一个 2MB 的固件就要发几十万帧。4.2 自动驾驶的传感器数据传输激光雷达、摄像头的原始数据如果走 CAN经典 CAN 根本扛不住。CAN FD 的 64 字节帧 5 Mbps 数据段吞吐量提升了约6~8 倍。4.3 车内网络成本CAN FD 可以用更少的总线、更低的成本满足更高带宽需求在车载以太网普及之前是最务实的过渡方案。五、在 DBC 文件中的体现5.1 波特率段 BS_这是最直接、最标准的判断依据。经典 CANBS_: 500000CAN FDBS_: 500000, 2000000逗号分隔两个数值仲裁段波特率在前数据段波特率在后。5.2 Signal 长度上限经典 CAN 单帧 8 字节 → Signal 长度最大64 bit。 CAN FD 单帧 64 字节 → Signal 长度最大512 bit。DBC 中SG_段的Length字段超过 64必然是 CAN FD。5.3 其他标记部分 DBC 工具会通过注释或自定义BA_DEF_属性标记总线类型BA_DEF_ BusType STRING ; BA_DEF_DEF_ BusType CANFD;但这不是标准字段不可靠。BS_ 段的双波特率是唯一可靠的判断方式。六、编程层面的影响6.1 车型 Protocol 类应用层变化极小核心就是数据长度从 ≤8 变成 ≤64。一个 Protocol 类典型的三个关键点// 1. 帧 ID —— 和 CAN/CAN FD 无关取决于车型 CAN 矩阵 const int32_t Accelcmd100::ID 0x100; // 2. 帧长度 —— 经典 CAN ≤ 8CAN FD 可以 ≤ 64 int32_t Accelcmd100::GetLength() const { return 8; } // 3. 位定义、缩放因子、物理量转换 —— 与 CAN/CAN FD 无关照搬 DBC void Accelcmd100::set_p_accel_cmd(uint8_t* data, double accel_cmd) { uint16_t raw static_castuint16_t(accel_cmd / 0.001); // 精度 0.001 data[1] (raw 8) 0xFF; data[2] raw 0xFF; }对应用层开发者来说适配一辆 CAN FD 车型Protocol 类代码逻辑和经典 CAN 完全一样只是GetLength()返回值变大了。6.2 底层驱动CAN Client变化较大需要处理CanFrame 结构体——data[8]需要扩成data[64]len字段语义变化FD 帧标志位—— 需要一个字段告诉硬件这是 CAN FD 帧双波特率配置—— 仲裁段波特率和数据段波特率分开设置收发器配置—— 必须切换到 CAN FD 模式Apollo当前CanFrame定义为经典CAN设计struct CanFrame { uint32_t id; uint8_t data[8]; // ← 仅支持8字节CAN FD需扩展至64字节 uint8_t len; };需修改为struct CanFrame { uint32_t id; uint8_t data[64]; // 支持CAN FD帧 uint8_t len; // 帧长度经典CAN≤8CAN FD≤64 bool is_fd_frame; // ← 新增标记是否为CAN FD帧 };双波特率配置CAN FD需分别设置仲裁段和数据段波特率而非经典CAN的单一配置// 经典CAN驱动初始化 can_client_-Init(500000); // CAN FD驱动初始化 can_client_-Init(500000, 2000000); // 仲裁段500k数据段2M6.3 硬件层CAN 卡如 PEAK PCAN、Vector VN1640必须支持 CAN FD收发器必须是 CAN FD 型号经典 CAN 收发器硬件上不识别 FDF 位总线长度要控制在数据段高速模式允许的范围内CAN总线首尾两个节点必须各加一个120Ω终端电阻中间节点绝对不能加——这是CAN总线能可靠通信的硬性要求。原理消除高速信号反射七、兼容性矩阵发送端接收端经典 CAN 帧CAN FD 帧经典 CAN 控制器经典 CAN 控制器✅❌CAN FD 控制器经典 CAN 控制器✅❌CAN FD 控制器CAN FD 控制器✅✅CAN FD 控制器向下兼容经典 CAN但经典 CAN 无法理解 CAN FD——这意味着车载网络中只要还有一个经典 CAN 节点就不能在那条总线上发 CAN FD 帧。车厂的应对策略通常是在域控制器内部的高速通道用 CAN FD对外保留经典 CAN 总线与传统 ECU 通信。八、总结角度一句话协议本身CAN FD 更大的帧64B 更快的数据段5~8 Mbps 更强的 CRCDBC 识别BS_段有两个波特率即 CAN FD应用层开发和经典 CAN 几乎一样只是数据长了底层驱动需要扩展 CanFrame、加 FD 标志、双波特率硬件必须换 CAN FD 收发器兼容性CAN FD 能收经典 CAN经典 CAN 不能收 CAN FDCAN FD 不是 CAN 的替代品而是经典 CAN 的向后兼容的扩展——它在不破坏现有车载网络架构的前提下为车厂提供了向域控制器、自动驾驶等高带宽场景平滑过渡的路径。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →