CAN及CANFD协议
文章目录
- 前言
- 简介
- 标准
- 帧格式
- 帧类型
- 数据帧
- 远程帧
- 错误帧
- 过载帧
- 帧间隔
- 优先级
- 错误检测及管理机制
- 错误检测
- 错误状态
- 错误帧输出
- 位时序
- 位填充
- 同步
- 硬同步
- 重同步
- 发送延迟补偿
- 介绍
- 发送延迟测量
- SSP Offset
- 应用限制
前言
本文参考 ISO11898、BOSCH-CAN Specification 2.0、BOSCH-CAN with Flexible Data-Rate 1.0 标准以及瑞萨科技的CAN入门书。
简介
CAN(Controller Area Network)协议是一种用于车辆内部电子系统通信的串行通信协议,最初由 Bosch 公司在 1980 年代开发,用于汽车电子控制单元(ECU)之间的通信。随着时间的推移,CAN 协议因其可靠性、灵活性和实时性而被广泛应用于工业自动化、医疗设备、船舶和航空电子等多个领域。
CAN 协议的特点:
- 多主通信:
- CAN 总线支持多主通信,即任何节点都可以主动发送数据。
- 通过仲裁机制解决多个节点同时发送数据的冲突问题。
- 高可靠性:
- 采用差分信号传输,抗干扰能力强。
- 内置错误检测和故障隔离机制,确保通信的可靠性。
- 实时性:
- 基于优先级的总线仲裁机制,确保高优先级消息能够快速传输。
- 低成本:
- 使用双绞线作为传输介质,硬件成本低。
- 帧格式:
- 标准帧(11 位标识符)和扩展帧(29 位标识符)。
- 数据帧最多可传输 8 字节数据。
CANFD(Controller Area Network Flexible Data-Rate)是 CAN 协议的升级版本,由博世公司在 2012 年发布。它在兼容传统 CAN 协议的基础上,提供了更高的数据传输速率和更大的数据帧容量,以满足现代汽车电子和工业控制系统的需求。目前存在两种 CANFD 标准,一种为 Borsh 标准(Non-ISO 标准)和 ISO 标准。
CAN FD 的主要特点:
- 更高的数据传输速率:
- 仲裁段:使用与传统 CAN 相同的速率(通常为 500 kbps 或 1 Mbps),以确保兼容性和可靠性。
- 数据段:可以切换到更高的速率(最高可达 5 Mbps 或更高),显著提高数据传输效率。
- 更大的数据帧容量:
- 数据帧的数据段可以扩展到 64 字节(传统 CAN 最多 8 字节),适用于传输更多数据的应用场景。
- 改进的帧格式:
- 引入了 FDF 位(FD Format Indicator):用于区分 CAN FD 帧和传统 CAN 帧。
- 引入了 BRS 位(Bit Rate Switch):用于指示是否在数据段切换为更高的传输速率。
- 增强的 CRC 校验:
- 使用更长的 CRC 校验码(17 位或 21 位),以提高数据传输的可靠性。
- 兼容性:
- CAN FD 可以与传统 CAN 节点共存于同一网络中,便于系统升级和扩展。
标准
CAN 协议经 ISO 标准化后由 ISO11898 和 ISO11519-2 两种标准。ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同。
- ISO11898 是通信速度为 125Kbps~1Mbps 的 CAN 高速通信标准
- ISO11519 是通信速度为 125Kbps 以下的 CAN 低速通信标准
ISO11898 和 ISO11519-2 标准物理层的主要不同点如下图:
ISO/OSI 基本参照模型和 CAN 协议:
帧格式
CAN/CANFD 存在标准帧和扩展帧两种帧格式。具体如下图所示:
-
帧起始
SOF (Start of Frame),数据帧或远程帧起始标志,由 1 位显性位组成; -
仲裁域
用于当多个节点同时向总线发送数据的情况时,识别报文的优先级并判定通信的顺序。- 标准帧仲裁域有 12 位,包括 ID28-ID18 和 RTR(CAN)/RRS(CANFD),禁止高 7 位都为隐性电平;
- 扩展帧仲裁域有 32 位,包括 ID28-ID18、SRR、IDE、ID17-ID0 和 RTR(CAN)/RRS(CANFD),禁止高 7 位都为隐性电平;
- ID28-ID18:基本 ID;
- ID17-ID0:扩展 ID;
- RTR:Remote Transmission Request,远程传输请求位,由 1 位组成,隐性表示此时为数据帧,显性表示此时为远程帧(CANFD 没有远程帧);
- RRS:Remote Request Substitution,CANFD 帧替代 RTR 位;
- SRR:Substitute Remote Request,CAN 帧替代 RTR 位;
- IDE:Identifier Extension Flag,标识符选择位,判断标准帧或扩展帧,隐性表示此时为扩展帧,显性表示此时为标准帧。
-
控制域
-
CAN 标准帧控制域有 6 位,包括 IDE、FDF 和 DLC;
-
CAN 扩展帧控制域有 6 位,包括 FDF、r0 和 DLC;
-
CANFD 标准帧控制域有 9 位,包括 IDE、FDF、res、BRS、ESI 和 DLC;
-
CANFD 扩展帧控制域有 8 位,包括 FDF、res、BRS、ESI 和 DLC;
-
FDF:FD Format indicator,FD 帧格式指示位,由 1 位组成,隐性表示此时为 CANFD 帧,显性表示此时为 CAN 帧;
-
DLC:Data Length Code,数据长度码,由 4 位组成,与长度对应关系如下图所示:
-
r0:Reserved bit in Classical Extended Frame Format,CAN 扩展帧保留位,由 1 位显性位组成;
-
res:Reserved bit in FD Frames,CANFD 帧保留位,由 1 位显性位组成;
-
BRS:Bit Rate Switch,位速率切换位,由 1 位显性位组成,隐性表示切换位速率为数据速率,显性表示维持仲裁域速率;
-
ESI:Error State Indicator,错误状态指示位,由 1 位显性位组成,隐性表示此时为被动错误状态,显性表示此时为主动错误状态。
-
-
数据域
报文数据内容,CAN 帧由 0~8 个字节组成,CANFD 帧由 0~64 字节组成。低字节先发送,高位先发送。 -
CRC 域
用于数据检错,接收方以同样的算法计算CRC值并进行比较,若有不同则会在ACK界定符后发送错误帧。- CAN:CRC域由15位CRC值和1位CRC界定符组成,CRC校验使用CRC15算法,计算范围为SOF~数据段(不包括填充位);
- ISO CANFD:CRC域由4位填充计数位、17/21位CRC值和1位CRC界定符组成,CRC校验使用CRC17(数据长度0~16字节)或CRC21(数据长度>16字节)算法,计算范围为SOF~数据段+填充位+4位填充计数位(SOF~数据段间填充称为填充位,CRC域填充称为**固定填充位,**即使数据域最后5bits数据为相同值,后面填充的最后一位也是作为固定填充位,不计算CRC);
- Non-ISO CANFD:CRC域由17/21位CRC值和1位CRC界定符组成,CRC校验使用CRC17(数据长度0~16字节)或CRC21(数据长度>16字节)算法,计算范围为SOF~数据段(包括填充位,但没有填充计数位。SOF~数据段间填充称为填充位,CRC域填充称为**固定填充位,**即使数据域最后5bits数据为相同值,后面填充的最后一位也是作为固定填充位,不计算CRC);
- CRC15:
- 多项式:x^15+x^14+x^10+x^8+x^7+x^4+x^3+1(0x4599)
- 初始值:15’h0
- CRC17:
- 多项式:x^17+x^16+x^14+x^13+x^11+x^6+x^4+x^3+x+1(0x1685B)
- 初始值:
- ISO CANFD:17’h10000
- Non-ISO CANFD:17’h0
- CRC21:
- 多项式:x^15+x^14+x^10+x^8+x^7+x^4+x^3+1(0x4599)
- 初始值:
- ISO CANFD:21’h100000
- Non-ISO CANFD:21’h0
- Stuff Count:填充计数位,由3位计数位和1位奇偶校验位组成,只有ISO标准CANFD才具备,用于计算从SOF~数据段结束总填充位个数%8(即使数据域最后5bits数据为相同值,后面填充的最后一位也是作为固定填充位,不计入总填充位个数),映射关系如下表。
填充位个数模8 | 3bit计数位(格雷码) | 1位奇偶校验 |
---|---|---|
0 | 000 | 0 |
1 | 001 | 1 |
2 | 011 | 0 |
3 | 010 | 1 |
4 | 110 | 0 |
5 | 111 | 1 |
6 | 101 | 0 |
7 | 100 | 1 |
-
ACK 域
由1位ACK槽和1位ACK界定符组成,用来确认报文是否被正常接收。发送节点在ACK域发送2位隐性位,接收节点若正常接收到报文,则会在ACK槽发送1个显性位。
与CAN相比,在CANFD中最多可接受2个位时间有效的ACK,允许1个额外的位时间来补偿收发器相移和传播延迟(从高速的数据速率到慢速的仲裁速率,时钟切换会引起收发器相移和总线传播延迟)。
-
帧结尾
EOF(End of Frame),数据帧或远程帧结尾标志,由7位隐性位组成。
帧类型
CAN 协议共有 5 种帧类型,包括数据帧、远程帧、错误帧、过载帧和间隔帧,数据帧和遥控帧又有标准和扩展帧两种格式。
而 CANFD 协议只有 4 种帧类型,不存在远程帧。
数据帧
用于发送节点向接收节点传输数据的帧,格式定义如“帧格式”章节。
远程帧
用于接收节点向具有相同ID的发送节点请求数据的帧,格式定义如“帧格式”章节。
错误帧
用于所有节点在接收或发送报文时检测出错误后通知错误的帧。错误帧由错误标志和错误界定符构成。
- 错误标志:包括主动错误标志(6个显性位)和被动错误标志(6个隐性位)两种,具体取决于当前节点状态。
- 主动错误标志:处于主动错误状态的节点检测出错误时输出的错误标志;
- 被动错误标志:处于被动错误状态的节点检测出错误时输出的错误标志。
- 错误界定符:由8个隐性位组成。
过载帧
用于接收节点通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符组成。
- 过载标志:由6个显性位组成。
- 过载界定符:由8个隐性位组成。
过载条件:
- 接收节点未准备好接收下一帧数据帧/远程帧,主动发起过载帧;
- 帧间隔第一或第二位检测到显性电平;
- 接收节点在 EOF 最后一位检测到显性电平;
- 任何节点在错误帧界定符或者过载帧界定符最后一位检测到显性电平。
☆ 条件1只允许在帧间隔第一位开始发送过载帧,其余在检测到显性电平下一位开始发送过载帧。
帧间隔
用于分隔数据帧和远程帧的帧。数据帧和远程帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、远程帧、错误帧和过载帧)分开。
- 处于主动错误的节点,帧间隔由间隔域(3个隐性位)和没有长度限制的总线空闲段组成。
- 处于被动错误的节点,发送完间隔域后还要再发送8个连续隐性位,从而保证其它主动错误节点优先占据总线。
☆ 过载帧和错误帧前不能插入帧间隔。
优先级
- 在总线空闲状态下,最先开始发送消息的节点获得发送权;
- 多个节点同时开始发送时,各发送节点从仲裁域的第一位开始进行仲裁,连续输出显示位最多的单元可继续发送。
- 数据帧和远程帧的优先级
具有相同ID的数据帧和远程帧在总线上竞争时,仲裁域最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。 - 标准格式和扩展格式的优先级
具有相同基本ID的标准格式数据帧和扩展格式数据帧在总线上竞争时,标准格式的RTR位为显性位具有优先权,可继续发送。
错误检测及管理机制
错误检测
CAN/CANFD 帧共有 5 种错误类型。
- 位错误(bit error):发送节点在发送位时,检测到总线上的电平与它发送的电平不一致。以下情况不判定为位错误:
- 在仲裁期间,发送节点发送隐形电平但检测到显性电平
- 在 ACK Slot 期间,发送节点检测到显性电平
- 在发送被动错误标志期间,检测到显性电平
- 填充错误(stuff error):接受节点在接收数据时,检测到连续的 6 个显性位。
- CRC 错误(crc error):接收节点对比计算的 CRC 值和接收到的 CRC 值不一致;CANFD 接收节点对比计算的填充计数位和接收到的填充计数位不一致。
- 格式错误(form error):接收节点检测出与固定格式相反电平。以下情况判定位格式错误:
- 接收节点检测到 CRC 界定符位显性电平
- 接收节点检测到 ACK 界定符位显性电平
- 接收节点检测到 EOF 第 7 位为显性电平不判定位格式错误
- 接收节点检测到错误界定符第 8 位为显性电平不判定位格式错误
- 接收节点检测到过载界定符第 8 位为显性电平不判定位格式错误
- 接收节点检测到 CANFD 帧的 CRC 段的固定填充位电平与上一位电平一致判定位格式错误,而不是位填充错误
- 应答错误(ack error):发送节点在 ACK Slot 期间,未检测到显性电平
错误状态
CAN节点始终处于以下三种状态之一:
- 主动错误状态(Error Active):节点处于主动错误状态,节点可以正常进行总线通信,当检测到总线错误时,发送主动错误帧。
- 被动错误状态(Error Passive):
- 节点处于被动错误状态,节点可以正常进行总线通信,但最多只能连续2次发送数据帧,在检测到总线错误后,发送被动错误帧;
- 处于被动错误状态的节点即使检测出错误,而其它处于主动错误状态的节点没有发现错误,整个总线也被认为是没有错误的;
- 处于被动错误状态的单元在发送结束后不能马上再次开始发送,在开始下次发送前,在间隔帧期间内必须插入“延迟传送”(8个隐性位)。
- 总线关闭状态(Bus Off):节点处于Bus Off状态时,不能收发报文。
以上状态依靠发送错误计数(TEC)和接收错误计数(REC)来管理,节点根据计数值决定进入何种状态。
序号 | 变动条件 | 发送错误计数 | 接收错误计数 |
---|---|---|---|
1 | 接收节点检测出错误时。 | 例外:接收单元在发送主动错误标志或过载标志中检测出“位错误”,接收错误计数值不增加。 | - |
2 | 接收节点在发送完错误标志后检测到的第一个位为显性电平时 | - | +8 |
3 | 发送节点在输出错误标志时。 | 例外: | 1)处于被动错误发送单元检测到响应错误后发送被动错误标志,但期间没有检测到任何显性电平; |
4 | 发送节点在发送主动错误标志或者过载标志时,检测出位错误 | +8 | - |
5 | 接收节点在发送主动错误标志或者过载标志时,检测出位错误 | - | +8 |
6 | 各节点从主动错误标志/过载标志的最开始检测出连续14个显性位后,每检测出连续的8个显性位时 | 发送时+8 | 接收时+8 |
7 | 检测出在被动错误标志后的8个连续显性位后,每检测出连续的8个显性位时 | 发送时+8 | 接收时+8 |
8 | 发送节点正常发送数据结束时(ACK正确且到帧结束都没检测出错误) | TEC=0时保持为0;其它时刻-1 | - |
9 | 接收节点正常接收数据结束时(CRC正确且正常返回ACK) | - | REC=0时保持为0;0<REC<128时-1; |
10 | 处于总线关闭状态的节点,检测到128次连续11个隐性位 | TEC=0 | REC=0 |
错误帧输出
检测出满足错误条件的单元输出错误标志通报错误。
处于主动错误状态的节点输出的错误标志为主动错误标志,处于被动错误状态的节点输出的错误标志为被动错误标志。
发送单元发送完错误帧后,将再次发送数据帧或远程帧。
错误类型 | 输出时序 |
---|---|
位错误、填充错误、格式错误、ACK错误 | 从检测出错误后的下一位开始输出错误标志 |
CRC错误 | ACK界定符后的下一位开始输出错误标志 |
位时序
- 发送单元在非同步情况下每秒钟发送的位数称为位速率。
- 1个位可分为4段,包括同步段(SS)、传播时间段(PTS)、相位缓存段1(PBS1)、相位缓冲段2(PBS2)。这些段又由最小时间单位Tq(Time Quantum)组成。
- 1个位分为4个段,每个段又由若干个Tq构成,这称为位时序。
- 1个位由多少个Tq组成、每个段又由多少个Tq构成等,可以任意设定位时序。通过设定位时序,进而设定采样点位置。
- 各段的作用和Tq数如下表所示。
段名称 | 作用 | Tq数 |
---|---|---|
同步段(SS: Synchronization Segment) | 多个连接在总线上的节点通过此段实现时序调整,同步进行接收和发送的广州。由隐性电平到显性电平的边沿或由显性电平到隐性电平的边沿最好出现在此段中 | 1 |
传播时间段(PTS: Propagation Time Segment) | 用于吸收网络上的物理延迟的段。 | 所谓的网络的物理延迟指发送节点的输出延迟、总线上信号的传播延迟、接收节点的输入延迟。 |
相位缓冲段1(PBS1: Phase Buffer Segment 1) | 当信号边沿不能被包含于SS段中时,可在此段进行补偿。 | 由于各个节点以各自独立的时钟工作,细微的时钟误差会累积起来,PBS段可用于吸收此误差。通过对相位缓存段加减SJW吸收误差。SJW加大后允许误差加大,但通信速度下降。 |
相位缓存段 2 | 2-8 | |
再同步补偿宽度(SJW: Resynchronization Jump Width) | 因时钟频率误差、传输延迟等,各节点有同步误差。SJW为补偿此误差的最大值。 | 1-4 |
位填充
为了限制可用于同步的边沿之间的最大间隔,采用了位填充编码方法。
- CAN
- 填充范围:SOF~CRC
- 填充规则:当发送节点检测到待发送位流中出现五个连续相同位(包括填充位)时,应在实际发送的位流中插入一个补码位(称为填充位,见图11)。
- 去填充规则:接收节点识别到五个连续相同位后,丢弃后续一位填充位。
- CANFD:
- 填充范围:SOF~CRC
- 填充规则:
- SOF~数据域:采用同CAN的填充方式,当发送节点检测到待发送位流中出现五个连续相同位(包括填充位)时,应在实际发送的位流中插入一个补码位
- CRC域:填充位应插入固定位置,称为固定填充位。
- 即使在数据域最后5位不是相同值的情况下,也应在CRC域最开始插入一个固定填充位(值为前一位反码)。
- 如果数据域最后5位恰好是相同值,则仅插入一个固定填充位(值为前一位反码),不得出现两个连续填充位。
- 此外,在CRC域每隔4bits插入一个固定填充位(值为前一位反码)。
- 去填充规则:接收节点在校验CRC时应从位流中移除这些固定填充位。若固定填充位与上一位一样,则判定为格式错误。FD帧CRC段中的固定填充位数量等于采用传统帧位填充方法时可能产生的最大填充位数。
- ISO CANFD固定填充位示意图(以CRC17为例):
- Non-ISO CANFD固定填充位示意图(以CRC17为例):
同步
CAN协议通信使用NRZ(不归零)编码方式,但是长时间的高电平或低电平难以判断位边界。发送节点以位时序同步的方式开始发送数据,接收节点根据总线上电平的变化进行同步并进行接收。
但是,发送节点和接收节点存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步误差。因此接收节点通过硬同步和重同步的方法调整时序进行接收。
硬同步
硬同步指接收节点在总线空闲状态检测出帧起始时进行的同步调整。
在检测出边沿的地方不考虑SJW的值而认为是SS段。
以下情况会触发硬同步:
- 总线处于空闲状态检测到下降沿;
- 帧间隔的第2-3位检测到下降沿;
- CANFD帧 FDF->RES的跳变沿。
重同步
除了硬同步情况,其余情况检测到下降沿触发重同步。
重同步指在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据SJW值通过加长PBS1段或缩短PBS2段,以调整同步。但如果发生了超出SJW值的误差时,最大调整量不能超过SJW值。
发送延迟补偿
介绍
CANFD的发送延迟补偿(Transmitter Delay Compensation, TDC)是一种关键机制,用于解决高速数据传输时因物理延迟导致的位错误误判问题。
TDC通过引入二次采样点(Secondary Sample Point, SSP),调整对发送信号的检测时机,允许更长的传播延迟。其核心逻辑如下:
- 主采样点(Primary Sample Point, PSP):传统CAN中唯一的采样点,用于仲裁阶段和低速数据阶段。
- 二次采样点(SSP):仅在数据阶段启用,位于主采样点之后,用于补偿延迟。
- 触发条件:TDC仅在数据阶段(Data Phase)且当比特率切换位(Bit Rate Switch, BRS)为隐性时生效,仲裁阶段(Arbitration Phase)仍使用传统机制。
- 工作流程:
- 发送节点在PSP忽略自身的比特错误检测。
- 在SSP处,节点将接收到的总线电平与自身发送的比特值进行比对。
- 若SSP检测到不一致(比特错误),错误处理(如错误帧生成)会被延迟到下一个PSP执行,而非立即触发。
发送延迟测量
开启TDC后,节点将自动测量Tx信号线上FDF位到r0位下降沿与Rx信号线上FDF位到r0位边沿的之间的延迟时间,作为测量延迟TDCV。
(49 封私信 / 80 条消息) 为什么CANFD要对发送延迟做补偿? - 知乎
SSP Offset
SSP offset 等于测量延迟TDCV+发送延迟补偿偏移TDCO(TDC Offset)之和。一般TDCO设置与第一采样点一致,即(SS+PTS+PBS1) * Tq。
应用限制
- 数据阶段末尾的比特:
- 若某个比特的SSP可能落入后续的仲裁阶段(例如EOF段),则禁用该比特的错误检测,以避免跨阶段干扰。
- 若某个比特的SSP可能落入后续的仲裁阶段(例如EOF段),则禁用该比特的错误检测,以避免跨阶段干扰。