4. CAN数据链路层:CAN帧结构详解
CAN数据链路层是协议的核心,它定义了数据如何封装成帧、如何仲裁、如何检错以及如何确认。对于施肥机而言,理解帧结构是解析和设计通信协议的基础。本章将逐字段剖析CAN标准帧(11位ID)的完整结构。
4.1 帧类型概述
CAN总线支持四种帧类型,施肥机通信中最常用的是数据帧和远程帧:
| 帧类型 | 用途 | 施肥机应用场景 |
|---|---|---|
| 数据帧 | 从发送器向接收器传输数据 | 发送施肥量、转速、故障码等 |
| 远程帧 | 请求其他节点发送指定ID的数据 | 主控制器请求传感器数据 |
| 错误帧 | 检测到总线错误时通知所有节点 | 总线干扰或节点故障时触发 |
| 过载帧 | 接收器未准备好时请求延迟 | 处理高优先级数据流时使用 |
4.2 标准数据帧结构(11位ID)
一个完整的CAN标准数据帧由7个位场(Field)组成,总位数为44~108位(含填充位)。下图展示了帧的完整结构:
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):配置参数、诊断信息、非实时状态反馈。
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。
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界定符之前)。
- 接收器在解码时自动移除填充位,恢复原始数据。
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位) | 帧结束 |