目录
1. 简介
CAN是控制器局域网络(Controller Area Network, CAN)的简称,是一种能够实现分布式实时控制的串行通信网络。
优点:
传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。近些年来,CAN控制器价格越来越低。
Ø 低成本:ECUs通过单个CAN接口进行通信,布线成本低。
Ø 高集成:CAN总线系统允许在所有ECUs上进行集中错误诊断和配置。
Ø 可靠性:该系统对子系统的故障和电磁干扰具有很强的鲁棒性,是汽车控制系统的理想选择。
Ø 高效率:可以通过id对消息进行优先级排序,以便最高优先级的id不被中断。
Ø 灵活性:每个ECU包含一个用于CAN总线收发芯片,随意添加CAN总线节点。
特性:
1、具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点。
2、采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作。
3、具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus上,形成多主机局部网络。
4、可根据报文的ID决定接收或屏蔽该报文。
5、可靠的错误处理和检错机制。
6、发送的信息遭到破坏后,可自动重发。
7、节点在错误严重的情况下具有自动退出总线的功能。
8、报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。
CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。
由德国的Bosch公司开发,近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。
一个典型的CAN应用场景:
2. CAN总线标准
CAN总线标准只规定了物理层和数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。
CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。高低电平幅度低,对应的传输速度快;
*双绞线共模消除干扰,是因为电平同时变化,电压差不变。
2.1 物理层
CAN有三种接口器件
多个节点连接,只要有一个为低电平,总线就为低电平,只有所有节点输出高电平时,才为高电平。所谓"线与"。
CAN总线有5个连续相同位后,就插入一个相反位,产生跳变沿,用于同步。从而消除累积误差。
和485、232一样,CAN的传输速度与距离成反比。
CAN总线,终端电阻的接法:
为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线
2.1.1 CAN总线网络
CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。
2.1.2 CAN收发器
CAN收发器负责逻辑电平和物理信号之间的转换。
将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。
即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换为差分信号输出到CAN总线上,CAN总线上的节点都可以决定自己是否需要总线上的数据。具体的引脚定义如下:
2.1.3 CAN信号表示
CAN总线采用不归零码位填充技术,也就是说CAN总线上的信号有两种不同的信号状态,分别是显性的(Dominant)逻辑0和隐形的(recessive)逻辑1,信号每一次传输完后不需要返回到逻辑0(显性)的电平。
显性与隐性电平的解释:
CAN的数据总线有两条,一条是黄色的CAN_High,一条是绿色的CAN_Low。当没有数据发送时,两条线的电平一样都为2.5V,称为静电平,也就是隐性电平。当有信号发送时,CAN_High的电平升高1V,即3.5V,CAN_Low的电平降低1V,即1.5V。
按照定义的:
- CAN_H-CAN_L < 0.5V 时候为隐性的,逻辑信号表现为"逻辑1"- 高电平。
- CAN_H-CAN_L > 0.9V 时候为显性的,逻辑信号表现为"逻辑0"- 低电平。
2.1.4 CAN信号传输
发送过程: CAN控制器将CPU传来的信号转换为逻辑电平(即逻辑0-显性电平或者逻辑1-隐性电平)。CAN发射器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上。
接收过程: CAN接收器将CAN_H 和 CAN_L 线上传来的差分电平转换为逻辑电平输出到CAN控制器,CAN控制器再把该逻辑电平转化为相应的信号发送到CPU上。
2.2 数据链路层
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用
于将数据帧、远程帧与前面帧隔离的帧。
2.2.1 数据帧
数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧(2.0B)
2.2.1.1 帧起始与结束帧
帧起始:由单个显性位组成,总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
帧结束:由7个连续的隐形位组成。
(注:显性电平和隐性电平是相对于CAN_H和CAN_L而言的差分信号电平,并非TTL电平上的高低电平,需要注意)如图2-2所示。
2.2.1.2 仲裁段
CAN总线是如何解决多点竞争的问题?
由仲裁段给出答案。只要总线空闲,总线上任何节点都可以发送报文,如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。
CAN总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。
帧ID越小,优先级越高。对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。
由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
2.2.1.3 控制段
共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。
2.2.1.4 数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。
数据量小,发送和接收时间短,实时性高,被干扰的概率小,抗干扰能力强。
2.2.1.5 CRC段
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成。
2.2.1.6 ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图29所示。
2.2.2 远程帧
与数据帧相比,远程帧结构上无数据段,由6个段组成,也分为标准格式和扩展格式,且RTR位为1(隐性电平)。
如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。
所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:
数据帧于远程帧仲裁机制
2.2.3 错误帧
CAN是可靠性很高的总线,但是它也有五种错误。
- CRC错误:发送与接收的CRC值不同发生该错误;
- 格式错误:帧格式不合法发生该错误;
- 应答错误:发送节点在ACK阶段没有收到应答信息发生该错误;
- 位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;
- 位填充错误:通信线缆上违反通信规则时发生该错误。
当发生这五种错误之一时,发送节点或接受节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,CAN协议规定了节点的3种状态及行为
(注:这些错误处理的机制是由硬件自主完成的这样做的目的就是只要CAN在收到数据肯定是正确的数据)。
2.2.4 过载帧
当某节点没有做好接收的"准备"时,将发送过载帧,以通知发送节点。过载帧由过载标志和过载帧界定符组成如下图:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。
2.2.5 间隔帧
间隔帧用于隔离数据帧、远程帧与他们前面的帧,但错误帧和过载帧前面不加帧间隔。
2.3 CAN总线发送总流程
CAN-bus整个链路层处理数据的流程是如图61所示:
2.4 CAN配置
上电后处于复位状态,必须初始化后才能工作。
(1)进入复位模式;
(2)设置时钟分频寄存器选择时钟频率、CAN模式;
(3)获取时钟,设定CAN波特率,计算并设置bit timing参数;
(4)设置输出模式;
(5)清零退出复位模式;
(6)CAN接收
(7)CAN发送
(8)CAN中断判断,tx|rx|error
2.4.1 CAN帧发送
发送CAN帧的步骤:
1. 检测状态寄存器,等待发送缓冲区FIFO可用;
2. 填充报文到发送缓冲区;
3. 启动发送。
2.4.2 CAN帧接收
接收CAN帧的步骤:
1. 检测状态寄存器,接收缓冲区FIFO不为空;
2. 读取接收缓冲区FIFO的报文数据;
3. 解析报文数据。
2.4.3 波特率计算
CAN通信中的每一位分为四个部分。SYNC_SEG,PROP_SEG_SEG,PHASE_SEG1,PAHSE_SEG2,SJW。
Bit time计算:
𝑡𝑆𝑒𝑔_1与 𝑡𝑆𝑒𝑔_2均表示𝑇𝑄 数量,
根据不同的模式、波特率要求,设定𝑝𝑟𝑜𝑔𝑎𝑔𝑎𝑡𝑖𝑜𝑛_𝑠𝑒𝑔𝑚𝑒𝑛𝑡(𝑇𝑄 𝑛𝑢𝑚),𝑝h𝑎𝑠𝑒_𝑠𝑒𝑔1(𝑇𝑄 𝑛𝑢𝑚),𝑝h𝑎𝑠𝑒_𝑠𝑒𝑔2(𝑇𝑄 𝑛𝑢𝑚),𝑡𝑠𝑗𝑤
注:更多详细请参考:
CAN总线报文浅析_Suger Mike的博客-CSDN博客_can报文解析