CAN总线基础知识+硬件知识

一、 CAN 介绍

1.1什么是 CAN?

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

为了满足汽车产业的“减少线束的数量”、“通过多个 LAN ,进行大量数据的高速通信”的。

1.2 CAN分类

1.2.1按速率分类

  1. 低速 CAN(ISO11519) 通信速率 10~125Kbps ,总线长度可达1000 米。
  2. 高速 CAN(ISO11898) 通信速率 125Kbps~1Mbps ,总线长度≤40 米。(经典 CAN)
  3. CAN FD 通信速率可达 5Mbps ,并且兼容经典 CAN。

Kbps:总线的通信速率,指的是位速率。或称为比特率(和波特率不是一回事),表示的是:单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。

CAN总线拓扑图

右图中120欧姆的电阻为终端电阻,用于阻抗匹配,可以减少回波反射。

CAN 总线由两根线( CANL 和 CANH )组成,允许挂载多个设备节点(低速 CAN:20,高速
CAN:30 )。

1.2.2按位置分类

CAN的组成一般有两种方式:

  1. CPU与CAN控制器集成到一起、再外接CAN收发器;
  2. CPU与CAN控制器分开的,使用的时候需要配置CAN接口电路,比较麻烦。

STM32中就是采用第一种方式,将CAN接口集成在芯片内,使用的时候再外接CAN收发器(顾名思义,可发送,可接收),常用的有TJA1050或者82C250。

CAN收发器是用于TTL电平与差分电压信号相互转换的,TTL电平即单片机引脚直接提供的电平,逻辑0代表低电平,逻辑1代表高电平;而差分电压信号则为固定的电压值。 

1.3 CAN 总线特点

1 )多主控制:每个设备都可以主动发送数据(区别于IIC)

2 )系统的柔软性:没有类似地址的信息,添加设备不改变原来总线的状态(区别于IIC)

3 )通信速度:速度快,距离远

4 )错误检测 & 错误通知 & 错误恢复功能

5 )故障封闭:判断故障类型,并且进行隔离

6 )连接节点多:速度与数量找个平衡

1.4 CAN 应用场景

CAN 总线协议已广泛应用在汽车电子、工业自动化、船舶、医疗设备、工业设备等方面。

二、CAN 物理层

2.1 CAN 物理层特性

CAN 使用差分信号进行数据传输,根据CAN_H和CAN_L上的电位差来判断总线电平。总线电平分为显性电平(逻辑 0)隐性电平(逻辑 1),二者必居其一,显性电平具有优先权(遇0则0)。发送方通过使总线电平发生变化,将消息发送给接收方。

电平高速CAN低速CAN
显性电平(0)U_{CAN-H}-U_{CAN-L} =2VU_{CAN-H}-U_{CAN-L} =3V
隐性电平(1)U_{CAN-H}-U_{CAN-L} =0VU_{CAN-H}-U_{CAN-L} =-1.5V

上表列出的为CAN总线的典型值,还有其他值可以查阅手册。

在总线上显性电平具有优先权,只要有一个节点输出显性电平,总线上即为显性电平。而隐形电平则具有包容的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平(显性电平比隐性电平更强)

2.2 CAN 收发器芯片介绍

芯片有:TJA1050、TJA1042、SIT1050T

上图为CAN的收发器:CAN_Rx和CAN_Tx分别是从MCU中接出来的引脚,比如MCU要发送一个逻辑1,则只要将CAN_Tx设置为1,经过CAN收发器转换,CAN_High和CAN_Low 线上的电压均为 2.5v,即传到总线的电压差 Vh-Vl=0V,总线上的状态则就是逻辑1。

同样,当CAN_High和CAN_Low 读取到 CAN总线电压分别3.5V和1.5V,即压差为2V,经过收发器转换,MCU则可通过CAN_Rx读取到信号0。

2.3 CAN 收发器原理图介绍

下图中:SIT1050T支持高速CAN,传输速率可达1Mbps,注意该芯片使用5V进行供电。其引脚介绍如下:

引脚功能
DCAN 发送引脚
RCAN 接收引脚
Vref

参考电压输出,可以悬空

CANL低电位,CAN 电压输入输出端
CANH高电位,CAN 电压输入输出端
RS高速 /静首模式选择(低电平为高速)

上图为CAN的收发器:CAN_Rx和CAN_Tx分别是从MCU中接出来的引脚,比如MCU要发送一个逻辑1,则只要将CAN_Tx设置为1,经过CAN收发器转换,CAN_High和CAN_Low 线上的电压均为 2.5v,即传到总线的电压差 Vh-Vl=0V,总线上的状态则就是逻辑1。同样,当CAN_High和CAN_Low 读取到 CAN总线电压分别3.5V和1.5V,即压差为2V,经过收发器转换,MCU则可通过CAN_Rx读取到信号0。

三、CAN 协议层

3.1 CAN 帧种类介绍

 CAN 总线以“帧”形式进行通信,数据以一帧一帧的格式进行发送。

CAN 协议定义了5种类型的帧:数据帧、遥控帧、错误帧、过载帧、间隔帧,其中数据帧最为常用。

帧类型帧作用
数据帧(Data Frame)用于 发送单元接收单元 传输数据的帧
遥控帧(Remote Frame)用于 接收单元具有相同ID 的发送单元 请求数据 的帧
错误帧( Error Frame)用于当 检测出错误 时向其他单元通知错误的帧
过载帧(Overload
Frame )
用于接收单元通知其尚未做好接收准备的帧
间隔帧(Inter Frame
Space )
用于将 数据帧 及 遥控帧 与前面的帧分离开来的帧

3.2 CAN 数据帧介绍

数据帧由 7 段 组成。数据帧又分为标准帧 (CAN2.0A) 和扩展帧 (CAN2.0B) ,主要体现在仲裁段和控制段。

注意下图中每一个彩色框里的数字表示的是位数。

分段功能描述
帧起始表示数据帧开始的段,显性信号(0)。数据帧起始标志,固定为1bit显性('b0)
仲裁段表示该帧优先级的段,优先级

本数据帧的 ID 信息, ID 信息的作用:① 如果同时有多个节点发送数据时,作为优先级依据(仲裁机制);② 目标节点通过 ID 信息来接受数据(验收滤波技术)

RTR标识是否是远程帧(0,数据帧;1,远程帧),在数据帧里这一位为显性('b0)

控制段表示数据的字节数以及保留位的段

IDE用于区分标准格式与扩展格式,在标准格式中 IDE 位为显性(‘b0),在扩展格式里 IDE 位为隐性(’b1)

1bit保留位,固定为1'b0

由 4 位组成,MSB 先行(高位先行),它的二进制编码用于表示本报文中的数据段含有多少个字节,DLC 段表示的数字为0到8,若接收方接收到 9~15 的时候并不认为是错误

数据段数据的内容,一帧可发送0~8字节(0~64bit)数据IDE用于区分标准格式与扩展格式,在标准格式中 IDE 位为显性(‘b0),在扩展格式里 IDE 位为隐性(’b1)
CRC段检查帧的传输错误的段

段用于检查帧传输错误,发送方以一定的方法计算包括:帧起始、仲裁段、控制段、数据段;接收方以同样的算法计算 CRC 值并进行比较,如果不同则会向发送端反馈出错信息,重新发送;计算和出错处理一般由 CAN 控制器硬件完成或由软件控制最大重发数。

CRC 界定符(用于分隔的位),为隐性位(1'b1),主要作用是把CRC 校验码与后面的 ACK 段间隔起来

ACK段表示确认正常接收的段

在 ACK 槽位中,发送端发送的为隐性位,而接收端则在这一位中发送显性位以示应答;发送 ACK/返回 ACK这个过程使用到回读机制,即发送方先在 ACK 槽发送隐性位后,回读到的总线上的电平为显性0,发送方才知道它发送成功了,不用重发

在 ACK 槽和帧结束之间由 ACK 界定符间隔开,为隐性位

帧结束表示数据帧结束的段, 7 个隐性信号由发送端发送 7 个隐性位表示结束

3.2.1仲裁段

(1)在标准数据帧中

  1. 标识符位:并不是像IIC中的从机器件的地址,表示的是优先级。
  2. RTR 远程发送请求位:0表示这一帧是数据帧;1表示这一帧是遥控帧。遥控帧和数据帧最大的区别在于有没有后面的数据段。

(2)在扩展数据帧中

  1. Identifier (ID)同上,为基础ID
  2. SRR代替上面的RTR
  3. IDE稍后再讲
  4. Extended Identifier:扩展出来的18位ID,故扩展数据帧共有29位ID

3.2.2控制段

  1. IDE扩展标识符位:这一位决定是标准帧还是扩展帧。
  2. RO稍后再讲
  3. DLC数据长度编码位:表示后面的数据段的长度。如果DLC=1,表示数据段只有一个字节;如果DLC=4,表示数据段有4个字节

3.2.3 CRC段

为确保CAN总线数据传输的又快又稳,必须要有CRC校验段。

(1)CRC循环校验序列

CRC循环校验序列是 发送端 将从帧起始(包含)到数据段(包含) 的数据跟它本身的多项式进行计算,最终复制到CRC循环校验序列。

接收端会将从帧起始(包含)到数据段(包含)的数据自己进行校验,之后再跟发送单元的CRC段的CRC部分进行校验,校验成功后表示这段数据是正确的。

(2)DEL界定符

3.2.4 ACK段

(1)ACK

这一段类比IIC通信中的应答信号。

发送端会将这一位置为隐性信号1。

发送后需要总线上其他的接收单元将其拉低。其他接收单元接收到数据,校验准确后,向总线上放显性信号0,表示应答。

(2)DEL界定符

3.3CAN 位时序介绍

CAN 总线以“位同步”机制,实现对电平的正确采样。

位数据都由四段组成:同步段(SS)、传播时间段(PTS)、相位缓冲段 1(PBS1)和相位缓冲段 2(PBS2),每段又由多个位时序 Tq 组成。

采样点:读取总线电平,并将读到的电平作为位值的点。

根据位时序,也就是上面0这个隐性信号(占8~25)所占Tq,就可以计算 CAN 通信的波特率。

注意 :节点监测到总线上信号的跳变在 SS 段范围内,表示节点与总线的时序是同步,此时采样点的电平即该位的电平。

(哈哈哈,完全没听懂,没关系,,继续向下走)

3.4数据同步过程

时钟频率误差、传输上的相位延迟引起偏差。

CAN 为了实现对总线电平信号的正确采样,数据同步分为硬件同步和再同步。

硬件同步是一开始的同步,再同步是后续持续的同步过程。

3.4.1硬件同步

节点通过 CAN 总线发送数据,一开始发送帧起始信号。

总线上其他节点会检测帧起始信号在不在位数据的 SS 段内,进而去判断接收断内部时序与总线是否同步。

假如不在 SS 段内,这种情况下,采样点获得的电平状态是不正确的。所以,节点会使用硬件同步方式调整, 把自己的 SS 段平移到检测到边沿的地方(就是帧起始信号,帧起始信号就是由隐性电平到显性电平(0→1)的跳变),获得同步,同步情况下,采样点获得的电平状态才是正确的。

3.4.2再同步

再同步利用普通数据位的边沿信号(帧起始信号是特殊的边沿信号)进行同步。

再同步的方式分为两种情况:超前和滞后,即边沿信号与SS段的相对位置。

(1)滞后:隐性电平到显性电平的边沿出现在PTS和PBS1之间 时(SJW=2)

边沿的出现滞后了SS两个Tq,为了保证下一次的SS不出错,在PBS1后增加两个Tq,后面的SS都被同步。

(2)超前:隐性电平到显性电平的边沿出现在PBS2中时(SJW=2)

边沿的出现超前了SS两个Tq,为了保证下一次的SS不出错,在PBS2中减去两个Tq,后面的SS都被同步。

再同步时,PSB1和 PSB2中增加或者减少的时间被称为“再同步补偿宽度(SW)”,其范围:1~4 Tq。

限定了 SJW 值后,再同步时,不能增加限定长度的 SJW 值。

SIW 值较大时,吸收误差能力更强,但是通讯速度会下降。

3.5CAN 总线仲裁

CAN 总线仲裁起始就是优先级决定。

  1. CAN 总线处于空闲状态,最先开始发送消息的单元获得发送权。
  2. 多个单元同时开始发送时,从仲裁段(报文ID)的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送(可以理解成报文ID越小的ID优先级越高),即首先出现隐性电平的单元失去对总线的占有权变为接收。

竞争失败单元,会自动检测总线空闲,在第一时间再次尝试发送。

四、通讯过程

4.1空闲

先规定空闲状态,所谓的空闲状态就是指没有节点正在传输数据的时候;

在CAN协议中,当总线上的上出现连续的11位隐性电平(两根线电压差小于0.5V),表示总线就处于空闲状态。

也就是说对于任意一个节点而言,只要它监听到总线上连续出现了11位隐性电平,那么该节点就会认为总线当前处于空闲状态。

怎么让总线连续出现11位隐形电平呢?

由于显性电平的高优先级特性,必须所有CAN主机都连续发送11个隐性电平,或者不发送时,总线才能出现连续11个隐性电平,即处于空闲状态。

所以,现在可以先简单地理解为,需要在总线一开始工作的时候,所有节点都输出隐性电平;已知在一次传输时该节点输出显性电平,则在传输完成后该节点再输出隐性电平即可,这样就能将总线在无数据传输时保持空闲状态。

4.2开始数据传输

每次发送数据前,节点都会监听总线的状态,如果总线状态为空闲时,它就会立即向总线上发送自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,应称为数据包(数据帧),也叫做报文。当报文被传输到其它节点时,只要这些节点按格式去解读,就能还原出原始数据。

比如总线上有3个节点,节点1设置ID为000101 00010,节点2验收滤波ID表中有节点1的ID号,而节点3中的验收滤波ID表中没有节点1的ID号,节点1向节点2发送1字节的信息。

报文信息:0 000101 00010  0 0 0 0001 0101 1000 XXXXXXXXXXXXXXX 1 1 1 1111111

通过总线发送时,在ID信息发送阶段,只有节点2才能收到总线上的数据,因为节点3的验收滤波ID表中没有节点1的ID号

在报文发送到ACK槽时,会等待并回读节点2的反馈,从节点2的角度看,此时总线为空闲状态,当验证CRC正确,则向总线发送显性电平,接着当节点1回读到显性电平,才会继续发送剩下的EOF。

4.3一次数据传输的例子

  比如总线上有3个节点,节点1设置ID为000100 00110,节点2设置ID为000100 00111,节点3验收滤波ID表中有节点1和节点2的ID号,节点1和节点2同时向节点3发送1字节的信息。

  • 总线空闲,节点1和节点2同时发送帧起始信号,3个节点同时调整位时序(硬同步);
  • 节点1和节点2开始仲裁,两者同时向总线发送第一位0,同时回读总线状态与本身状态相与,得0,两者第1位仲裁均通过;一直持续到第9位1,两者同时向总线发送1,同时回读总线状态,得1,两者第9位仲裁均通过;
  • 直到第11位,当两个节点回读总线状态与本身状态相与时,总线得显性将隐性屏蔽,即总线状态为显性,则节点1得0(与本身状态相同),而节点2得0(与本身状态不同),此时节点1仲裁胜利,节点2放弃发送请求;
  • 从第1位仲裁到第11位仲裁得同时,节点1向其他节点广播了本身的ID,当然节点1本身也接收到节点2的ID信息,因此节点2和节点3也都收到了节点1的ID信息,只不过节点2对节点1不敢兴趣,因而选择了忽略节点1后续的信息,节点3则开始接收节点1的数据;
  • 从硬同步之后,每当节点1和节点2发出一个仲裁位,三个节点的CAN控制器都在检测本身的位时序与总线位时序是否一致,当有相位超前或者滞后时则自动进行位时序的重新同步。在后续的报文传送中亦是如此。

五、总结

接口总线名称电平速度同步/异步通信距离通信方向
RS232TX

逻辑0=+3~+15V

逻辑1=-3V~-15V

异步<15米全双工
RX
GND
RS485A逻辑0=+2~+6V逻辑1=-6V~-2V异步<1200米半双工
B
CANCAN_HController Area
Network
控制器局域网
异步<10千米 速度<5kbps<40米 速度<1mbps半双工
CAN_L
IICSDA

Inter-
IntegratedCircuit

(集成电路总线)

高速可达400Kbps以上同步半双工
SCL
SPISCLSerial Peripheral
Interface串行外设接口
几M同步全双工
MOSI
MISO
CS

本文参考:

支持正点原子,良心机构

CAN总线协议_can协议-CSDN博客

  • 17
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值