一、CAN简介
•CAN总线(Controller Area Network Bus)控制器局域网总线
•CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线,广泛应用于汽车、嵌入式、工业控制等领域
•CAN总线特征:
1.两根通信线(CAN_H、CAN_L),线路少
2.差分信号通信,抗干扰能力强
3.高速CAN(ISO11898):125k~1Mbps, <40m
4.低速CAN(ISO11519):10k~125kbps, <1km
5.异步,无需时钟线,通信速率由设备各自约定
6.半双工,可挂载多设备,多设备同时发送数据时通过仲裁判断先后顺序
7.11位/29位报文ID,用于区分消息功能,同时决定优先级
8.可配置1~8字节的有效载荷
9.可实现广播式和请求式两种传输方式
10.应答、CRC校验、位填充、位同步、错误处理等特性
二、CAN硬件电路
1、CAN电路介绍
•每个设备通过CAN收发器挂载在CAN总线网络上
•CAN控制器引出的TX和RX与CAN收发器相连,CAN收发器引出的CAN_H和CAN_L分别与总线的CAN_H和CAN_L相连
•高速CAN使用闭环网络,CAN_H和CAN_L两端添加120Ω的终端电阻
•低速CAN使用开环网络,CAN_H和CAN_L其中一端添加2.2kΩ的终端电阻
2、 CAN 收发器模块
CAN收发器的作用:实现电平转转换、输出驱动和输入采样
有四个引脚:TX、RX、CAN_H、CAN_LCAN收发器模块在与STM32的 CAN_Tx 和 CAN_Rx 接线时只需要TX--CAN_Tx RX_CAN_RX ,这里要和串口区分开来
高速CAN有120Ω的终端电阻主要有2个作用:
1、防止回波反射
2、在没有设备操作时,将2根差分线的电压收紧,也就是使其电压一致
3、CAN电平标准
•CAN总线采用差分信号,即两线电压差(VCAN_H-VCAN_L)传输数据位
•高速CAN规定:
电压差为0V时表示逻辑1(隐性电平)
电压差为2V时表示逻辑0(显性电平)
•低速CAN规定:
电压差为-1.5V时表示逻辑1(隐性电平)
电压差为3V时表示逻辑0(显性电平)
隐形电平和显性电平的由来:
总线上的电平有显性电平和隐性电平两种。 总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。 “显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐 性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比 隐性电平更强。)
如图可知,在高速 CAN 模式下,CAN_H 和 CAN_L 的默认电平为 2.5v ,当CAN 收发器接收到一个逻辑 1 时CAN_H 被拉高为3.5v,CAN_L 被拉低为 1.5v。由此可知当我们在使用 CAN 收发器时一定要接 5V 的电压,如果接一个 3.3V 的话 CAN_H 是无法被拉为 3.5 V的。在这里可以能有人会想 3.5V 和 3.3V 也没有相差多少,如果 CAN_H 被拉高为 3.3V 效果应该也是可以的,这样相的话就大错特错了。当然,这里的 3.5V 也不是绝对的也是有一个电压差的范围的。如图 CAN 在不同模式下的区别以及 隐性 和 显性 的电压范围。
三、CAN总线帧格式
关于CAN的帧格式,CAN协议规定了以下5种类型的帧:
帧类型 | 用途 |
数据帧 | 发送设备主动发送数据(广播式) |
遥控帧 | 接收设备主动请求数据(请求式) |
错误帧 | 某个设备检测出错误时向其他设备通知错误 |
过载帧 | 接收设备通知其尚未做好接收准备 |
帧间隔 | 用于将数据帧及遥控帧与前面的帧分离开 |
关于这5中帧格式,作为初学者的我们注重了解熟悉数据帧和格式帧,其他3中帧格式在后面熟悉后在详细了解。
1、数据帧
数据帧有标准格式和扩展格式两种,CAN总线刚制定时,只有标准格式,扩展格式是后来新增的,扩展格式增加了ID位数,能承载更多种类的ID。
标准格式:
(1) 帧起始(SOF)
在发送数据帧之前,总线必须处于空闲状态闲,空状态时,总线是隐性电平(逻辑电平表示为高电平1),当接收到一个显性电平(逻辑电平0)时表示一段帧的开始。
(2)仲裁段:表示数据的优先级的段。
仲裁段包括:
ID(11位):11位 ID 用于区分不同的设备同时也体现出报文的优先级,ID 越小,优先级越高。
RTR位(远程请求位):区分数据帧和遥控帧,逻辑电平为 0 时为数据帧,逻辑电平为 1 时为遥控帧
(3)控制段:6个位构成,表示数据段的字节数
IDE : 用于区分标准格式和扩展格式。
DLC(4位):该字段表示一帧中携带的数据字节数。由于是4位,DLC的取值范围为0~15,但是在标准CAN中一帧携带的数据最多为8位。
r0位:保留位,必须发送逻辑电平 0,显性电平。(这个位没有实际作用)
(4)数据段:
Data :数据段可包含0~8个字节的数据。从MSB(最高位)开始输出。CAN FD协议扩展了数据域,可以支持最多64字节。
(5)CRC 段:
检查帧传输错误的帧。由15个位的CRC顺序*1和1个位的CRC界定符(用于分隔的位)构成。
(6) ACK 段
ACK段用来确认是否正常接收。由ACK槽(ACK Slot)和ACK界定符2个位构成。
发送单元在ACK段发送2个位的隐性位,接收到正确消息的单元在ACK槽(ACK Slot)发送显性位,通知发送单元正常接收结束。这称作“发 送ACK”或者“返回ACK”。
(7) 帧结束
帧结束是表示该该帧的结束的段。由7个位的隐性位构成。
2、 遥控帧
遥控帧和数据帧的主要区别在于遥控帧没有数据段,这个遥控帧的功能有关,遥控帧是请求单元发送信息,发送遥控帧的单元做好接收信息的准备。
数据帧和遥控帧在RTR位的配置不同,遥控帧要将RTR位配置位隐性位,DLC位表示的是要接收的数据量。其他位的功能都相同。
3、错误帧
用于在接收和发送消息时检测出错误通知错误的帧。错误帧由错误标志和错误界定符构成。
(1) 错误标志
错误标志包括主动错误标志和被动错误标志两种。
--- 主动错误标志:6个位的显性位。
---被动错误标志:6个位的隐性位。
(2) 错误界定符
错误界定符由8个位的隐性位构成。
4、过载帧
过载帧是用于接收单元通知其尚未完成接收准备的帧。过载帧由过载标志和过载界定符构成。
(1) 过载
标志 6 个位的显性位。
过载标志的构成与主动错误标志的构成相同。
(2) 过载界定符
8 个位的隐性位。
过载界定符的构成与错误界定符的构成相同。
5、帧间隔
帧间隔是用于分隔数据帧和遥控帧的帧。数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、 遥控帧、错误帧、过载帧)分开。过载帧和错误帧前不能插入帧间隔。
(1) 间隔
3 个位的隐性位。
(2) 总线空闲
隐性电平,无长度限制(0亦可)。
本状态下,可视为总线空闲,要发送的单元可开始访问总线。
(3) 延迟传送(发送暂时停止)
8 个位的隐性位。
只在处于被动错误状态的单元刚发送一个消息后的帧间隔中包含的段。
四、填充位:
1、 位填充规则:
发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据
例如:
即将发送: 100000110 10000011110 0111111111110
实际发送: 1000001110 1000001111100 011111011111010
实际接收: 1000001110 1000001111100 011111011111010
移除填充后: 100000110 10000011110 0111111111110
2、位填充作用:
1、增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机
2、将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性
3、保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲
3、波形实例
CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
发送方以约定的位时长每隔固定时间输出一个数据位
接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近
五、位时序
1、 为了灵活调整每个采样点的位置,使采样点对齐数据位中心附近,CAN总线对每一个数据位的时长进行了更细的划分,分为同步段(SS)、传播时间段(PTS)、相位缓冲段1(PBS1)和相位缓冲段2(PBS2),每个段又由若干个最小时间单位(Tq)构成
波特率 = 1 / 一个数据位的时长 = 1 / (TSS + TPTS + TPBS1 + TPBS2)
例如:SS = 1Tq,PTS = 3Tq,PBS1 = 3Tq,PBS2 = 3Tq
Tq = 0.5us
波特率 = 1 / (0.5us + 1.5us + 1.5us + 1.5us) = 200kbps
2、硬同步
每个设备都有一个位时序计时周期,当某个设备(发送方)率先发送报文,其他所有设备(接收方)收到SOF的下降沿时,接收方会将自己的位时序计时周期拨到SS段的位置,与发送方的位时序计时周期保持同步
硬同步只在帧的第一个下降沿(SOF下降沿)有效
经过硬同步后,若发送方和接收方的时钟没有误差,则后续所有数据位的采样点必然都会对齐数据位中心附近

3、再同步
若发送方或接收方的时钟有误差,随着误差积累,数据位边沿逐渐偏离SS段,则此时接收方根据再同步补偿宽度值(SJW)通过加长PBS1段,或缩短PBS2段,以调整同步
再同步可以发生在第一个下降沿之后的每个数据位跳变边沿
五、资源分配规则
1、先占先得
•若当前已经有设备正在操作总线发送数据帧/遥控帧,则其他任何设备不能再同时发送数据帧/遥控帧(可以发送错误帧/过载帧破坏当前数据)
•任何设备检测到连续11个隐性电平,即认为总线空闲,只有在总线空闲时,设备才能发送数据帧/遥控帧
•一旦有设备正在发送数据帧/遥控帧,总线就会变为活跃状态,必然不会出现连续11个隐性电平,其他设备自然也不会破坏当前发送
•若总线活跃状态其他设备有发送需求,则需要等待总线变为空闲,才能执行发送需求
2、非破坏性仲裁
•若多个设备的发送需求同时到来或因等待而同时到来,则CAN总线协议会根据ID号(仲裁段)进行非破坏性仲裁,ID号小的(优先级高)取到总线控制权,ID号大的(优先级低)仲裁失利后将转入接收状态,等待下一次总线空闲时再尝试发送
•实现非破坏性仲裁需要两个要求:
线与特性:总线上任何一个设备发送显性电平0时,总线就会呈现显性电平0状态,只有当所有设备都发送隐性电平1时,总线才呈现隐性电平1状态,即:0 & X & X = 0,1 & 1 & 1 = 1
回读机制:每个设备发出一个数据位后,都会读回总线当前的电平状态,以确认自己发出的电平是否被真实地发送出去了,根据线与特性,发出0读回必然是0,发出1读回不一定是1
•数据帧和遥控帧ID号一样时,数据帧的优先级高于遥控帧
•标准格式11位ID号和扩展格式29位ID号的高11位一样时,标准格式的优先级高于扩展格式(SRR必须始终为1,以保证此要求)