
CAN(ControllerAreaNetwork),也就是控制局域网络,简称为CAN。CAN总线主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过CAN总线连接起来的。
CAN总线基本逻辑

ISO11898
CAN总线使用两根线来连接各个单元:CAN_H和CAN_L.通过电位差来确定逻辑电平。CAN总线电平分为显性电平和隐性电平两种。
显性电平:逻辑“0”,CAN_H电平比CAN_L高,分别为3.5V和1.5V,电位差为2V。
隐形电平:逻辑“1”,CAN_H和CAN_L电压都为2.5V左右,电位差为0V。
总线空闲状态时处于隐性。无电位差。
CAN网络中的所有单元都通过CAN_H和CAN_L这两根线连接在一起。

每个单元的CAN_H接总线的CAN_H、CAN_L接总线的CAN_L,CAN总线两端要各接一个120Ω的端接电阻,用于匹配总线阻抗,吸收信号反射及回拨,提高数据通信的抗干扰能力以及可靠性。
CAN协议帧类型
CAN协议提供了5种帧格式来传输数据:
数据帧 用于CAN节点单元之间进行数据传输的帧
遥控帧 用于接收单元向具有相同ID的发送单元请求数据的帧
错误帧 用于当检测出错误时向其它单元通知错误的帧
过载帧 用于接收单元通知其尚未做好接收准备的帧
间隔帧 用于将数据帧及遥控帧与前面的帧分离开来的帧
其中数据帧和遥控帧有标准格式和扩展格式两种,标准格式有11位标识符(ID),扩展格式有29个标识符(ID)。数据帧结构如下:

数据段传输的数据包含0~8个字节。MSB高位先传。下图数据段的0~64为bit,对应到字节就是0~8字节。

在汽车电子行业的开发或者测试中,我们经常会看到CAN总线信号的常见的两种编码格式:Intel格式与Motorola格式。
下面先了解一些必要的定义:
大端模式(Big-Endian):高字节存低地址,低字节存高地址
小端模式(Little-Endian):高字节存高地址,低字节存低地址
LSB:Leastsignificantbyte(CAN某个信号的最低字节/byte)
MSB:Mostsignificantbyte(CAN某个信号的最⾼字节/byte)
lsb:Leastsignificantbit(CAN某个信号中某个字节的最低有效位/bit)
msb:Mostsignificantbit(CAN某个信号中某个字节的最⾼有效位/bit)
CAN报文中的数据
CAN每个报⽂包含8Byte的字节数据域,在报⽂内数据的字节序和位序如下:
字节序:Byte0、Byte1、Byte2、Byte3、Byte4、Byte5、Byte6、Byte7
位序:bit7、bit6、bit5、bit4、bit3、bit2、bit1、bit0

CAN报文数据域的传输顺序为:
字节顺序:先传Byte0,最后传Byte7;
字节内位序:先传bit7,最后传bit0;
Intel格式
Intel格式即小端,MSB存放在高字节单元,反映到矩阵图中就是以起始位为原点,自上而下填充。Intel格式,msb在lsb下面。
比如46这个数字,换为二进制为:101110,长度为6个bit
如果起始位为20的话,那么格式如下图:对应CAN数据为:00 00 B0 02 00 00 00

Motorola格式
Motorola格式即大端,MSB存放在低字节单元,反映到矩阵图中就是以起始位为原点,自下而上填充。Motorola格式,msb在lsb上面。
Motorola_LSB排列格式
比如46这个数字,换为二进制为:101110,长度为6个bit
如果起始位为20的话,那么格式如下图:对应CAN数据为:00 02 E0 00 00 00 00

Motorola_MSB排列格式
比如46这个数字,换为二进制为:101110,长度为6个bit
如果起始位为20的话,那么格式如下图:对应CAN数据为:00 00 17 00 00 00 00

关于CAN报文,用Motorola,还是Intel格式,只在信号数据跨字节解析时,才有区别。单个字节数据没有区别。