1 CAN通信简介
CAN是控制器局域网络(Controller Area Network, CAN)的简称,1986年被德国研发和生产汽车电子产品著称的BOSCH公司所开发,并最终成为国际标准(ISO11898),是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。
Controller Area Network,控制器局域网。
CAN-bus
规范定义了物理层
和数据链路层
,CANopen
、DeviceNet
等定义应用层
,应用层可自行设计。支持多主通信模式。
2 CAN总线通信物理层
2.1 硬件连接
-
CAN控制器:集成在控制单元内部,处理控制单元中的数据后传给CAN收发器;同时接受收发器的数据,处理并传给控制单元;
有的微控制器内部已经包含了CAN控制器,只需要外加CAN收发器,收发器一般是8个引脚的芯片。比如STM32:STM32+SN65HVD230(3.3V)。
-
CAN收发器:集成在控制单元内部,将CAN控制器传来的数据化为电信号并通过传输线发送;同时曾接受传输线上来的数据给CAN控制器。
CAN收发器将逻辑信号(TXD、RXD)和物理信号(CANH、CANL)相互转换:CAN控制器向着CAN收发器的TX引脚发送数据,经过CAN收发器转换成差分信号。(相当于数字调制)
-
数据传输线:两条铜导线形成了双绞线结构,分为CAN高位数据线
CAN_H
和低位数据线CAN_L
,具备有效的抗电磁干扰功能。信号差分传输,可以有效抑制共模干扰:差分信号即使由环境问题影响,也是同时影响两根线,两者做差可以抵消这个环境引起的变化
-
终端电阻:布置在CAN网络的两个终端位置,防止数据在线端被反射,以回声的形式返回,影响数据的传输的准确性。
阻抗匹配: 对于高速信号一般这个电阻设置为120Ω。为什么是120Ω:因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。低速CAN总线在CANH和CANL上分别串接2.2kΩ的电阻(也可以不接)。
2.2 CAN总线上的电平信号
CAN协议经过ISO标准化后有两个标准ISO11898
标准和ISO11519-2
标准。其中ISO11898
是针对通信速率为125Kbps~1Mbps
的高速通信标准(闭环),而IS011519-2
是针对通信速率为125Kbps
以下的低速通信标准(开环)。
拿标准ISO11898
来说:
-
Recessive:隐性(代表逻辑1)
CAN_H
=2.5VCAN_L
= 2.5V 两条线上的电压差:0V -
Dominant:显性(代表逻辑0)
CAN_H
=3.5VCAN_L
=1.5V 两条线上的电压差:2V
2.3 CAN总线的测量
-
电阻值测量
- (1) 测试工具
- 万用表
- 示波器
- (2) 测试方法
- A、终端电阻
- 第一步:将电池正极断开,整车断电
- 第二步:万用表调到电阻档
200Ω
量程。 - 第三步:将万用表的两个表笔连接到诊断接口引脚(
CAN_H
)和引脚(CAN_L
)两端,测量PCAN
的电阻值,若电阻值为60±10
Ω,则测试通过。
- A、终端电阻
- (1) 测试工具
-
电压测量
分别测量两个引脚电压是否满足标准
3 CAN总线通信数据链路层
单线CAN、低速CAN、高速CAN在数据链路层都相同,支持CAN2.0规范。数据链路层解决收发目标选择、数据校验、总线竞争、错误机制等问题。CAN-bus规定了5种通信帧——数据帧、远程帧、错误帧、过载帧、帧间隔。CAN控制器实现了数据链路层的全部功能以及物理层的位定时功能。
名称 | 帧用途 |
---|---|
数据帧 | 用于发送单元向接收单元传送数据的帧 |
遥控(远程)帧 | 用于接收单元向具有相同 ID 的发送单元请求数据的帧 |
错误帧 | 用于当检测出错误时向其它单元通知错误的帧。 (硬件自动完成) |
过载帧 | 当一个节点正忙于处理接收的信息,可以通知其它节点暂缓发送新报文。(硬件自动完成) |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来的帧(硬件自动完成) |
数据帧
特点:用于传输数据,使用最多,分为标准帧CAN2.0A和扩展帧CAN2.0B。(报文滤波如何实现的?通信矩阵)
名称 | 描述 |
---|---|
帧起始 | 表示帧的开始,产生一个bit的显性电平。 |
仲裁段 | 表示帧的优先级, 由标识符(ID)和传送帧类型(RTR)组成。 |
控制段 | 表示数据的字节数,由6个bit构成 |
数据段 | 数据的具体内容,可发送0~8 个字节的数据。 |
CRC段 | 用于校验传输是否正确。 |
ACK段 | 表示确认是否正常接收。 |
帧结束 | 表示此帧结束。 |
帧起始
1bit
显性电平,助记符为SOF
。作用是进行硬同步
。(因为帧间隔是隐性电平,这样在帧起始时会有一个跳变,便于同步检测)
仲裁段
对于CAN2.0A
,仲裁段由11bit ID
和1bit RTR
位组成,ID
规定了数据帧的优先级,ID
越小优先级越高;RTR
位是远程发送请求位,标明该帧是数据帧还是远程帧,数据帧该位为显性,远程帧该位为隐性,因此,当ID
相同时,数据帧的优先级高于远程帧。ID
高7
位ID10-ID4
不得全为隐性。
对于CAN2.0B
,差别仅仅在于在标准帧11
位ID后面插入了1bit
显性的替代远程帧请求位SRR
,将标准帧中位于控制段的扩展识别位IDE
接在SRR
后面,然后接上扩展的18bit ID
。扩展帧ID
有29
位。标准帧的优先级高于扩展帧。标准帧IDE
为显性,扩展帧为隐性。
CAN控制器会监测数据线上的电平与发送位的电平,如果不相同,停止发送,如果该位在仲裁段,则退出总线竞争,如果不在仲裁段,则产生错误(除了ACK段和被动错误标志传输时)。
ID禁止高7位全为隐性。在任何情况下,总线上不可能有多个设备在同一时刻使用同一个ID传输数据帧。
控制段
对于CAN2.0A
,控制段由IDE、保留位r0、4位的数据段长度码DLC共6位组成。DLC表示数据段数据的字节数,取值0到8,用BCD码表示。
对于CAN2.0B
,控制段由保留位r1、r0和4位长度码DLC共6bit组成。
数据段
数据段包含0到8个字节,byte0在前,每个字节先传MSB。数据量小,实时性高。
CRC段
CRC校验,将前4段所有位进行模2除以多项式\([X^{15}+X^{14}+X^{10}+X^{8}+X^{7}+X^{4}+X^3+1]\)得到15位CRC值,再加上一位隐性的CRC界定符组成16位的CRC段。
ACK段
由一位ACK槽和一位ACK界定符组成。ACK槽期间发送节点发送隐性电平,接收正确节点发送显性电平将总线上信号拉低。ACK界定符位1位隐性电平。要保证发送节点在应答间隙期间接收到应答的显性位,对总线长度有了限制。
帧结束
7个连续的隐性位,助记符EOF
。
远程帧
远程帧与数据帧点区别在于没有数据段,RTR
为隐性,其余相同。
错误帧
过载帧
帧间隔
3 CAN总线通信应用层
通过应用层协议来规范,工业领域主要有CANopen
、Devicenet
等协议。