原文地址:https://itexp.blog.csdn.net/article/details/90705713
随着越来越多的应用程序接受和引入串行通信,这就要求对特定应用程序的通信功能分配消息标识符以进行标准化。如果将原来由 11 个标识符位定义的地址范围扩大,则可以更方便地使用 CAN 实现这些应用程序。
因此,引入了第二种消息格式(扩展格式),它提供了由 29 位标识符定义的更大的地址范围。这将减轻系统设计者在定义结构良好的命名方案方面的负担。不需要扩展格式提供的标识符范围的用户仍然可以依赖传统的 11 位标识符范围(标准格式)。在这种情况下,他们可以使用市场上已有的 CAN 控制器,或者实现了这两种格式的新控制器。
为了区分 标准格式 和 扩展格式 ,使用了 CAN 消息格式的控制域的第一个保留位 r1(控制域有 r1 和 r0 两个保留位)。 这样做是为了使 CAN 规范 1.2 中的旧的消息格式等同于本规范的新的标准格式。 此外,本规范定义的扩展格式可以和标准格式的消息在同一网络中共存。
CAN2.0 规范由两部分组成
注:根据本规范 Part A 或 根据以前的 CAN 规范设计的 CAN 实现,以及根据本规范的 Part B 设计的 CAN 实现可以相互通信,只要它不使用扩展格式即可。
CAN2.0 Part B 的目的是实现任何两个 CAN 控制器网络之间的兼容性。 然而,兼容性具有关于例如的不同方面。 例如电气特征和要传输的数据的解释。 为了实现设计透明度和实现灵活性,CAN2.0 Part B 已根据 ISO / OSI 参考模型细分为不同的层:
在 CAN 规范的先前版本(如 CAN2.0 Part A 和 CAN1.2 )中,逻辑链路子层(LLC)和媒体访问子层(MAC)被称为“对象层”和“传输层”,且对着两个层的功能有详细的介绍。其中,逻辑链路子层(LLC)主要实现:
MAC子层的范围主要是传输协议,即控制成帧,执行仲裁,错误检查,错误信令和故障限制。 在MAC子层内,确定总线是否可用于开始新的传输或者接收是否刚刚开始。 此外,比特位时序的一些一般特征也被视为MAC子层的一部分。
总线是由可携带比特位的单一通道组成。通过此通道可以获得数据的再同步信息。这本技术规范不限制这些实现方法的使用,即未定义物理层。要实现此通道,使用使用单芯线(加上接地)、2 条差分线、光缆等等。
总线可以具有两种互补的逻辑值之一:“显性”或“隐性”。 “显性”位和“隐性”位同时传送时,总线的结果值为“显性”。比如,在执行总线的“线与”时,逻辑0 代表“显性”等级,逻辑1 代表“隐性”等级。本技术规范不给出表示这些逻辑电平的物理状态(比如,电压、光)。
CAN 的速度在不同系统中可能不同。 但是,在指定的系统中比特率是统一的并且是固定的。
详细说明见另一篇博文
CAN总线上的每个节点往总线上发送数据的同时会同时读取总线上的数据,并与自己发送的数据作对比。每当总线空闲时,任何单元都可以开始发送消息。 如果 2 个或更多单元同时开始发送消息,则使用 IDENTIFIER 通过 逐位仲裁 解决总线访问冲突。 仲裁机制保证信息和时间都不会丢失。 如果同时启动具有相同 IDENTIFIER 的 DATA FRAME 和 REMOTE FRAME,则 DATA FRAME 优先于 REMOTE FRAME。
仲裁期间,每一个发送器都对发送位的电平与监控的总线电平进行比较。 如果电平相同,则这个单元可以继续发送。 如果发送的是 1 个比特位的隐性电平加粗样式,而监控视到 1 个比特位的显性电平(见总线值),那么该单元就失去了仲裁,必须退出发送状态。如果在非仲裁期间(仲裁域范围),发现了不匹配的位,则产生错误。
DATA FRAME 或 REMOTE FRAME 中的位字段 START OF FRAME,ARBITRATION FIELD,CONTROL FIELD,DATA FIELD 和 CRC SEQUENCE 都需要通过比特填充的方法编码。 每当发送器在要发送的比特流中检测到相同值的五个连续比特时,则自动在实际发送的比特流中插入一个相反的比特位,这种方法被称为位填充。
DATA FRAME 或 REMOTE FRAME 的剩余位字段 CRC DELIMITER,ACK FIELD 和 END OF FRAME 是固定的格式,不需要填充。 ERROR FRAME 和 OVERLOAD FRAME 也是固定格式,不通过位填充方法编码。
消息中的比特流根据不归零(Non-Return-to-Zero,NRZ)法进行编码。这意味着在总比特时间内,生成的比特电平要么是“显性”要么是“隐性”。
详细说明见另一篇博文《CAN 总线 之 BOSCH CAN2.0 比特位填充(编码规则)、归零编码(RZ)和不归零编码(NRZ)》
CAN2.0 Part B 规定了两种格式的帧,它们的 IDENTIFIER 域长度不同。带有 11 个比特位长的 IDENTIFIER 的帧被称为 标准帧(Standard Frames);带有 29 个比特位长的 IDENTIFIER 的帧被称为 扩展帧(Extended Frames)。
消息传输由四种不同的帧类型表现和控制:
DATA FRAME 和 REMOTE FRAME 都可以为标准帧格式或者扩展帧格式,它们通过 INTERFRAME SPACE 与前面的帧分开。
DATA FRAME 由 7 个不同的位域组成:START OF FRAME、ARBITRATION FIELD、CONTROL FIELD、DATA FIELD、CRC FIELD、ACK FIELD、END OF FRAME
。 其中,DATA FIELD 长度可以为 0。帧格式如下图所示:
下面详细介绍一下每一部分。
标志着 DATA FRAME 和 REMOTE FRAME 的开始。它占 1 个比特位,必须为显性电平 。
只有在总线空闲时才允许站点开始传输(参见 BUS IDLE)。 所有站必须同步到由首先开始传输的站的 START OF FRAME(参见’HARD SYNCHRONIZATION’)引起的前沿。
同时适用于标准格式帧 和 扩展格式帧。
ARBITRATION FIELD 的格式对于标准格式帧和扩展格式帧是不同的。
标准格式帧: ARBITRATION FIELD 由 11 个比特位的 IDENTIFIER 和 1 个比特位的 RTR-BIT 组成。 IDENTIFIER 位表示为 ID28 ~ ID18。
为了区分标准格式和扩展格式,先前 CAN 规范版本 1.0 ~ 1.2 中的保留位 r1 现在表示为 IDE 位。
扩展格式帧: ARBITRATION FIELD由 29 个比特位的IDENTIFIER,1 个比特位的 SRR-Bit,1 个比特位的 IDE-Bit和 1 个比特位的RTR-BIT组成。 IDENTIFIER 位表示为ID28 ~ ID0。
由 6 个比特位组成。 CONTROL FIELD 的格式对于标准格式和扩展格式是不同的。
标准格式的帧包括 DATA LENGTH CODE,一个比特位的 IDE (必须为显性电平 ),以及一个比特位的保留位 r0。 扩展格式的帧包括 DATA LENGTH CODE 和 2 个比特位保留位 r1 和 r0。 保留位必须发送“显性”,但接收器在所有组合中接受“显性”和“隐性”位。如下图:
DATA LENGTH CODE 指示了 DATA FIELD 中的字节数,使用如下的代码指示。该数据长度为 4 个比特位。
从物理上来说,4 位的数据长度代码还可以传输 9-15 的值,但是数据段依旧被限制到 0 ~ 8。部分控制器允许传输或接收大于 8 的 DATA LENGTH CODE 值,但是实际数据长度仍然限制在 8 位。
在 DATA FRAME 内要传输的数据。 它可以包含 0 ~ 8 个字节,每个字节包含 8 位,首先传输 MSB。
由 CRC SEQUENCE 和 CRC DELIMITER 两者组成。共占 16 个比特位(15 + 1)。
X15 + X14 + X10 + X8 + X7 + X4 + X3 + 1
。计算范围:帧起始,仲裁字段,控制字段,数据字段(如果存在)。The frame check sequence is derived from a cyclic redundancy code best suited for frames with bit counts less than 127 bits (BCH Code).ACK FIELD 占 2 个比特位,ACK SLOT 和 ACK DELIMITER 各占一个比特位。
每个 DATA FRAME 和 REMOTE FRAME 由一个由 7 个比特位的隐性电平位组成的标志序列分隔。
通过发送 REMOTE FRAME,需要数据的节点可以请求另一节点发送相应的 DATA FRAME。 DATA FRAME 和相应的 REMOTE FRAME 由相同的 IDENTIFIER 命名。
通常,数据传输是在数据源节点(例如传感器)发出数据帧的情况下自主执行的。但是,目标节点也可以通过发送远程帧来从信息源请求数据。
REMOTE FRAME 也分为标准格式 和 扩展格式,两者的区别与 DATA FRAME 完全相同,这里不再一一展开说明了。这两种格式由以下 6 个不同的位域组成:START OF FRAME、ARBITRATION FIELD、CONTROL FIELD、CRC FIELD、ACK FIELD、END OF FRAME
。格式如下图所示:
与 DATA FRAME 相反,REMOTE FRAME 的 RTR 位是 1 个比特位的隐性电平。 没有 DATA FIELD、CONTROL FIELD 中的 DATA LENGTH CODE 字段表示所请求的消息的数据长度(可以是0 ~ 8),而不是发送的数据长度。
在数据帧和具有相同标识符的远程帧同时发送的情况下,由于数据帧标识符之后的 RTR 位是显性,它将赢得仲裁。
CAN 网络具有严格的错误诊断功能,该功能都是直接在 CAN 芯片中集成的,硬件直接处理整个过程。一旦错误被检测,正在传送的数据帧将会立即停止而待总线空闲时再次重发直至发送成功,该过程并不需要 CPU 的干涉除非错误累计该发送器退隐(Bus Off)。
在发送或者接收报文时,总线上的节点如果检测出了错误,那么该节点就会发送 ERROR FRAME,以通知总线上的其他节点。ERROR FRAME 由 Error Flag 和 Error Del imiter 两个不同的位域组成。长度为 6 ~ 12个比特位的显性电平或者是隐性电平。
检测到错误状态的“错误激活”站通过传输 ACTIVE ERROR FLAG 来发出信号。 ERROR FLAG 的形式违反了从 START OF FRAME 到 CRC DELIMITER 应用于所有字段的位填充法(参见CODING)或破坏固定格式 ACK FIELD 或 END OF FRAME 字段。 结果,所有其他站检测到错误状况,并且他们也开始传输错误标记。 因此,实际上可以在总线上监视的“显性”比特序列是由各个站发送的不同ERROR FLAG的叠加产生的。 该序列的总长度在最小值6和最多12位之间变化。
检测到错误条件的“错误被动”站试图通过传输被动错误标志来发出信号。 “错误被动”站从 PASSIVE ERROR FLAG 开始处等待六个相等极性的连续位。 当检测到这 6 个相等位时,PASSIVE ERROR FLAG 完成。
规范中第 7 个章节专门介绍错误处理
啥是被动错误?啥是主动错误?规范中第 8个章节专门介绍错误界定!
当某个节点快要忙死的时候,规范规定节点可以告诉其他节点,我要休息一会!方式就是发送过载帧,但是,过载帧不是你发就能发的。必须得注意时机。
OVERLOAD FRAME 包含两个位字段 OVERLOAD FLAG 和 OVERLOAD DELIMITER。有两种过载条件可导致过载帧的传输:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加。最多可生成两个 OVERLOAD FRAME 以延迟下一个数据帧或远程帧
DATA FRAME 和 REMOTE FRAME 与前面的帧(数据帧、远程帧、错误帧、过载帧)通过一个称为 INTERFRAME SPACING 的位字段分隔开。
重载帧和错误帧之前没有 INTERFRAME SPACING,多个重载帧之间也没有 INTERFRAME SPACING。帧间隔过后,如果无节点发送帧,则总线进入空闲。
TRANSMITTER: 发起消息的单元称为该消息的 “TRANSMITTER”。 设备保持 TRANSMITTER 直到总线空闲或设备丢失 ARBITRATION。
如果在 END OF FRAME 结束之前没有错误,则该消息对发送器有效; 如果消息出现了错误,则将根据优先级自动执行重新传输。 为了能够与其他消息竞争总线访问,一旦总线空闲,就必须重新开始重传。
RECEIVER: 如果一个单元不是该消息的 TRANSMITTER 并且总线不空闲,则该单元被称为消息的 “RECEIVER”。
如果在 END OF FRAME 的最后一位之前没有错误,则该消息对接收器有效。