4. CAN数据链路层:CAN帧结构详解

CAN数据链路层是协议的核心,它定义了数据如何封装成帧、如何仲裁、如何检错以及如何确认。对于施肥机而言,理解帧结构是解析和设计通信协议的基础。本章将逐字段剖析CAN标准帧(11位ID)的完整结构。

4.1 帧类型概述

CAN总线支持四种帧类型,施肥机通信中最常用的是数据帧和远程帧:

帧类型 用途 施肥机应用场景
数据帧 从发送器向接收器传输数据 发送施肥量、转速、故障码等
远程帧 请求其他节点发送指定ID的数据 主控制器请求传感器数据
错误帧 检测到总线错误时通知所有节点 总线干扰或节点故障时触发
过载帧 接收器未准备好时请求延迟 处理高优先级数据流时使用

4.2 标准数据帧结构(11位ID)

一个完整的CAN标准数据帧由7个位场(Field)组成,总位数为44~108位(含填充位)。下图展示了帧的完整结构:

关键记忆点:帧起始(SOF)为显性位“0”,是整个帧的同步标志;仲裁场决定总线访问优先级;数据场承载施肥机实际参数。
CAN标准数据帧(11位ID)结构图 SOF 1位 仲裁场 12位(ID+RTR) 控制场 6位 数据场 0~64位(0~8字节) CRC场 16位 ACK场 2位 EOF 7位 各字段说明: • SOF(帧起始):1位显性位,同步所有节点时钟。 • 仲裁场:11位标识符(ID)+ 1位RTR,决定优先级。 • 控制场:IDE + r0 + DLC(4位数据长度码)。 • 数据场:0~8字节,承载施肥机实际参数(如排肥轴转速、流量)。 • CRC场:15位CRC校验 + 1位CRC界定符,保证数据完整性。 • ACK场:1位ACK槽 + 1位ACK界定符,接收器确认。

4.3 逐字段深度解析

4.3.1 SOF(帧起始)

SOF由1个显性位(逻辑0)构成。在总线空闲(隐性位)状态下,SOF的下降沿用于同步所有节点的位时钟。施肥机系统中,SOF标志着一次通信的开始,所有节点从此时开始采样。

4.3.2 仲裁场(Arbitration Field)

仲裁场包含11位标识符(ID)和1位RTR(远程发送请求)。ID越小,优先级越高。施肥机协议中,ID分配遵循以下原则:

  • 高优先级(ID 0x000~0x07F):紧急故障码、安全相关指令(如急停)。
  • 中优先级(ID 0x080~0x1FF):实时控制参数(如排肥轴目标转速、阀门开度)。
  • 低优先级(ID 0x200~0x7FF):配置参数、诊断信息、非实时状态反馈。
仲裁机制要点:当多个节点同时发送时,显性位(0)会覆盖隐性位(1)。发送隐性位的节点在发送过程中检测到总线为显性,则立即退出竞争。这一机制保证了高优先级帧(ID小)的实时性。

4.3.3 控制场(Control Field)

控制场共6位,结构如下:

位域 位数 说明
IDE(标识符扩展位) 1 标准帧中为显性(0),扩展帧中为隐性(1)
r0(保留位) 1 显性位(0),保留给未来扩展
DLC(数据长度码) 4 表示数据场字节数(0~8),施肥机常用2、4、8字节

DLC编码规则:0000=0字节,0001=1字节,…,1000=8字节。施肥机协议中,DLC必须与实际数据长度严格匹配,否则接收器会丢弃帧。

4.3.4 数据场(Data Field)

数据场承载实际传输信息,长度为0~8字节。施肥机通信中,数据场通常按以下方式组织:

  • 2字节(16位):用于单参数传输,如排肥轴转速(0~3000 rpm)。
  • 4字节(32位):用于多参数组合,如目标流量+实际流量。
  • 8字节(64位):用于完整状态帧,包含多个传感器数据或配置参数。
// 施肥机数据场示例:排肥轴转速控制帧(4字节)
// 字节0-1:目标转速(uint16,单位rpm)
// 字节2-3:实际转速(uint16,单位rpm)
// 示例:目标转速 1200 rpm,实际转速 1185 rpm
// 数据场:0x04 0xB0 0x04 0xA1
// 解析:目标转速 = 0x04B0 = 1200 rpm
//       实际转速 = 0x04A1 = 1185 rpm

4.3.5 CRC场(循环冗余校验)

CRC场包含15位CRC序列和1位CRC界定符(隐性位)。CRC计算覆盖SOF、仲裁场、控制场和数据场。生成多项式为:

CRC多项式:x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1

接收节点计算本地CRC并与发送的CRC序列比较,不一致则发送错误帧。施肥机田间作业时,振动和电磁干扰可能导致位错误,CRC是保障数据完整性的第一道防线。

4.3.6 ACK场(应答场)

ACK场共2位:

  • ACK槽(1位):发送器输出隐性位(1),所有正确接收的节点在此位输出显性位(0)进行确认。如果发送器检测到隐性位,说明无节点接收,帧将被重发。
  • ACK界定符(1位):隐性位(1),用于分隔ACK场和EOF。
常见问题:在施肥机多节点网络中,如果某个节点未正确配置验收滤波器,可能导致ACK缺失,发送器会不断重发同一帧,造成总线负载升高。务必确保每个接收节点的滤波器设置正确。

4.3.7 EOF(帧结束)

EOF由7个隐性位(1)构成,标志帧的结束。在EOF之后,总线进入帧间隔(Interframe Space),至少3个隐性位,然后才能开始下一帧。EOF期间任何显性位都会被当作错误处理。

4.4 远程帧结构

远程帧用于请求数据,其结构与数据帧类似,但有以下区别:

  • RTR位为隐性(1):表示这是一个远程请求帧。
  • 数据场为空:DLC表示请求的数据长度,但无实际数据字节。
  • 无数据场:帧长度更短,仅44位(含填充)。

施肥机中,主控制器可通过远程帧请求传感器节点发送当前流量值,传感器节点收到后发送对应ID的数据帧作为响应。

4.5 位填充机制

CAN协议采用位填充(Bit Stuffing)来保证时钟同步的稳定性:

  • 发送器在连续发送5个相同电平的位后,自动插入一个相反电平的填充位。
  • 填充位覆盖SOF到CRC场(含CRC界定符之前)。
  • 接收器在解码时自动移除填充位,恢复原始数据。
位填充示例:连续5个显性位后插入隐性填充位 原始位: 0 0 0 0 0 1 填充后: 0 0 0 0 0 1 1 填充位(橙色)插入在第5个显性位之后 接收器自动移除填充位,恢复原始数据

4.6 帧结构在施肥机中的实际应用

以下是一个完整的施肥机数据帧示例,展示各字段的实际值:

字段 值(二进制/十六进制) 说明
SOF 0 帧起始
ID(11位) 0x123 = 0001 0010 0011 排肥轴转速控制帧
RTR 0 数据帧
IDE 0 标准帧
r0 0 保留位
DLC 0100 = 4 4字节数据
数据场 0x04B004A1 目标转速1200rpm,实际转速1185rpm
CRC 0x7A3F(15位) 校验结果
ACK 0(显性) 接收器确认
EOF 1111111(7位) 帧结束
本章小结:CAN帧结构是施肥机通信协议的基石。SOF提供同步,仲裁场实现优先级控制,数据场承载实际参数,CRC保证完整性,ACK提供确认机制。掌握每个字段的作用和约束,是设计可靠施肥机通信协议的前提。