> 文章列表 > CAN总线通信

CAN总线通信

CAN总线通信

CAN总线通信

CAN 是控制器局域网络(Controller Area Network) 的缩写,是 ISO 国际标准化的串行通信协议。

CAN是半双工通信

CAN总线特点

(1) 多主控制

在总线空闲时,所有的单元都可开始发送消息(多主控制)。

最先访问总线的单元可获得发送权(CSMA/CA 方式)。

多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。

(2) 消息的发送

在 CAN 协议中,所有的消息都以固定的格式发送。总线空闲时,所有与总线相连的单元都可以开始发送新消息。两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为 ID)决定优先级。ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。两个以上的单元同时开始发送消息时,对各消息 ID 的每个位进行逐个仲裁比较。仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。

(3) 系统的柔软性

与总线相连的单元没有类似于“地址”的信息。因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。

(4) 通信速度

根据整个网络的规模,可设定适合的通信速度。

在同一网络中,所有单元必须设定成统一的通信速度。

即使有一个单元的通信速度与其它的不一样,此单元 也会输出错误信号,妨碍整个网络的通信。不同网络间则可以有不同的通信速度。

(5) 远程数据请求

可通过发送“遥控帧” 请求其他单元发送数据。

(6) 错误检测功能·错误通知功能·错误恢复功能

所有的单元都可以检测错误(错误检测功能)。

检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。

正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。

(7) 故障封闭

CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。

(8) 连接

CAN 总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

CAN总线电路

TJA1040T芯片负责将单片机的TTL逻辑电平转换为CAN总线的通讯电平,芯片的TXD引脚接到单片机的CAN_TX引脚,RXD引脚接到单片机的CAN_RX引脚,STB引脚可接单片机的一个普通IO口

TJA1040T芯片就是CAN收发器,单片机内部的CAN外设就是CAN控制器

在这里插入图片描述

CAN协议

CAN 协议涵盖了 ISO 规定的 OSI 基本参照模型中的传输层数据链路层物理层。也就是说CAN协议参照了网络中的七层参考模型,但只使用到了其中的传输层、数据链路层和物理层

这三层在CAN中具体的定于事项和功能如下图所示

在这里插入图片描述

数据链路层分为 MAC 子层和 LLC 子层,MAC 子层是 CAN 协议的核心部分。数据链路层的功能是将物理层收到的信号组织成有意义的消息,并提供传送错误控制等传输控制的流程。具体地说,就是消息的帧化、仲裁、 应答、错误的检测或报告。数据链路层的功能通常在 CAN 控制器的硬件中执行

CAN 协议经 ISO 标准化后有 ISO11898 标准和 ISO11519-2 标准两种。(ISO11519-2 是 ISO11519-1 追加新规约后的版本。)ISO11898 和 ISO11519-2 标准对于数据链路层的定义相同,但物理层不同

在这里插入图片描述

CAN总线电平

CAN 控制器根据两根线上的电位差来判断总线电平。总线电平分为显性电平隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。总线上执行逻辑上的线“与”关系,也就是说总线上所有设备都是隐性电平(1)的话,总线就呈空闲状态,只要有一个变为显性电平(0),总线就是处于数据传输过程。

在这里插入图片描述

因为CAN的标准有两个:ISO11898ISO11519-2,两个标准的差分电平又不相同

常用的标准是ISO11898,该标准通信速度比较快

ISO11898标准

该标准的速度最大可达1M

逻辑1是隐性电平,CAN_High和CAN_Low都是2.5V,电位差为0V,

逻辑0是显性电平,CAN_Hight为3.5V,CAN_Low为1.5V,电位差是2V

CAN总线默认是隐性电平,两根线的电位差为0V

在这里插入图片描述

ISO11519-2标准

该标准的速度最大只有125kbps

逻辑1是隐性电平,CAN_High为1.5V左右,CAN_Low为3V左右,电位差为1.5V

逻辑0是显性电平,CAN_High为4V,CAN_Low为1V,电位差为3V

因为两根线的电压变化比较大,硬件需要的反应时间就长,所以该标准的通信速率较慢

在这里插入图片描述

ISO11898和ISO11519-2物理层的主要不同点如下图所示

在这里插入图片描述

在这里插入图片描述

帧种类

CAN通信是通过以下 5 种类型的帧进行的。

在这里插入图片描述

其中错误帧、过载帧和帧间隔用得比较少,编程时主要是数据帧和遥控帧,数据帧发送的是接收方的ID,遥控帧因为要要求别人发送信息过来,所以发送的是发送方的ID

数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID), 扩展格式有 29 个位的 ID。

数据帧

数据帧的构成主要由帧起始、仲裁段、控制段、数据段、CRC段、ACK段和帧结束组成

在这里插入图片描述

帧起始

表示帧开始的段。1 个位的显性位。

一开始总线上是隐性电平,为逻辑1,当电平由隐性变为显性,即由1变为0,则表示帧起始

在这里插入图片描述

仲裁段

表示数据的优先级的段。

标准格式和扩展格式在此的构成有所不同。

当ID号都一样时,RTR就是用来区分数据帧和遥控帧的,RTR为显性时就是数据帧,为隐性时就是遥控帧,数据帧的优先级是大于遥控帧的

在这里插入图片描述

优先级的决定

在总线空闲态,最先开始发送消息的单元获得发送权。

多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平(逻辑0)最多的单元可继续发送

CAN总线在发送电平状态的时候,同时会检查总线上的电平,若电平不一致,则会做出一些改变

具体仲裁过程:单元1和单元2的帧起始和基本ID号都相同,进入仲裁段后,单元1在某一处出现了隐性电平(逻辑1),但此时单元2还是显性电平(逻辑0),因为显性电平的优先级比隐性电平的高,所以单元2就获得了总线仲裁权,可以继续发送数据,而单元1仲裁失利,转为接收状态

在这里插入图片描述

数据帧和遥控帧的优先级

具有相同 ID 的数据帧和遥控帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权, 可继续发送

因为数据帧和遥控帧的ID完全相同,因此根据RTR的电平状态来决定谁拥有优先权,而数据帧的RTR是显性电平(逻辑0),遥控帧的RTR是隐性电平(逻辑1),显性电平优先级大于隐性电平,所以数据帧具有优先权

在这里插入图片描述

标准格式和扩展格式的优先级

标准格式 ID 与具有相同 ID 的遥控帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送

在这里插入图片描述

控制段

控制段由 6 个位构成,表示数据段的字节数。标准格式和扩展格式的构成有所不同

在这里插入图片描述

DLC指示后面数据段的字节数,为BCD编码,编码格式如下图,例如数据段的字节数为5,则DLC为0101

在这里插入图片描述

CRC(标准和拓展相同)

CRC 段是检查帧传输错误的帧。由 15 个位的 CRC 顺序*1 和 1 个位的 CRC 界定符(用于分隔的位)构成

这个校验是接收方来进行计算的,如果校验出错,则接收方会将错误信息发送到总线上,来通知发送方重新发送

在这里插入图片描述

ACK段

ACK 段用来确认是否正常接收。由 ACK 槽(ACK Slot)和 ACK 界定符 2 个位构成。

当前面数据都没问题时,发送方会发送两个位的隐性电平,接收方会回一个显性电平,通知发送方,已经正确接收

在这里插入图片描述

帧结束

帧结束是表示该该帧的结束的段。由 7 个位的隐性位(逻辑1)构成。

在这里插入图片描述

遥控帧

接收单元向发送单元请求发送数据所用的帧。遥控帧由 6 个段组成。遥控帧没有数据帧的数据段。

组成:

在这里插入图片描述

在这里插入图片描述

数据帧和遥控帧的不同

遥控帧的 RTR 位为隐性位,没有数据段。

没有数据段的数据帧和遥控帧可通过 RTR 位区别开来。

遥控帧没有数据段,数据长度码该如何表示?

遥控帧的数据长度码以所请求数据帧的数据长度码表示。

没有数据段的数据帧有何用途?

例如,可用于各单元的定期连接确认/应答、或仲裁段本身带有实质性信息的情况下

位填充

位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时则添加一个位的反型数据。

在这里插入图片描述

(1) 发送单元的工作

在发送数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,在下一个位(第 6 个位)则要插入 1 位与前 5 位反型的电平。

(2) 接收单元的工作

在接收数据帧和遥控帧时,SOF~CRC 段间的数据,相同电平如果持续 5 位,需要删除下一个位(第 6 个 位)再接收。如果这个第 6 个位的电平与前 5 位相同,将被视为错误并发送错误帧。

位时序

作用:为了通信的可靠性,可以设置波特率,节点通过位时序来进行同步

由发送单元在非同步的情况下发送的每秒钟的位数称为位速率。一个位可分为 4 段。

同步段(SS)

传播时间段(PTS)

相位缓冲段 1(PBS1)

相位缓冲段 2(PBS2)

这些段又由可称为 Time Quantum(以下称为 Tq)的最小时间单位构成。 1 位分为 4 个段,每个段又由若干个 Tq 构成,这称为位时序。

Tq其实就是最小系统时钟,比如系统分配给CAN总线的时钟是36M,经过4分频,得到9M,那Tq就是1/9M

1 位由多少个 Tq 构成、每个段又由多少个 Tq 构成等,可以任意设定位时序。

通过设定位时序,多个单元可同时采样,也可任意设定采样点。

在这里插入图片描述

同步段用于一个隐性电平变为显性电平的一段很小的缓冲时间,也可以是显性电平变为隐性电平,实现时序调整

传播时间段可根据总线的长度来设,如果总线长度长,Tq可以设大点,如果短则可以设小点

相位缓冲段1和相位缓冲段2结合来设置采样点,两个都可以增加或者减少,改变的范围由再同步补偿宽度(SJW)来决定

采样点就是读取总线电平,因为总线会有延时,所以采样点一般设置在电平变化后的50% ~ 80%的区间,这个区间采集的电平就比较稳定

在这里插入图片描述

要注意:假如再同步补偿宽度(SJW)为2,因为相位缓冲段2是减少的,不能小于0,所以设置的值必须要大于2,也就是说设置的值要大于SJW,才能减少SJW的值后不小于0
在这里插入图片描述