一、 CAN 介绍
1.1什么是 CAN?
CAN (Controller Area Network,控制器局域网络),是 ISO 国际标准化的串行通信协议。
为了满足汽车产业的“减少线束的数量”、“通过多个 LAN ,进行大量数据的高速通信”的。
1.2 CAN分类
1.2.1按速率分类
- 低速 CAN(ISO11519) 通信速率 10~125Kbps ,总线长度可达1000 米。
- 高速 CAN(ISO11898) 通信速率 125Kbps~1Mbps ,总线长度≤40 米。(经典 CAN)
- CAN FD 通信速率可达 5Mbps ,并且兼容经典 CAN。
Kbps:总线的通信速率,指的是位速率。或称为比特率(和波特率不是一回事),表示的是:单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。

右图中120欧姆的电阻为终端电阻,用于阻抗匹配,可以减少回波反射。
CAN 总线由两根线( CANL 和 CANH )组成,允许挂载多个设备节点(低速 CAN:20,高速
CAN:30 )。
1.2.2按位置分类
CAN的组成一般有两种方式:
- CPU与CAN控制器集成到一起、再外接CAN收发器;
- 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) | ||
隐性电平(1) |
上表列出的为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进行供电。其引脚介绍如下:
引脚 | 功能 |
D | CAN 发送引脚 |
R | CAN 接收引脚 |
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)在标准数据帧中
- 标识符位:并不是像IIC中的从机器件的地址,表示的是优先级。
- RTR 远程发送请求位:0表示这一帧是数据帧;1表示这一帧是遥控帧。遥控帧和数据帧最大的区别在于有没有后面的数据段。
(2)在扩展数据帧中
- Identifier (ID)同上,为基础ID
- SRR代替上面的RTR
- IDE稍后再讲
- Extended Identifier:扩展出来的18位ID,故扩展数据帧共有29位ID
3.2.2控制段
- IDE扩展标识符位:这一位决定是标准帧还是扩展帧。
- RO稍后再讲
- 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 总线仲裁起始就是优先级决定。
- CAN 总线处于空闲状态,最先开始发送消息的单元获得发送权。
- 多个单元同时开始发送时,从仲裁段(报文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控制器都在检测本身的位时序与总线位时序是否一致,当有相位超前或者滞后时则自动进行位时序的重新同步。在后续的报文传送中亦是如此。
五、总结
接口 | 总线 | 名称 | 电平 | 速度 | 同步/异步 | 通信距离 | 通信方向 |
RS232 | TX | 逻辑0=+3~+15V 逻辑1=-3V~-15V | 异步 | <15米 | 全双工 | ||
RX | |||||||
GND | |||||||
RS485 | A | 逻辑0=+2~+6V逻辑1=-6V~-2V | 异步 | <1200米 | 半双工 | ||
B | |||||||
CAN | CAN_H | Controller Area Network 控制器局域网 | 异步 | <10千米 速度<5kbps<40米 速度<1mbps | 半双工 | ||
CAN_L | |||||||
IIC | SDA | Inter- (集成电路总线) | 高速可达400Kbps以上 | 同步 | 半双工 | ||
SCL | |||||||
SPI | SCL | Serial Peripheral Interface串行外设接口 | 几M | 同步 | 全双工 | ||
MOSI | |||||||
MISO | |||||||
CS |
本文参考:
支持正点原子,良心机构