1.简介
-
CAN总线\](Controller Area Network Bus)**`控制器局域网总线`** ,**CAN总线构建的是一种`局域网网络`,每个挂载在CAN总线的设备,都可以利用这个局域网去发送自己的消息,也可以接收局域网的各种消息,每个设备都是`平等`的都在共享这个局域网的通信资源。**
- 串行:数据为一个接一个的依次传输
- 并行:数据每一位同时传输
-
特点:
- 两根通讯线:CAN_H和CAN_L 线路少,
无需共地
(因为是差分信号 )(IIC需要共地 (单端信号)) 差分信号
通信,抗干扰能力强- 分类:
- 高速CAN (ISO11898):传输速率125k~1Mbps,传输距离小于40m(着重学习)
- 低速CAN(ISO11519):传输速率10k~125kbps,传输距离小于1km
异步
,无需时钟线,通信速率由设备各自约定(同步需要时钟线)半双工
,不可以同时发送和接收可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序- 11位/29位报文ID,用于区分消息功能,同时决定优先级
- 可配置1~8字节的有效载荷(串口每秒只能发1字节)
- 可实现广播式 和请求式两种传输方式
- 应答、CRC校验、位填充、位同步、错误处理等特性
- 两根通讯线:CAN_H和CAN_L 线路少,
1.2主流通讯协议优劣

- CAN总线类似于IIC和UART的结合体
- SPI最高速
2.硬件电路

- can总线里走的是差分信号,一般会用双绞线作为载体,避免干扰
收发器
主要实现电平转换、输出驱动和输入采样几个功能。
高速can(主要):
- 两端终端电阻(120欧)的作用 :
- 防止回波反射 : (不加的话:会导致当信号跳变时,它会在边沿振荡)
- 在没有设备操作 时,将两个电压收紧 ,使电压一致,代表的是默认的电压1状态 .当想要发送0状态 时,就是将其拉开;当想要发送 1时,不去触碰总线,总线在终端电阻作用下总动变为1
低速can:
- 两个2.2k的终端电阻
- 有防止回波反射 作用,无收紧作用
2.1电平标准

- 显灵0张开,1闭合
2.2 收发器

-
输入:
- 总体上看,有电压差时,输入RXD引脚为低电平0,表示显性电平;没有电压差时,输出RXD引脚为高电平1,表示隐性电平。
-
输出
-
当TXD给1时,后面这个驱动器就会让两个场效应管(红色箭头)都断开,相当于不对总线进行任何操作,总线在外边终端电阻的收紧作用下,呈现默认的隐性电平,另外,内部的两个电阻可以把CAN_H和CAN_L都拉到0.5倍VCC的中间电平,也就是使CAN_H和CAN_L的默认对地电压都是2.5V左右,同时,这两个电阻也有一定的收紧作用,不过他们的阻值比较大,所以收紧作用主要还是靠外边的终端电阻来实现。
-
当TXD给0时,后面这个驱动器就会让两个场效应管(红色箭头)都导通,上面的VCC将CAN_H拉高,下面的GND将CAN_L拉低,这样两线分开产生电压差,总线呈现显性电平逻辑电平0的状态,这就是发送0的操作。
-
-
红框是电流源上拉,类似于上拉电阻 。如果TXD悬空 了,那么这里会默认保持输入1的状态,防止输入引脚电平不确定造成误操作。
-
蓝框是TXD显性超时计时器 ,如果TXD出现异常,始终输入显性电平0,始终拽着总线不放,那么CAN总线将始终呈现显性电平0状态, 显性超时计时器便会中断,使显示1;
3.帧格式

- 主要学习数据帧,遥控帧类似于数据帧,错误帧和过载帧设计比较绕,初学者不要求学会
3.1.数据帧
- 发送设备主动发送数据(广播式)

- 这里波形中间的数字1,表示的是这一段波形占1位,并不表示这一位需要发隐性电平(1),隐性/显性电平在图中通过颜色表示。
标准格式分析
-
在发送数据帧之前,总线必须处于
**空闲状态**
,空闲状态时,总线是隐性电平(逻辑1),所有设备都不去碰总线,随后,数据帧开始,数据帧第一位是帧起始(SOF逻辑0),作用是"打破宁静(打破总线空闲),开始一帧数据,同时也告诉接收方,接下来的一段时间内,我要是再释放总线,总线处于隐性1,那就不是空闲,而是我要发送的就是1",所以必须以显性0开头。 -
1位帧起始之后,首先发送的是
**报文ID**
,标准格式是11位,例如,想要发的报文ID是101 0101 0101,那么这一段时序就是隐显隐 显隐显隐 显隐显隐。报文ID可以表示后面数据的功能,还可以区分优先级 。标准格式ID一共是11位,所以变化范围是0x000-0x7FF。 -
报文ID后就是
**RTR(远程请求标志位,用于区分数据帧还是遥控帧)**
,RTR占据一位,在数据帧里必须为显性0,遥控帧必须为隐性1。报文ID+RTR可以称为仲裁段。 -
接着进入控制段,首先是
**IDE(ID扩展标志位**)
,用于区分标准格式还是扩展格式,标准格式固定为显性0,扩展格式就固定为隐性1。 -
接着是
**r0(保留位),必须为显性0,没有使用**
,为设计者后续的设计升级保留。 -
接着是
**DLC(数据段的长度)**
,CAN总线的一帧数据可以有1-8个字节有效载荷,并且可以灵活指定,就靠这个DLC。如果想发一个字节DLC就给0001(显显显隐),如果想发八个字节DLC就给1000(隐显显显)。 -
接着的数据段就是
**有效载荷的数据**
了,DLC指定几个字节,数据段就发几个字节。数据段的长度是0-64位,且必须为8的倍数,数据段长度可以给0,但是没有意义 -
之后进入CRC段,
CRC是一种高效的校验算法
,它会对前面所有的数据位进行CRC算法计算,从SOF到Data计算得到一个校验码附在后面,接收方收到数据和校验码后也会调用CRC算法进行计算,看看计算的校验码是否一致,以判断传输是否有误,接着是CRC界定符,1位,必须是隐性电平。 -
接着是ACK段 ,分为ACK槽和ACK界定符 ,都是一位。
ACK槽的作用就是应答
,判断发送方发出一帧数据,到底有没有接收方收到。基本思想:当发送方发完一帧数据的主要内容后,在CRC界定符这一位时,发送方释放总线,总线回归默认状态隐性1。如果接收方收到数据了,它就会在ACK槽这一位,主动出击,把总线再拉开,使总线呈现显性0的状态。发送方释放总线后,在ACK槽会读取总线状态,如果发送方读取为显性0,比较之前释放总线,总线变为隐性1,说明必有接收方,数据被正确接收了。 -
注意:
- 第一,ACK槽时,可以允许多个接收方共同拉开总线,因为一个报文消息,可以被多个设备同时接收;
- 第二,并不是发送方把一段波形完整发出去,然后再接收应答的,而是发送方和接收方共同完成一整个波形 ,发送方每发出一位,接收方就立刻收到这一位,所以这条时序的最后,整个数据帧还没结束,接收方其实已经收完了 。应答之后,发送方的整个数据帧才结束。应答是夹在发送过程之中的。
扩展格式分析:
-
首先,前面的11位ID仍然保持不变,另外在后面额外加上18位ID,中间还夹着两位一个是SRR (代替RTR的位),标准格式这一位是RTR,仲裁是先比较ID,后比较RTR的,所以RTR必须在所有的ID位后面,然而在扩展格式下RTR已经被移到了2最后,原来属于RTR的位置就空出来了,空出来的位置必须保证仲裁规则中,标准格式的优先级高于扩展格式,这一位SRR虽然没用但是必须给隐性电平1。拓展格式ID一共是29位,所以变化范围是0x0000 0000-0x1FFF FFFF。
-
接着IDE就是扩展格式标志位 ,标准格式为显性0,扩展格式为隐性1,当接收方收到了一段波形,他就会从前往后开始判断,收到IDE后,就会按照对应格式来对应解析(在收到IDE之前,接收方并不知道是哪种格式,因为在此之前两者没有区别)
-
随后的都是一样的,r1和r0都是保留位,为后续升级留位置。开始的时候标准格式IDE也是保留位r1,只是设计出拓展格式后,把这一位变成了IDE用来区别标准格式还是扩展格式。
3.2.遥控帧

- 遥控帧无数据段,RTR为隐性电平1,其他部分与数据帧相同。
- 发送方不主动广播数据,如果有设备需要的话,首先接收方发出一个遥控帧,遥控帧包含报文ID,广播遥控帧后被每个设备接收,如果其中某个设备有这个ID的数据,它就会在通过数据帧,广播出来。这样接收方就能及时获取这个数据了。
3.3.错误帧

- 总线上所有设备都会监督总线的数据 ,一旦发现"位错误"或"填充错误"或"CRC错误"或"格式错误"或"应答错误" ,这些设备便会发出错误帧,错误帧可以叠加在数据帧 上,并可以破坏数据帧的数据,同时终止当前的发送设备
设备默认处于主动错误状态
,处于主动错误状态的设备,检测出错误时会连续发6个显性位,发显性位就是拉开总线,总线只要有一个设备拉开了,就必然处于显性状态 (0和1相遇时,总线总是处于0状态,这就是"线与"特性)。所以主动错误标志的6个显性位,必然会破坏正常传输的数据,其他设备检测到错误标志就会抛弃这个数据,那主动错误产生太频繁 了,设备就会进入被动错误状态
,处于被动状态的设备,检测出错误时会连续发6个隐性位 ,发送隐性位就是不去碰总线,不碰总线就不会破坏别人发的数据,但是会破坏自己发的数据 ,自己的数据有问题,自己破坏掉,不会影响别的设备发的数据。- 错误标志为6位,发完错误标志后再跟8个隐性1,作为错误界定符 。中间还有0-6位的延长时间 ,这是因为一个设备发出的错误标志可能会引发其他设备连带产生错误标志,多个错误标志叠加起来这个标志位的时间长度可能就不止6位了。(防止其他设备也产生错误标志)
3.4. 过载帧

-
当接收方收到大量数据而无法处理时,其可以发出过载帧,延缓发送方的数据发送,以平衡总线负载,避免数据丢失。
-
过载帧是在发送方发太快的时候,由接收方处理不了时发出。因为数据是发送方主动发出的,接收方无法直接调整发送方的发送频率,只能产生一个和错误帧类似的过载帧将数据破坏掉,发送方不发出就会重试,在这个破坏和重试的过程中,发送数据被延误了,也同时间接告诉发送方,接收方收不了,如果发送方有相应的处理逻辑,它就会降低一点发送频率。
3.5.帧间隔

- 将数据帧和遥控帧与前面的帧分离开 。连续发送数据帧时其中间会有一小段帧间隔就行。帧间隔也分为主动错误状态 和被动错误状态 ,主动错误状态的帧间隔是3位,被动错误状态的帧间隔是3位,另加8位延迟传输。被动状态表示设备不太靠谱,不靠谱就先别着急发送数据,延迟传送,会将设备置于仲裁不利的处境,尽量减少此设备干扰总线。
3.6.位填充

- 位填充只发生在SOF到CRC之间,帧结束没有位填充 。错误帧和过载帧没有位填充。