CAN代表控制器局域网。这类通信应用于多种系统内部,最常见的是汽车领域。这些系统通常由有线控制器(微处理器/微控制器)组成,彼此之间进行通信。虽然存在支持无线通信的协议和方法,但有线方式更为普遍。与SPI、I2C、USB等类似格式不同,CAN总线采用截然不同的数据通信格式。CAN总线基于差分电压电平工作:
使用两条同步传输数据的通信线缆。分别称为CAN高(Hi)和CAN低(Lo),具有不同电压电平,由各控制器(称为CAN节点)解析。CAN高通常测量值为2.5V至3.75V,而CAN低为2.5V至1.25V。当两条线均为2.5V时,信号称为"隐性",对应二进制值1。当CAN高达3.75V且CAN低至1.25V时,信号称为"显性",对应二进制值0。从数字逻辑角度看(0为低电平,1为高电平),这种设定可能显得反常,但该协议优先识别0值而非1值。因此驱动逻辑与常规数字逻辑解读相反。
基础接线图
该协议的接线方式具有独特特性。相比单线协议,CAN总线的优势在于节点断开时不影响其他节点运行。若某节点的CAN高或CAN低线路切断,系统仍能向其他节点传输数据。某些系统在主线路故障时可沿单线传输数据,但这取决于厂商(并非所有系统都能在CAN高或CAN低线路故障时工作)。线路切断会降低系统性能,因为120欧姆电阻具有双重作用。首先提供高低电平差分,同时为高频系统匹配阻抗。**该协议在差分电压下运行最佳。**双绞线也具备双重功能。其一,可阻挡外部电磁干扰。其二,有助于解决协议高速传输时的电磁干扰问题。
注意这里没有其他线路,这意味着数据包(消息)会同时发送给所有节点。CAN消息数据帧中没有"地址",但数据帧内设有方法来确定每个节点接受或拒绝哪些信息,同时通过用户定义的特定消息实现优先级区分。数据必须设置特定比特位以避免与其他消息冲突,因此优先级是CAN总线解决该问题的关键。
CAN 总线数据格式
与所有协议一样,数据按照既定标准以特定方式组织。CAN总线协议始于CAN 2.0版本,后更新为ISO 11898标准,目前仍在持续发展(已有支持更长消息的扩展版本协议)。完整的CAN帧通常为14字节长。以下是CAN消息的分解说明:
-
SOF(帧起始):标记新CAN消息的开始,让总线上的其他节点同步时序。
-
仲裁字段是包含11位ID的标识符,其中RTR(远程传输请求)位若设置为显性电平,则表示向其他节点请求信息。其他节点只关注这个ID,因为它决定了各个节点是否处理该消息。可以将ID视为类似"主题"的伪地址。如果其他节点不关心该"主题",就会忽略这条消息。不仅如此,ID还决定了避免冲突的优先级。当通信同时发生时,节点会先等待线路空闲(隐性电平)。如果一个节点输出隐性电平而另一个输出显性电平,显性电压始终具有更高优先级。示例如下:
示例:
节点1消息:0011 0110 0000…
节点2消息:0010 1000 1100…
从右向左读取时,节点2消息的第4位将优先发送,因为该位出现显性’0’。节点1检测到此情况后停止发送消息,等待线路恢复空闲。
- R0位预留供未来发展使用。
- 数据长度码占半个字节,指示数据字段中实际发送数据的长度。
- 数据字段包含您想发送给其他节点用于编程的指定数据。
- CRC(循环冗余校验)用于错误检测。若无错误,该位会被显性电平覆盖。
- ACK(确认)是一个隐性位,用于确认无错误(若存在错误则显性位生效)。
- EOF(帧结束)是一个7位字段,标志着CAN消息帧的终止并禁用位填充(同步数据)。
- iFS(帧间间隔)是另一个7位字段,作为延迟使接收节点能将信息移至独立缓冲区。
CAN消息帧包含5种错误纠正机制。其中2种作用于位级别,3种作用于消息级别。位监控和位填充属于位级别机制。每个节点执行位监控,检测仲裁字段中是否存在错误,并以特定方式标记错误。另一种位级别纠错机制是位填充。当连续发送5个相同电平位时,会插入第6个相反电平(隐性或显性)位,从而实现与发送器的同步。接收端可轻松移除该填充位,因为每个节点都预知此额外位。
两种消息级别机制分别是帧校验与CRC/ACK字段。帧校验会验证所有CAN部件是否存在,并检查ACK和CRC后是否出现隐性位。发生错误时存在两个阈值。首次出现错误时,将某位设为显性作为标志位,并递增该节点的计数器。若计数器值为1,则发送隐性错误标志,总线通信正常继续。但当计数器达到2时,表明存在严重错误,该节点将关闭。若消息成功发送且无错误,计数器数值会下降。
如需自行实验CAN总线,可使用以下评估板: