你知道CAN消息帧吗？
user
你知道CAN消息帧吗？
assistant
那么CAN消息实际上是什么样子的呢？ 最初的ISO标准制定了所谓的标准CAN。 标准CAN对不同的报文使用11位标识符，总共有211个，即2048个不同的报文ID。 CAN后来做了修改，标识符扩展为29位，得到229个标识符。 这称为扩展 CAN。 CAN使用多主总线，所有消息都在整个网络上广播。 标识符提供仲裁的消息优先级。
CAN使用具有两种逻辑状态的差分信号，称为隐性和主导。 隐性状态表示差分电压小于最小阈值电压。 主导状态指示差分电压大于此最小阈值。 有趣的是，主导状态是通过将逻辑“0”驱动到总线上来实现的，而隐性状态是通过逻辑“1”来实现的。 这与大多数系统中使用的传统高和低相反。 重要的是，在仲裁过程中，主导状态优先于隐性状态。
标准CAN
标准CAN消息帧由许多位字段组成。
第一位是帧开始 (SOF)。 该主导位代表CAN消息的开始。 接下来是11位标识符，它确定CAN消息的优先级。 标识符越小，消息的优先级越高。
远程传输请求(RTR)位通常为主导位，但当一个节点向另一节点请求数据时，该位会变为隐性。 当发送标准CAN帧而非扩展帧时，标识符扩展(IDE)位占主导地位。 r0 位被保留，当前未使用。 数据长度代码 (DLC) 半字节表示此消息中有多少个数据字节。
接下来是数据本身，其字节数与 DLC 位中表示的字节数相同。 循环冗余校验 (CRC) 是一个 16 位校验和，用于检测传输数据中的错误。 如果消息被正确接收，接收节点将用显性位覆盖隐性确认位 (ACK)。 ACK 还包含一个分隔符位以保持同步。 帧结束 (
EOF
) 表示 CAN 消息的结束，为 7 位宽，用于检测位填充错误。 CAN 消息的最后一部分是帧间空间 (IFS)，用作时间延迟。 该时间延迟正是 CAN 控制器将接收到的消息移至缓冲区以进行进一步处理所需的时间量。
扩展CAN
扩展CAN使用29位标识符以及一些附加位。 扩展消息在11位标识符后面有一个替代远程请求 (SRR) 位，它充当占位符以保持与标准CAN相同的结构。 这次标识符扩展（IDE）应该是隐性的，表示后面跟着扩展标识符。 RTR 位位于 18 位 ID 之后，后面是第二个保留位 r1。 消息的其余部分保持不变。
FlexCAN是一种CAN总线的扩展，它是一种嵌入式网络架构，由凯特林大学的胡安·皮门特尔博士设计的，它的灵感来自于FlexRay以及通过CAN网络提供更具确定性行为的需求。 其重点是硬件级别的冗余以及协议级别基于时间的优先通信。
关于FlexCAN参见文章FlexCAN:
A Flexible Architecture for Highly Dependable Embedded Application
CAN消息类型
CAN允许四种不同的消息类型。 它们是数据帧、远程帧、过载帧和错误帧。
标准CAN数据帧使用标识符、数据和数据长度代码、循环冗余校验和确认位。 RTR和IDE位在数据帧中均占主导地位。 如果接收端的隐性确认位被显性位覆盖，则发送器和接收器都认为这是成功的传输。
CAN远程帧看起来与数据帧类似，只是它不包含任何数据。 发送时RTR位处于隐性状态，这表明它是一个远程帧。 远程帧用于从节点请求数据。
当节点检测到CAN总线上的消息中存在错误时，它会发送错误帧。 这会导致所有其他节点发送错误帧。 此后，发生错误的节点重新传输该消息。 过载帧的工作原理类似，但当节点接收帧的速度快于处理帧的速度时使用。 该帧提供了时间缓冲区，以便节点可以赶上。