目录
1. 简介
2. CAN总线标准
2.1 物理层
2.1.1 CAN总线网络
2.1.2 CAN收发器
2.1.3 CAN信号表示
2.1.4 CAN信号传输
2.2 数据链路层
2.2.1 数据帧
2.2.1.1 帧起始与结束帧
2.2.1.2 仲裁段
2.2.1.3 控制段
2.2.1.4 数据段
2.2.1.5 CRC段
2.2.1.6 ACK段
2.2.2 远程帧
2.2.3 错误帧
2.2.4 过载帧
2.2.5 间隔帧
2.3 CAN总线发送总流程
2.4 CAN配置
2.4.1 CAN帧发送
2.4.2 CAN帧接收
2.4.3 波特率计算
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应用场景:
CAN总线标准只规定了物理层和数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。
CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。高低电平幅度低,对应的传输速度快;
*双绞线共模消除干扰,是因为电平同时变化,电压差不变。
CAN有三种接口器件
多个节点连接,只要有一个为低电平,总线就为低电平,只有所有节点输出高电平时,才为高电平。所谓"线与"。
CAN总线有5个连续相同位后,就插入一个相反位,产生跳变沿,用于同步。从而消除累积误差。
和485、232一样,CAN的传输速度与距离成反比。
CAN总线,终端电阻的接法:
为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线
CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。
CAN收发器负责逻辑电平和物理信号之间的转换。
将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。
即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换为差分信号输出到CAN总线上,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控制器将CPU传来的信号转换为逻辑电平(即逻辑0-显性电平或者逻辑1-隐性电平)。CAN发射器接收逻辑电平之后,再将其转换为差分电平输出到CAN总线上。
接收过程: CAN接收器将CAN_H 和 CAN_L 线上传来的差分电平转换为逻辑电平输出到CAN控制器,CAN控制器再把该逻辑电平转化为相应的信号发送到CPU上。
CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。
数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用
于将数据帧、远程帧与前面帧隔离的帧。
数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧(2.0B)
帧起始:由单个显性位组成,总线空闲时,发送节点发送帧起始,其他接收节点同步于该帧起始位。
帧结束:由7个连续的隐形位组成。
(注:显性电平和隐性电平是相对于CAN_H和CAN_L而言的差分信号电平,并非TTL电平上的高低电平,需要注意)如图2-2所示。
CAN总线是如何解决多点竞争的问题?
由仲裁段给出答案。只要总线空闲,总线上任何节点都可以发送报文,如果有两个或两个以上的节点开始传送报文,那么就会存在总线访问冲突的可能。但是CAN使用了标识符的逐位仲裁方法可以解决这个问题。
CAN总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。
帧ID越小,优先级越高。对于同为扩展格式数据帧、标准格式远程帧和扩展格式远程帧的情况同理。
由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。
共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。
数据量小,发送和接收时间短,实时性高,被干扰的概率小,抗干扰能力强。
CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。 CRC校验段由15位CRC值和1位CRC界定符构成。
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平如图29所示。
与数据帧相比,远程帧结构上无数据段,由6个段组成,也分为标准格式和扩展格式,且RTR位为1(隐性电平)。
如下图所示由于数据帧的RTR位为显性电平,远程帧的RTR位为隐性电平。
所以帧格式和帧ID都相同情况下,数据帧的优先级比远程帧优先级高:
数据帧于远程帧仲裁机制
CAN是可靠性很高的总线,但是它也有五种错误。
当发生这五种错误之一时,发送节点或接受节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,CAN协议规定了节点的3种状态及行为
(注:这些错误处理的机制是由硬件自主完成的这样做的目的就是只要CAN在收到数据肯定是正确的数据)。
当某节点没有做好接收的"准备"时,将发送过载帧,以通知发送节点。过载帧由过载标志和过载帧界定符组成如下图:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。
间隔帧用于隔离数据帧、远程帧与他们前面的帧,但错误帧和过载帧前面不加帧间隔。
CAN-bus整个链路层处理数据的流程是如图61所示:
上电后处于复位状态,必须初始化后才能工作。
(1)进入复位模式;
(2)设置时钟分频寄存器选择时钟频率、CAN模式;
(3)获取时钟,设定CAN波特率,计算并设置bit timing参数;
(4)设置输出模式;
(5)清零退出复位模式;
(6)CAN接收
(7)CAN发送
(8)CAN中断判断,tx|rx|error
发送CAN帧的步骤:
1. 检测状态寄存器,等待发送缓冲区FIFO可用;
2. 填充报文到发送缓冲区;
3. 启动发送。
接收CAN帧的步骤:
1. 检测状态寄存器,接收缓冲区FIFO不为空;
2. 读取接收缓冲区FIFO的报文数据;
3. 解析报文数据。
CAN通信中的每一位分为四个部分。SYNC_SEG,PROP_SEG_SEG,PHASE_SEG1,PAHSE_SEG2,SJW。
_1与 _2均表示 数量,
根据不同的模式、波特率要求,设定_( ),h_1( ),h_2( ),
注:更多详细请参考:
CAN总线报文浅析_Suger Mike的博客-CSDN博客_can报文解析
(6条消息) CAN总线详解_羊脂球的博客-CSDN博客_can总线
CAN总线(一) - J博士 - 博客园 (cnblogs.com)