CAN的全称为“控制器局域网络”(COntroller Area Network),它主要应用于汽车电子行业,由德国的BOSCH公司(博世,欧洲家电第一,德国人的东西值得信赖)开发。
CAN物理层
与IIC和SPI不同,CAN总线没有时钟线,所以CAN通讯并不是以时钟信号来进行同步的,是一种异步通信方式,且只有CAN_H,CAN_L两条线共同组成差分信号线。
闭环总线电路
CAN总线包括闭环、开环总线网络两种。其中闭环具有高速、短距离的特点,它的总线最大长度为40M,通信速度最高1Mbps。且总线两端各有一个120Ω电阻。
开环总线网络
开环总线网络特点为低速、远距离,他的最大传输距离为1Km,通信速度最高125Kbps,并且CAN_H,CAN_L两根线不形成闭环,且每根线上各有一个2.2kΩ。
通信节点
CAN总线上可以挂在多个通讯节点,节点之间的信号通过总线传输。但是每个节点没有对应的地址,不对节点进行地址编码;但是对发送的数据内容有ID,所以理论上可以挂在无数个节点(中继器增强负载,保证呈现正常状态)。
CAN通讯节点由一个CAN控制器和CAN收发器组成,控制器与收发器之间通过CAN_Tx,CAN_Rx相连;收发器与CAN总线之间通过CAN_H与CAN_L相连。
当CAN节点需要发送数据时,CPU通过CAN控制器要把发送的数据0、1(二进制编码)通过CAN_Tx发送到CAN收发器;在收发器中将二进制编码(逻辑电平信号)转化为差分信号;通过差分线CAN_H、CAN_L线输出到CAN总线网络上;接收端,使用CAN收发器接收来自总线上的数据到CAN控制器中,则与发送是相反的过程。
CAN的Rx、Tx使用TTL逻辑信号,CAN的L、H使用差分信号。
差分信号
差分信号,就是用两根信号线,这两根信号线的振幅相同、相位相反,通过这两根线的电压差来表示0、1。
- 大幅度提高抗干扰能力,当噪声干扰时,噪声会同时干扰两条信号线,我们只需要计算压差即可。
- 时序定位准确,差分信号的开始是位于两个信号的交点,而不是普遍单端信号依靠高低两个电压判断(IIC的开始和停止信号)。
CAN总线中的差分信号
我们常用的闭环总线网络,所以以闭环总线网络举例。闭环总线网络当CAN_H为2.5V,CAN_L为2.5V的时候,逻辑电平为1(隐性);当CAN_H为3.5V,CAN_L为1.5V的时候,逻辑电平为0(显性)。所以当H与L压差为0的时候呈隐性,逻辑电平为1;当H与L压差为2V时呈显性,逻辑电平为0。
注意:当同一时刻,两个CAN通讯节点,一个输出隐性,一个输出显性;那么总线将呈现显性状态(类似高中生物的遗传大题)。
CAN的物理层中只有一对差分信号线,所以在同一时刻只能表示一个信号,所以CAN的通讯时半双工的,收发需要分开进行。
CAN协议层
CAN的波特率及位同步
由于CAN是异步通信,没有时钟信号线,如同串口的异步通信一般,CAN总线也是节点之间约定好波特率进行通信。CAN总线还使用”位同步“来抗干扰。
位时序分解
CAN协议把每一个数据位分解成SS段、PTS段、PBS1段、PBS2段,这四段的长度加起来即为一个CAN数据长度。最小的时间单位位Tq。
图中把每一个数据位放大,可以观察到4个段的顺序和长度。
- SS段 (SYNC SEG):同步段。检测节点与总线时序是否同步,当通讯节点检测到总线上信号的跳变沿被包含在SS段的范围之内时则是同步。当时序同步时,采集点的电平则可被始为该点的电平。SS段的大小固定为1Tq。
- PTS段 (PROP SEG):传播时间段。这个时间段是用于补偿网络的物理延时时间。是总线上输入比较器延时和输出驱动器延时总和的两倍。PTS段的大小可以为1~8Tq。
- PBS1 (PHASE SEG1):相位缓冲段。主要用来补偿边沿阶段的误差,它的时间长度在重新同步 的时候可以加长 。PBS1段的初始大小可以为1~8Tq。
- PBS2 (PHASE SEG2): 这是另一个相位缓冲段,也是用来补偿边沿阶段误差的,它的时间长度在重新同步时可以缩短 。PBS2段的初始大小可以为2~8Tq。
通信的波特率
总线上的通讯节点之间只要约定好1个Tq的时间长度以及每个数据位占据多少个Tq,就可以确定CAN通讯的波特率。波特率=每秒可以传输的数据位个数。
同步过程分析
CAN的数据同步分为硬同步和重新同步,硬同步就是当设备节点发现自己的时序有CAN总线上的时序不同(节点检测到总线上的起始信号不在SS段范围内),则节点通过硬同步的方式进行调整,把自己的位时序中的SS段平移至起始信号的部分。
硬同步是在信号开始时检测节点时序与总线时序出现问题,如果在一帧很长的数据内,节点信号与总线信号发生偏移则就无法修正。而重新同步就是利用普通数据位的高至第电平的条百年来同步。
CAN的报文种类及结构
因为CAN使用的是两条差分信号线,同一时刻只能表达一个信号,所以他的协议更为复杂。
报文格式
在原始数据短的前面加上传输起始标签、片选标签和控制标签,在原始数据的尾段叫上CRC校验标签、应答标签和传输结束标签,把这些内容按特定的格式打包。当整个数据包通过CAN总线传输到其他设备时,只要这些设备按照这个封装规定去解读,就要可以正确提取出原始数据。这种数据包称为”CAN的数据帧“。
帧 | 帧用途 |
数据帧 | 用于节点向外传送数据 |
遥控帧 | 用于向远端节点请求数据 |
错误帧 | 用于向远端节点通知校验错误,请求重新发送上一个数据 |
过载帧 | 用于通知远端节点:本节点尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开来 |
数据帧的结构
数据帧时最重要、最复杂的结构!!!
数据帧以一个显性(0)开始,以7个连续的隐性(1)结束。在他们中间分别由仲裁段、控制端、数据段、CRC段、ACK段。
- 帧起始(SOF):帧起始信号只有一个数据位,就是一个显性电平(0),它用于通知各个节点将有数据传输,其他非发送节点可以通过该位进行硬同步实现时钟与总线相同。
- 仲裁段:总线通过仲裁段的内容来决定传输那个报文。
仲裁段主要内容为数据帧的ID信息(标识符),数据帧具有标准格式和可扩展模式两种,区别就在于ID信息的长度,标准格式的ID为11位,扩展ID在原来11位基础上多出18位。
在CAN总线中ID决定着这个数据帧的优先级,也决定着那个节点可以接受这个数据帧。
报文的优先级是通过对ID的仲裁来决定的。如下图,两个节点同时竞争CAN总线的占有权,都想发送自己的数据帧;他们前期的电平相同,所以他们会一直发送数据,当首先出现隐性电平的一方(在这一时刻节点1为隐性,节点2为显性),则失去对总线的占有权,自己的数据帧不能发送,节点转为接收状态。
仲裁段的ID也影响接收设备对数据帧反应,因为CAN总线上是以广播的形式发送数据帧的,所有连接在CAN总线上的节点都会接收到所有其他节点发出的有效数据。但是我们的CAN控制器可以根据ID来过滤数据帧。
仲裁段中除了有ID之外还有三个位,分别是RTR、IDE、SRR。
- RTR(Remote Transmission Request Bit):远程传输请求,他是用于区分数据帧和遥控帧的;当显性的时候表示数据帧,当隐性的时候表示遥控帧。
- IDE(Identifier Extension Bit):标识扩展位,他用于区分标准格式和扩展格式;当为显性时表示标准格式,当为隐性时表示扩展格式。
- SRR(Substitute Remote Request Bit):只存在于扩展格式,用于替代标准格式中的RTR(远程传输请求)位。在扩展格式中SRR为隐性,RTR为显性,所以在两个ID相同的条件下,标准格式的报文比扩展模式优先级更高。
- CRC:CAN报文包含15位的CRC校验码,一旦接收节点端算出的CRC码与接收到的CRC码不同,则向发送节点反馈错误信息,请求重新发送。CRC校验码之后还有一个界定符,他为隐性位,主要用于将CRC与ACK间隔开来。
- ACK:ACK段包括一个ACK槽位、一个ACK界定符。在ACK槽中,发动报文中的时隐性位,则接收节点在这一位中发送显性位回复。ACK段与帧结束之间有ACK界定符间隔。
- 帧结束:EOF段,由7个隐性位组成表示结束。