帧 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧。 |
遥控帧 | 用于接收单元向具有相同ID的发送单元请求数据的帧。 |
错误帧 | 用于当检测出错误时向其它单元通知错误的帧。 |
过载帧 | 用于接收单元通知其尚未做好接收准备的帧。 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧。 |
数据帧
数据帧用于在总线上进行数据传输,其结构根据标准帧(也称作基础帧、11位标识符帧)和扩展帧(29位标识符帧)有所不同。下面是这两种类型数据帧的基本组成:
标准数据帧 (11位ID)
- 起始位(SOF): 表示数据帧的开始。
- 仲裁段:
- 11位标识符(Identifier): 用于确定消息的优先级。
- 远程发送请求(RTR)位:数据帧中该位为显性电平,表示这是一个数据帧而不是远程帧。
- 控制段:
- IDE位:指示是否使用标准或扩展格式(对于标准帧此位为显性)。
- r0保留位。
- 数据长度码(DLC): 表示数据字段中的字节数量(0-8字节)。
- 数据段: 包含要发送的数据,最多8个字节。
- CRC段: 循环冗余校验序列,用于错误检测。
- ACK段: 确认位和分隔符,确认有节点成功接收了该消息。
- 结束帧(EFF): 表示数据帧的结束。
扩展数据帧 (29位ID)
与标准数据帧相比,扩展数据帧多了SRR位和18位额外的标识符,使得整个标识符达到29位长:
- 起始位(SOF): 同标准帧。
- 仲裁段:
- 11位标识符。
- 替代远程请求(SRR)位:总是隐性的,在扩展帧中代替RTR位。
- IDE位:在扩展帧中是隐性的,表明这是扩展格式。
- 18位额外的标识符部分。
- RTR位:位于扩展标识符之后。
- 其余部分(控制段、数据段、CRC段、ACK段、EFF)与标准数据帧相同。
这些组成部分共同确保了CAN网络能够高效且可靠地进行通信。
遥控帧
遥控帧(Remote Frame)用于请求特定ID的数据帧。与数据帧相似,遥控帧也分为标准格式(11位标识符)和扩展格式(29位标识符)。但是,遥控帧并不包含数据段,其主要用途是向网络中的其他节点请求发送具有相同标识符的数据帧。以下是遥控帧的基本组成结构:
标准遥控帧 (11位ID)
- 起始位(SOF): 表示遥控帧的开始。
- 仲裁段:
- 11位标识符(Identifier): 用来匹配目标数据帧的标识符。
- 远程发送请求(RTR)位:在遥控帧中该位为隐性电平,以区别于数据帧。
- 控制段:
- IDE位:指示是否使用标准或扩展格式(对于标准遥控帧此位为显性)。
- r0保留位。
- 数据长度码(DLC): 虽然遥控帧不携带数据,但仍需指定DLC来匹配所请求的数据帧的数据长度。
- CRC段: 循环冗余校验序列,用于错误检测。
- ACK段: 确认位和分隔符,确认有节点成功接收了该消息。
- 结束帧(EFF): 表示遥控帧的结束。
扩展遥控帧 (29位ID)
与标准遥控帧相比,扩展遥控帧增加了SRR位和额外的18位标识符,使得整个标识符达到29位长:
- 起始位(SOF): 同标准遥控帧。
- 仲裁段:
- 11位标识符。
- 替代远程请求(SRR)位:总是隐性的,在这里没有实际功能,主要是为了保持与扩展数据帧的一致性。
- IDE位:在扩展遥控帧中是隐性的,表明这是扩展格式。
- 18位额外的标识符部分。
- RTR位:位于扩展标识符之后,并且同样设置为隐性以表示这是一个遥控帧。
- 其余部分(控制段、CRC段、ACK段、EFF)与标准遥控帧相同。
遥控帧通过这种机制让网络上的节点能够主动请求信息,而不是等待数据帧自发地被广播。这对于需要即时响应或特定数据的应用非常有用。
错误帧
错误帧用于通知网络上的所有节点发生了传输错误。当任何节点检测到总线上的消息存在错误时,它会发送一个错误帧来中断当前的传输,并促使其他节点也识别出该错误。错误帧由两个不同的字段组成,旨在打破正常的消息流并确保网络上所有的节点都能察觉到错误的发生。
错误帧组成
-
错误标志叠加(Error Flag Superposition):
- 由6个连续的显性位组成(对于高速CAN)。这是违反了CAN协议中的位填充规则(每5个相同电平的位之后必须跟一个相反电平的位),因此可以有效地打断正在传输的数据帧或遥控帧。
- 当多个节点同时检测到错误并尝试发送它们自己的错误标志时,这些标志会在总线上叠加,可能会导致超过6个显性位出现。这是因为每个节点都试图通过发送自身的错误标志来中断通信,结果可能产生更长的显性位序列。
-
错误界定符(Error Delimiter):
- 包含8个隐性位,作为缓冲区,帮助区分错误标志和后续可能开始的新消息。
- 这部分允许总线恢复平静状态,为接下来的信息传输做好准备。
工作原理
- 当某个节点检测到错误(例如位错误、填充错误、ACK错误等),它会立即开始发送错误标志,从而破坏当前的位流。
- 其他监听的节点也会检测到这个不寻常的位模式(即连续的显性位),并理解这是一个错误信号。
- 在错误标志后跟随的错误界定符确保了网络有一个清晰的间隔来恢复正常操作,防止新旧信息之间的混淆。
通过这种方式,CAN协议能够快速响应并纠正传输过程中的错误,确保数据的准确性和可靠性。此外,这种机制还支持分布式错误处理,使得网络中的每一个节点都能够参与到维护通信质量的过程中。
过载帧
过载帧用于通知网络上的其他节点当前节点暂时无法处理更多的消息,即表示接收方负载过重。过载帧主要用于防止接收方因数据量过大而发生溢出或丢失信息的情况。过载帧的结构与错误帧相似,但其用途和触发条件不同。
过载帧组成
过载帧由两个主要部分组成:
-
过载标志(Overload Flag):
- 类似于错误标志,过载标志也是由6个连续的显性位组成。
- 这种序列违反了CAN协议中的位填充规则(每5个相同电平的位之后必须跟一个相反电平的位),因此可以有效地打断正在传输的数据帧或遥控帧。
- 如果多个节点同时检测到过载情况并尝试发送它们自己的过载标志时,这些标志会在总线上叠加,可能会导致超过6个显性位出现。
-
过载界定符(Overload Delimiter):
- 包含8个隐性位,作为缓冲区,帮助区分过载标志和后续可能开始的新消息。
- 这部分允许总线恢复平静状态,为接下来的信息传输做好准备。
触发条件
过载帧通常在以下两种情况下被发送:
- 第一类过载条件:接收方在处理完前一帧后,没有足够的时间来处理即将到来的新帧。这种情况下,接收方需要一些额外的时间来完成当前的操作。
- 第二类过载条件:当一个节点检测到一个错误,并且该错误是在它已经开始了对一个帧的接收之后发现的。但是,在现代实现中,这种情况很少见,因为大多数情况下,错误会通过错误帧来处理。
工作原理
- 当某个节点遇到上述任一过载条件时,它将发送过载标志以中断当前的传输。
- 其他监听的节点也会检测到这个不寻常的位模式(即连续的显性位),并理解这是一个过载信号。
- 在过载标志后跟随的过载界定符确保了网络有一个清晰的间隔来恢复正常操作,防止新旧信息之间的混淆。
通过这种方式,CAN协议能够灵活应对网络中各个节点的不同处理能力,避免由于处理速度不匹配导致的数据丢失或其他通信问题。这增强了CAN网络的稳定性和可靠性。
帧间隔
帧间隔用于分隔不同的数据帧、遥控帧或错误帧,确保网络通信的有序进行。帧间隔的存在有助于避免消息之间的混淆,并为接收节点提供时间来处理接收到的信息。帧间隔主要由三个部分组成:间歇场(Intermission)、总线空闲(Bus Idle)和等待空闲(Suspension),但通常讨论时主要关注的是间歇场部分。以下是详细说明:
帧间隔的组成
-
间歇场 (Intermission):
- 间歇场是帧间隔的核心组成部分,它由3个隐性位组成。
- 它的作用是在两个连续的数据帧、遥控帧或错误帧之间提供一个短暂的间隔,允许网络上的各个节点准备接收下一个可能到来的消息。
- 在标准CAN(ISO 11898-2)中,这个间隔对于保持网络同步至关重要。
-
总线空闲 (Bus Idle):
- 总线空闲并不是严格意义上的帧间隔的一部分,但它是一个重要的概念,指的是网络上没有任何活动的状态。
- 在总线空闲期间,任何节点都可以开始传输新的消息。
- 这个状态没有固定的时间长度,可以持续任意长的时间,直到有节点发起新的传输为止。
-
等待空闲 (Suspension, 仅适用于扩展帧格式):
- 等待空闲是指发送节点在发送完一帧后需要等待一段时间才能发送下一帧的情况。
- 在实际应用中,这个概念较少被单独提及,因为现代实现中更注重间歇场的应用。
- 对于某些特定配置或者高级应用场景,可能会涉及到此机制以确保网络稳定性和数据传输的正确性。
工作原理
- 在发送完一个数据帧、遥控帧或错误帧之后,发送节点会发出间歇场,通知其他节点当前帧已经结束。
- 接收节点利用这段时间来处理接收到的信息并准备接收下一个可能到来的消息。
- 如果在一个间歇场结束后,没有新的消息立即开始传输,则网络进入总线空闲状态,直到有节点开始新的传输。
通过这种机制,CAN协议确保了即使在网络负载较高的情况下,也能维持有效的信息分离和适当的处理时间,从而保证了通信的可靠性和效率。