CAN的报文格式

CAN总线报文由帧起始、仲裁段、控制段、数据段、CRC段、ACK段和帧结束组成,支持标准格式(11位ID)和扩展格式(29位ID)报文。在仲裁过程中,ID值越小优先级越高。数据段可包含0-8个字节,CRC段用于错误检测。错误帧和远程帧是CAN总线的特殊帧类型,分别用于处理错误和请求数据。过载帧则用于延缓发送,确保接收节点准备好接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. CAN的报文格式

    在总线中传送的报文,每帧由7部分组成。CAN协议支持两种报文格式,其唯一的不同是标识符(ID)长度不同,标准格式为11位,扩展格式为29位。

    在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。

    控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个位用来指明数据场中数据的长度(DLC)。数据场范围为0~8个字节,其后有一个检测数据错误的循环冗余检查(CRC)。

    应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。

    报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。

    如图11所示,具体某一位或某几位下面会详细介绍。

    图11 CAN总线报文结构

  2. 数据帧

    数据帧是使用最多的帧,结构上由7段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。

    数据帧是由:帧起始,仲裁断,控制端,数据段,CRC段,ACK段和帧结束构成。

    如图21所示(具体的帧结构下面会详细介绍)。

    图2–1数据帧类型及结构

  3. 帧起始和帧结束

    帧起始:由单个显性位组成,总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。

    帧结束:由7个连续的隐形位组成。

    (注:显性电平和隐性电平是相对于CAN_H和CAN_L而言的差分信号电平,并非TTL电平上的高低电平,需要注意)如图2-2所示。

     

    图2–2帧起始和帧结束

  4. 仲裁段

    CAN-bus是如何解决多个节点同时发送数据,即总线竞争的问题?该问题由仲裁段给出答案。

    CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。如图23所示

     

    图2–3数据帧结构

    如图24所示CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。

    图2–4仲裁处理

    假设节点A、B和C都发送相同格式相同类型的帧,如标准格式数据帧,它们竞争总线的过程是(如图16所示):

    图2–5仲裁机制

    从该分析过程得出结论是:帧ID值越小,优先级越高;

    对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理

  5. 控制段

    控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成如图17所示。

    图2–6数据帧结构

  6. 数据段

    一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合如图27所示。

    图2–7数据段

    数据量小,发送和接收时间短,实时性高,被干扰的概率小,抗干扰能力强。

  7. CRC段

    CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成如图28所示。

    图2–8CRC段

  8. ACK段

    当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图29所示。

    图2–9 ACK段

  9. 远程帧

    与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)如图31所示。

    图3–1远程帧结构

    如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。

    所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高如图32所示:

    图3–2数据帧于远程帧仲裁机制

     

    图3–3数据帧远程帧比较

    数据帧与远程帧的区别如图33所示。

     

  10. 错误帧

    尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种(如图41所示)。

    图4–1错误帧类型

    当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识如图42所示。

    图4–2错误帧电平结构

    为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态及其行为如图43所示。

    图4–3错误处理机制

    (注:这些错误处理的机制是由硬件自主完成的这样做的目的就是只要CAN在收到数据肯定是正确的数据)。

     

  11. 过载帧与帧间隔

  12. 过载帧

    当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成如所示图51。

    图5–1过载帧结构

    由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象如所示图52。

    图5–2过载帧具体结构

  13. 帧间隔

    帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。

    帧间隔过后,如果无节点发送帧,则总线进入空闲。

    帧间隔过后,如果被动错误节点要发送帧,则先发送8个隐性电平的传输延迟,再发送帧。

  14. CAN总线发送总流程

    CAN-bus整个链路层处理数据的流程是如图61所示:

    图6–1CAN总线发送总流程

     

  15. 参考资料

    《项目驱动--CAN-BUS现场总线基础教程----周立功,黄晓清》。

    《现场总线技术及其应用第二版–清华大学出版社》。

### CAN报文格式详解 CAN(Controller Area Network)是一种广泛应用于汽车电子和工业自动化中的串行通信协议。以下是关于CAN报文格式的具体分析: #### 1. 报文基本组成 CAN报文由多个字段构成,这些字段共同决定了数据的传输过程以及接收方如何正确解析数据。具体来说,一个完整的CAN数据帧可以划分为以下几个部分[^3]: - **帧起始**: 表示数据帧开始的部分。 - **仲裁段**: 包含标识符(ID)的信息,用于决定消息的优先级。根据ID长度不同,可分为标准帧(11位ID)[^3] 和扩展帧(29位ID)[^4]。 - **控制段**: 主要包含数据长度码(DLC),指示后续数据场中实际携带的有效载荷大小,范围为0至8字节[^4]。 - **数据段**: 实际待传递的数据内容区域,最多支持8个字节。 - **CRC段**: 循环冗余校验字段,用于验证整个帧在传输过程中是否发生错误。 - **应答段(ACK)**: 接收节点在此处反馈确认信号给发送者,表明已成功无误地接收到指定信息。 - **帧结束**: 明确告知当前帧已完成传输。 #### 2. 数据编码方式 - Intel vs Motorola 当涉及到多字节数据时,存在两种主要的字节序定义方法——Intel格式与Motorola格式[^2]: - **Intel 格式**: - 又称为小端模式(Little Endian)。 - 特点在于较低有效位先行传输,即低字节位于前面位置。 - 解析实例:假设车速数值`0x3FF`, 它会被分割成两个连续字节 `{BYTE0=0xFF, BYTE1=0x03}` 进行序列化处理,并最终通过 `(BYTE1<<8 | BYTE0)` 计算还原原始值[^2]。 - **Motorola 格式**: - 被认为是大端模式(Big Endian) 的体现形式之一。 - 高效有效位被安排到最前端予以传达出去。 - 同样以上述例子而言,则会按照 `{BYTE0=0x03, BYTE1=0xFF}` 来组织流经网络介质上的比特流,之后借助表达式 `(BYTE0<<8 | BYTE1)` 达成解码目的[^2]。 ```python def decode_can_message(data_bytes, encoding='intel'): if encoding.lower() == 'motorola': value = (data_bytes[0] << 8) | data_bytes[1] elif encoding.lower() == 'intel': value = (data_bytes[1] << 8) | data_bytes[0] return value # Example usage example_data_motorola = [0x03, 0xFF] example_data_intel = [0xFF, 0x03] print(decode_can_message(example_data_motorola, 'motorola')) # Output should be 1023 print(decode_can_message(example_data_intel, 'intel')) # Output also will be 1023 ``` #### 结论 综上所述,理解并掌握CAN报文中各组成部分的功能及其相互关系至关重要。此外,在面对涉及多位数或者复合型参数的情况下,还需要特别留意所选用的具体字节排列规则(Intel 或 Motorola),因为这直接影响到最后能否准确解读出预期的结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值