
CAN(-FD)协议介绍——深入浅出理解CAN协议(一)
本内容包含CAN2.0及CANFD协议,可作为入门CAN协议;另外也有深入硬件的理解,从业多年软件工程师也可以学习一二;亦可作为后续查阅使用,常看常新嘛。
本系列是在同公司硬件设计、验证的同事1、在完成了CANFD硬件接口IP开发 2、熟悉ISO-11898系列、ISO16845、CAN2.0协议、CANFD协议等以及大量学习资料 3、深入研究其他家CANFD IP(NXP、BOSCH)4、独立开发了对应底层驱动 5、通过CANoe和周立功CAN分析仪完成前述各协议要求的场景 6、以及对autosar底层接口适配后,基本上对CAN协议有了深入的理解。将过程中整理了一些文档分享出来,希望能给新入门和从业多年的相关工程师提供一点点帮助。
主要包含CAN2.0及CANFD协议,后面对CAN2.0及CANFD的不同点做些说明。
- 可作为入门CAN协议
- 另外也有深入硬件的理解,从业多年软件工程师也可以学习一二
- 亦可作为后续查阅使用,常看常新嘛。
CAN(-FD)协议介绍—— 深入浅出理解CAN协议(一)
CAN_FD和CAN2.0的不同点——深入浅出理解CAN协议(二)
CAN error情况及处理机制——深入浅出理解CAN协议(三)
CAN协议一致性测试——深入浅出理解CAN协议(四)
0、缩略词
前期浏览下常用CAN协议缩写,后面方便查阅。
ABBR | 英文全拼 | 中文释义 |
---|---|---|
CAN | Controller Area Network | 控制器局域网 |
CAN_2.0A | CAN standard mode | CAN标准模式 |
CAN_2.0B | CAN extended mode | CAN扩展模式 |
CAN_FD | CAN with flexible data-rate | 带有灵活数据速率的CAN |
ECU | Electronic Control Unit | 电子控制单元 |
SOF | Start of Frame | 帧起始 |
ID | Identifier | 标识符 |
SRR | Substitute Remote Request | 替代远程请求 |
IDE | Identifier Extension | 标识符扩展 |
EDL | EXTENDED DATA LENGTH | Canfd,区分can和canfd帧 |
BRS | BIT RATE SWITCH | Canfd,指示canfd是否变速 |
ESI | ERROR STATE INDICATOR | Canfd,指示发送canfd的错误状态 |
DLC | Data Length Code | 数据长度码 |
RTR | Remote Transmission Request | 远程传输请求 |
CRC | Cyclic Redundancy Check | 循环冗余校验 |
EOF | End of Frame | 帧结束 |
SS | Synchronization Segment | 同步段 |
TSEG1 | Time Segment before Sample Point | 采样点前的时间段 |
TSEG2 | Time Segment after Sample Point | 采样点后的时间段 |
SJW | Resynchronization Jump Width | 重同步跳转宽度 |
1、can总线特点
1.1 多主控制
- 在总线空闲时,所有的单元都可开始发送消息(多主控制)。
- 最先访问总线的单元可获得发送权(CSMA/CA 方式)。
- 多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
没错CSMA/CA就是早期互联网载波监听多点接入 / 碰撞避免 协议;基本特点是:1、数据发送前 , 都要先进行监听 ; 2、信道空闲后 , 才能接入 ;这里不深入介绍,因为CAN只是简单使用该协议的这两个机制,其他并未使用,对该协议感兴趣的可以简单搜索了解下
1.2 消息的发送
在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失败的单元则立刻停止发送而进行接收工作。
1.3 系统的柔软性
与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
1.4 通信速度
根据整个网络的规模,可设定适合的通信速度。
在同一网络中,所有单元必须设定成统一的通信速度。即使有一个单元的通信速度与其它的不一样,此单元
也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。
1.5 远程数据请求
可通过发送“遥控帧” 请求其他单元发送数据。
1.6 错误检测功能·错误通知功能·错误恢复功能
所有的单元都可以检测错误(错误检测功能)。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送
此消息直到成功发送为止(错误恢复功能)。
1.7 故障封闭
CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
1.8 连接
CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
由于CAN总线采用CSMA/CA的通信机制,所以在空闲时,可能会出现多个can节点同时向总线发送消息,所以会逐位仲裁;即:从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。
2、can bus信号
2.1 差分信号
总线上的电平有显性电平和隐性电平两种。总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。“显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强。)
参考:
https://e2e.ti.com/blogs_/b/analogwire/posts/can-bus-arbitration-to-yell-and-back
2.2 位填充
位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。
2.2.1 发送单元的工作
在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则 要插入 1 位与前 5 位反型的电平。
2.2.2 接收单元的工作
在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个 位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。
3、帧种类
can的帧类型有:数据帧 遥控帧 错误帧 过载帧 帧间隔;在canfd中删除了遥控帧,但是实际上使用过的canfd依然可以正常收发遥控帧。
3.1 数据帧
3.1.1 帧起始
1 个位的显性位。表示数据帧开始的段。
3.1.2 仲裁段
- 表示数据的优先级的段。标准格式和扩展格式在此的构成有所不同。
- 标准格式仲裁段包括:id+rtr
- 扩展格式仲裁段包括:id+srr+ide+id_ext+rtr
- 根据逐位仲裁的规则,报文优先级:数据帧 > 远程帧(同id)、标准数据帧>扩展数据帧(id28-18相同)、扩展数据帧 > 扩展远程帧(同id)
Note:
- 标准格式的ID有11个位。从ID28到ID18被依次发送。禁止高7位都为隐性。(禁止设定:ID=1111111XXXX)
- 扩展格式的ID有29个位。基本ID从ID28到ID18,扩展ID由ID17到ID0 表示。基本ID和标准格式的ID相同。禁止高7位都为隐性。(禁止设定:基本ID=1111111XXXX)
虽然有这种要求,但是实际物理层是可以正常收发上述ID的报文的。
3.1.3 控制段
表示数据的字节数及保留位的段(这里和canfd帧有所不同)
- 保留位(r0、r1)
保留位必须全部以显性电平发送。但接收方可以接收显性、隐性及其任意组合的电平。 - 数据长度码(DLC)
数据的字节数必须为 0~8 字节。但接收方对 DLC = 9~15 的情况并不视为错误
3.1.4 数据段
数据的内容,可发送 0~8 个字节的数据。数据段可包含 0~8 个字节的数据。从 MSB(最高位)开始输出。(fd帧为 0-64 bytes)
3.1.5 CRC 段
检查帧的传输错误的段。CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序*1 和 1 个位的 CRC 界定符(用于分隔的位)构成。
Note:
- CRC 顺序
CRC 顺序是根据多项式生成的 CRC 值,CRC 的计算范围包括帧起始、仲裁段、控制段、数据段。接收方以同样的算法计算 CRC 值并进行比较,不一致时会通报错误。 - CANFD帧采用CRC17和CRC21
3.1.6 ACK 段
表示确认正常接收的段。
- 发送单元的ACK 段
发送单元在 ACK 段发送2个位的隐性位。 - 接收单元的 ACK 段
接收到正确消息的单元在 ACK 槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发
送 ACK”或者“返回 ACK”。
发送ACK 的是在既不处于总线关闭态也不处于休眠态的所有接收节点中,接收到正常消息的单元(发送单元不发送 ACK)。所谓正常消息是指不含填充错误、格式错误、CRC 错误的消息。
3.1.7 帧结束
帧结束是表示该该帧的结束的段。由 7 个位的隐性位构成。
3.2 远程帧
数据帧和遥控帧的不同
- 1、遥控帧的 RTR 位为隐性位,没有数据段。
- 2、没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。
- 3、遥控帧没有数据段,数据长度码该如何表示?
- 4、遥控帧的数据长度码以所请求数据帧的数据长度码表示。
- 5、没有数据段的数据帧有何用途?
例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下。
3.3 错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
3.3.1 错误标志
错误标志包括主动错误标志和被动错误标志两种。
- 1、主动错误标志:6 个位的显性位。
- 2、被动错误标志:6 个位的隐性位。
3.3.2 错误界定符
错误界定符由 8 个位的隐性位构成。
Note:
- 主动错误标志
处于主动错误状态的单元检测出错误时输出的错误标志。 - 被动错误标志
处于被动错误状态的单元检测出错误时输出的错误标志。
3.4 过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
3.4.1 过载标志
6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
3.4.2 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
3.5 帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、遥控帧、错误帧、过载帧)分开。
过载帧和错误帧前不能插入帧间隔。
3.5.1 间隔
3个位的隐性位。
3.5.2 总线空闲
隐性电平,无长度限制(0 亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
3.5.3 延迟传送(发送暂时停止)
8个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
4 同步基址
CAN协议的通信方法为NRZ(Non-Return to Zero)方式。各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。另外,接收单元根据总线上电平的变化进行同步并进行接收工作。但是,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。
4.1 硬件同步
接收单元在总线空闲状态检测出帧起始时进行的同步调整。在检测出边沿的地方不考虑SJW的值而认为是 SS 段。
4.2 重同步
在接收过程中检测出总线上的电平变化时进行的同步调整。
每当检测出边沿时,根据 SJW 值通过加长 PBS1 段,或缩短 PBS2 段,以调整同步。但如果发生了超出 SJW 值的误差时,最大调整量不能超过 SJW 值。
4.3 调整同步的规则
硬件同步和重同步遵从如下规则。
- 1、1个位中只进行一次同步调整。
- 2、只有当上次采样点的总线值和边沿后的总线值不同时,该边沿才能用于调整同步。
- 3、在总线空闲且存在隐性电平到显性电平的边沿时,则一定要进行硬件同步。
- 4、在总线非空闲时检测到的隐性电平到显性电平的边沿如果满足条件(1)和(2),将进行重同步。但还要满足下面条件。
- 5、发送单元观测到自身输出的显性电平有延迟时不进行重同步。
- 6、发送单元在帧起始到仲裁段有多个单元同时发送的情况下,对延迟边沿不进行重同步。
4.4 实际硬件行为
实际上,同步这里不好理解,特别是对搞软件的,这里抓了下硬件时序图,就很容易理解了。
4.4.1 硬件同步
- 1、接收节点的bit_time状态机在初始化后一直在ss-seg1-seg2跳转
- 2、bus上进来sof很大概率不是落在ss(异步通信)
- 3、此时sof刚好落在了seg1,所以can内部会调整bit_time状态机直接到ss
Note:接收节点会做一个信号同步,将can_bus打拍调整为rx_bus_monitor(后续状态机实际也是也是和该信号一致变化)
4.4.2 重同步
为了不让can_bus误导,只拉了rx_bus_monitor,配置为:seg1 = a,seg2 = 3,sjw = 2
1、由于时钟电平相位关系,导致本次显性电平向隐性电平变化时,落在在seg1,所以此时将发生重同步,seg1_val 变为 seg1+sjw = c;(可以看到bitref_cnt_r在seg1是从0累加到c就才跳到seg2状态)
2、下一bit的显性电平向隐性电平变化时,落在了seg2,也会发生重同步,seg2_val 变为了seg2 - sjw = 1。(这里由于检查到电平变化以及到了seg2结束,虽然seg2_val变化了,但是cnt已经累加结束,所以实际没有减,该累计的相位差可能会到后面bit消除)
NOTE
本节参考了很多瑞萨的手册(入门必读),许多截图也为了方便是直接截取,很多细节及难以理解之处,结合硬件真实行为给出了自己理解。
更多推荐
所有评论(0)