原文:https://www.canfd.net/canfd.html
1 引入与背景
传统CAN每帧仅能传输0–8 字节,最高1 Mb/s,随着ECU数量和总线报文量增长,带宽不足。
CAN FD(Flexible Data‑rate)在保留1 Mb/s仲裁段的同时,数据段最高可达8 Mb/s,数据域扩展至0–64 字节;硬件改动仅需控制器与收发器支持FD功能,无需更改线束或拓扑。
2 消息帧结构
帧类型
标准帧(11 位ID)与扩展帧(29 位ID);取消远程帧,RRS位仅作保留。
关键字段
FDF(1 bit):0=传统CAN,1=CAN FD。
BRS(1 bit):位速率切换;1时切换至高速数据段。
ESI(1 bit):错误状态指示;0=主动错误,1=被动错误。
DLC(4 bit):0–8对应0–8 字节;9–15分别对应12、16、20、24、32、48、64 字节。
字段顺序 SOF → 仲裁域 → 控制域 → 数据域 → CRC域(含Stuff Count与CRC序列)→ ACK域 → EOF。
报文(Message)与帧(Frame)的对应
在 CAN 网络中,每一次帧(Frame)的发送即是一条报文(Message)的广播。
帧结构:每帧包含起始位、仲裁域(ID)、控制域(DLC)、数据域、CRC、ACK、结束位等字段,用于完整地封装一次传输请求与其载荷。
一一对应:节点发出一帧就等同于在总线上广播一条报文,周边所有节点都能“监听”到并根据 ID 决定是否接收处理。
报文如静帧 将每条报文(帧)比作一张画——它在时间点𝑡ₙ完整地“定格”了车辆总线上一次通信的状态(ID、数据、时间戳等)。
CAN 回放如视频 当我们把若干报文按时间顺序记录到 BLF、MF4、CSV 等文件中,再以原始时间间隔(或等比例速率)重放这些记录,就如同把一张张静帧组成连续动画。
时序还原:回放工具会严格重现各帧的时间戳间隔及总线速率,保证下游 ECU 或仿真环境感知到的通信节奏与真实现场一致。
顺序一致:保持记录中帧的先后顺序,确保通信逻辑和应答流程无偏差。
小结:
报文=一帧=一张静态“画面”
回放=重放帧序与时间=把一帧帧“画”接成连续“动画”
严格还原时间戳与总线速率,是确保回放有效性的关键。
3 位填充与CRC
位填充
SOF至Data Field:任5位同极性插入1位反向填充;
CRC域:固定位置填充,每4位后插入1位。
CRC
数据≤16 字节用17 位CRC(多项式x¹⁷+x¹⁶+x¹⁴+…+1),>16 字节用21 位CRC(多项式x²¹+x²⁰+…+1),均包含填充位信息。
Stuff Count
4 bit,SOF至Data Field填充位数(mod 8),Gray编码+奇偶校验。
4 与传统CAN的区别
5 控制器收发流程
初始化
开启FD模式,设置仲裁域波特率(如500 kbps)、数据域波特率(如2 Mbps),配置最大Payload(8/16/32/64 字节)。
发送
建立周期调度(示例100 ms),选择对应Payload子库(如Max16Bytes)发送模块,设置ID、帧类型、DLC、数据域。
接收
周期或轮询方式,通过ID过滤从指定缓存区获取FD帧;FD节点亦可收发传统CAN帧。
通信演示
使用ZCANPRO等工具与控制器互发(如ID0x41⇄0x42),正常收发。
6 兼容性
ISO vs non‑ISO CAN FD
2012年前后出现的non‑ISO产品与2015年ISO 11898‑1:2015标准产品在填充计数与CRC算法上不兼容,需软件模式切换。
与传统CAN共存
FD节点可双向收发传统CAN帧;传统节点无法解析FD帧,可能产生错误帧,推荐分网通过网关互联。
7 报文与信号
在 CAN 网络中,通信的基本单位是“报文(Message / Frame)”,每个报文通过唯一的 ID 被识别和过滤。而“信号(Signal)”则是嵌套在报文中的实际数据字段,表示速度、转向角、状态量等具体含义。
7.1 信号依赖报文而存在
所有信号必须依附于某个报文中存在,DBC 文件中对每个信号都规定了其所属报文、起始位、长度、缩放因子等属性;
一个信号在整个网络中只能归属于一个报文,不能跨报文复用;
这保证了数据结构的唯一性和一致性,防止信号源头混乱导致的解析歧义。
7.2 CAN 是报文级广播机制
CAN 总线采用 广播通信模型,即所有报文都会被发送到总线上,所有 ECU 都可以接收这些报文,但会根据报文 ID 决定是否处理。
ECU 不是“点对点”请求某个信号,而是监听特定报文 ID;
模块之间共享数据,是通过监听相同的报文,而非复制相同的信号实现的。
✅ 一句话总结: “需要同一个数据的模块,应该接收同一个报文,而不是企图复制同一个信号。”
7.3 报文与信号的类比:公交与乘客
你可以将报文理解为一辆公交车,信号是车上的乘客:
🚌 报文 = 公交车
🧍♂️ 信号 = 车上的人(具体信息)
如果你想获取轮速、加速度这些数据(乘客),你就得上那辆专门承载这些乘客的车(报文)。不是每个 ECU 都能为所欲为叫一辆专属的“滴滴”,那样会导致网络冗余、带宽浪费甚至信息冲突。
7.4 为什么 DBC 不允许“信号复用”
从设计原则上讲,DBC 强制每个信号只能属于一个报文,主要基于以下原因:
✅ 唯一性:每个信号有唯一位置、唯一含义,避免解析冲突;
✅ 节省带宽:避免重复发送相同内容的冗余报文;
✅ 统一数据源:数据一致性高,不会出现“同一信号多个版本”的扯皮现象;
✅ 解析高效:上层工具(如 CANoe、CANape、TSMaster)能够准确、高效解析数据流。
🧠 打个比方: 报文就是广播电台的频道,信号就是广播内容。谁想听哪条内容,就去调到那个频道收听,而不是每人开个电台重复播放。
7.5 实际工程处理方式
当多个 ECU 需要同一信号时,通常有以下处理策略:
✅ 小结
CAN 网络的本质是广播报文,而不是按需投喂信号。设计良好的 DBC 文件应确保每个信号归属明确、报文划分合理、数据分发统一。只有这样,各 ECU 才能各取所需、运行稳定,避免“各自为政、满网撒鸡”。
评论