CAN是指Controller Area Network,即控制器局域网,是一种用于控制领域内多个设备之间通信的高速串行通信协议。CAN总线广泛应用于汽车、飞机、火车及工业自动化等领域。
在CAN总线上,CAN节点(即CAN总线上的设备)可以发送和接收数据包。每一个数据包的起始都是一个由低电平变为高电平的断电信号(称为“帧同步”)。
CAN总线上的数据包由一个11位或29位的标识符组成,这个标识符用于描述这个数据包是属于哪一个节点、属于哪一类数据和是否是一个紧急事件。对于11位标识符的情况,前三位定义了数据帧的类型,第四位表示一个远程帧(Remote Frame)请求(RTR),后三位表示CAN节点的地址。对于29位标识符的情况,则还定义了扩展的CAN节点地址和时间戳。
在CAN总线上,CAN节点会自由地发出数据包(包括带数据的远程帧和数据帧)。当CAN节点开始发送数据时,如果此时CAN总线上没有其它节点正在发送帧,则数据包会直接发送。对于同时开始发送的多个节点,则会根据标识符的优先级来决定哪一个数据包将被发送。
CAN总线上的数据包由一组仲裁场(Arbitration Field)和数据场(Data Field)组成,仲裁场用于标识数据包的标识符,数据场则用于携带数据。数据包的长短是任意的,最长的消息长度可以达到2048位。
在CAN总线上,如果同时有多个CAN节点开始发送数据包,则CAN总线上的信号会显示为一个低电平。如果在数据归一化的途中发生了一个高电平信号,表示此时有一个节点正在发送一条更高优先级的数据包,因此其他节点应该停止发送数据,以等待先前高优先级的数据包被完全发送。
因此,CAN总线的隐性定义是:如果总线上没有数据包被传输,则总线上的信号保持为高电平;如果一条数据包正在传输,则总线的信号为低电平。在某一时间点上,如果有多个节点尝试同时发送数据包,则哪个数据包将被发送是由仲裁场中的标识符优先级决定的。
由于CAN总线是在差分信号上工作的,因此在信噪比较低的情况下,CAN总线仍能保持良好的通信质量。此外,CAN总线在总线带宽可达1 Mbps的情况下支持多个节点,这使得CAN总线成为了工业和汽车领域中最常用的总线之一。
CAN总线的显隐性定义也保证了实现良好的数据包处理能力,同时也使得CAN总线能够适用于多个应用场景。隐性定义使得一个低优先级的节点不会干扰和延误高优先级节点的通信,因此总线上的数据包更容易被传输成功。
CAN总线的显隐性定义并非完美的,由于众所周知的限制,它无法响应数据丢失和延误。此外,由于总线带宽和总线节点数量的限制,CAN总线可能难以扩展到一些特定应用场景中。
最后,CAN总线被认为是商标和专利保护的一个典型例子,这也使得开发人员的成本显著增加。