参考资料
推荐
什么是CAN总线
CAN(Controller Area NetWork)是二十世纪八十年代初德国Bosch公司为解决现代汽车中众多控制单元(ECU)之间的数据交换而开发的一种多主机局部网络串行通信协议 。(可以理解为为了较少线缆的使用,节省成本而开发的技术)
对于CAN,其实可以简单的理解为成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定的规则来决定谁先讲话谁后讲话(仲裁),这就好比会议中你和领导同时讲话,你肯定会很识趣地让领导先讲 。
CAN总线结构图
百度随便收的,别介意
CAN总线的优势
随着通信技术的发展,现今通信方式和协议五花八门,但是CAN通信仍然是车载网络最安全可靠且应用最广的技术之一。 过去,汽车通常采用常规的点对点通信方式将电子控制单元及电子装置连接起来,但随着电子设备的不断增加,导线数量也随之增多,采用CAN总线网络结构,可以达到信息共享,减少布线,降低成本以及提高总体可靠性的目标 。
总的来讲CAN总线有以下几点优势:
- 数据传输速度相对较高,可达到1Mbit/s。(CAN-FD和CAN-XL分别可以达到2Mbit/s和10Mbit/s)
- 采用差分数据线,抗干扰能力强;
- 多主通信模式,大幅减少单点通信线束成本;
- 具有错误侦听的自我诊断功能,通信可靠信较高。
CAN总线原理及工作机制
硬件基础
CAN总线节点有两种硬件构成方案
- MCU控制器+独立CAN控制器+CAN收发器。(独立CAN控制器如NXP半导体的SJA1000等)使用独立CAN控制器程序复用移植性较好,但占用主芯片I/O资源。
- 集成CAN控制器的MCU+CAN收发器。(集成CAN控制器的单片机如NXP半导体的P87C591等)该方案程序复用性不佳,具有很强的针对性,但是可以使电路更加简单。
如下图,完整的CAN接口电路包括接收发送CAN报文的CNA控制器,转换数字信号和CAN信号的CAN收发器,消除噪声的滤波器以及提供合适阻抗的CAN高和CAN低终端电路。
通信机制
电信号的传输在物理层面都是考电压高低区分来实现的,CAN通信也不例外。CAN总线使用双绞线进行差分电压传输,两条信号线被称为CAN高(CAN_H)和CAN低(CAN_L) 。
两条线静态时均为2.5V 左右,此时状态表示逻辑为1 ,也被称作隐性 。当两条线电压值出现差异时,通常CAN_H=3.5V 和CAN_L = 1.5V ,此时状态表示为逻辑0 ,也称为显性 。即: 差分信号电压CAN_diff = 0V, 表示逻辑 “1”, 为隐性 ; 差分信号电压CAN_diff = 2V, 表示逻辑“0” , 为显性 ;
注:实际开发中两条线的电压都会在标准值上下附近波动,这也是用差分传输的好处,减少误差和噪声带来的干扰。
显性电平用逻辑“0”表示,隐性电平用逻辑“1”表示 ,这里可能会有小伙伴有疑问,怎么感觉反了,是不是错了? 其实这是因为CAN总线采用"线与" 规则进行冲突仲裁(解决谁来说话问题),即当多个CAN信号同时发送时,有的发1有的发0,而只要有0,当前总线就是0 (1 & 0 = 0),看上去就是1被0覆盖了 。另一方面,从电位来看,高电位为0,当1和0同时发送时,总线处于高电位,显现出来就是0,所以把0规定为显性。
CAN消息帧格式
相互通信的ECU想要彼此收发消息,需要使用相同的CAN报文格式 ,这就好比两个不同母语的人要对话必须讲同一种语言才行,不然就是鸡同鸭讲了。目前主要有CAN2.0A和CAN2.0B两种技术规范。
CAN2.0A规定了11位标识符的标准帧格式,CAN2.0B在此基础上又增加了一种具有29位标识符的扩展帧格式 。
CAN消息帧根据用途不同分为四种类型:数据帧,远程帧,错误帧,超载帧。
数据帧
用于传输数据
帧起始 :标志一个数据帧的开始,仅由一个显性 位构成,只有在总线空闲期间才能够发送。 仲裁场 :在标准帧中,仲裁场由11位标识符和RTR位组成;在扩展帧中,仲裁场由29位标识符、SRR位、IDE位和RTR位组成。
ID(标识符)是用来确定一条报文,表明报文含义及优先级。
RTR(远程传送请求位),数据帧RTR位必须为显性电平 (RTR=0),远程帧RTR位必须为隐性电平(RTR = 1)。
IDE(标识符扩展位)在标准帧属于控制场,在扩展帧中属于仲裁场。在标准帧中IDE为显性电平(IDE=0),在扩展帧中IDE为隐性电平(IDE=1)
SRR(远程代替请求位)在扩展帧中始终为隐性电平(SRR=1)
控制场 :由6位组成。在标准帧中,控制场包括IDE(此时为显性电平0),保留位r(此时为显性电平0)以及占4个bit的数据长度码DLC 。在扩展帧中,控制场没有IDE位,而是两个保留位r0和r1,此时同样均为显性电平0。
数据场 :包含CAN数据帧发送的数据,0~8byte。其格式如下图 这个是汽车电子工程师常用工具CANode 里报文layout的一张截图,关于CANode的使用及仿真编程关注该专栏后面的博客。这里我们先来看看这个图怎么看。第一列从0到7分别表示一帧消息8个byte从低到高的位置,0就是第0个byte,7就是第7个byte,这里要注意第一个byte记为0。
第一行从7到0分别表示byte[0]的信号从高到低排列,7就是第7个bit,0就是第0个bit,这里同样要注意最低位为bit[0]。所以说来说去,CAN报文和所有信号传输一样都是靠0和1组合起来的信息,经过一定的CAN协议就能转换成我们想要的结果。
CRC场 :包括CRC序列和CRC界定符DEL,CRC校验是为了通信双方的安全可靠性制定的“暗号”,只有发送方根据发送信息计算的CRC值与接收方根据接收信息计算的CRC值对上,才能判断这次通信成功了,否则就会报错 。 应答(ACK)场 :包括2位,应答间隙(ACK)和应答界定符(DEL)。发送节点发出的报文中ACK及DEL均为隐性电平1 ,接收节点正确接收后会用显性电平0覆盖隐性电平 ,以表示正确接收。总结说就是,正确接收ACK=0,DEL=1;未被正确接收ACK=DEL=1. 帧结束 :7 个连续的隐性位,表示数据帧结束。节点在检测到11 个连续的隐性位后认为总线空闲。
远程帧
向其他节点请求发送具有同一标识符的数据帧,远程帧没有数据场,且RTR位为隐性电平 换个说法就是,远程帧就像一个命令一样,如果节点A需要节点B发送数据给他,那么A就需要发送远程帧给B,B收到后就会将数据帧发送给A。
错误帧
当节点监测到一个或多个由CAN标准所定义的错误时,就会产生一个错误帧。错误帧由错误标志和错误界定符两部分组成 。
错误标志分为主动错误标志和被动错误标志:
- 主动错误标志由6个连续的
显性 位组成; - 被动错误标志由6个连续的
隐性 位组成,除非被其他节点的显性位覆盖; - 错误界定符由8个连续的隐性位组成。
什么时候发带有主动错误标志的错误帧?什么时候发带有被动错误标志的错误帧?这里首先我们来讲节点的错误状态
节点的三种错误状态
主动错误状态 :节点处于主动错误状态可以正常通信、处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发送主动错误标志。
被动错误状态 :节点处于被动错误状态可以正常地通信,处于被动错误状态地节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志。
总线关闭状态 :节点处于总线关闭状态不能收发报文,只能一直等待,在满足一定条件时才能再次进入到主动错误状态正常收发报文。 一个CAN节点在什么情况下处于主动错误状态,什么情况下处于被动错误状态?根据CAN协议的规定,CAN节点内有两个计数器:发送错误计数器TEC和接收错误计数器REC,CAN节点就是根据这两个计数器值的大小来判断处于什么状态的
- 0<REC<=127 且 0<TEC< =127时,节点处于
主动错误状态 。在该状态下,节点检测到一个错误就会发送带有注定错误标志的错误帧,因为主动错误标志是连续六个显性位,所以这个时候主动错误标志就会覆盖总线上其他位信号,这样CAN总线上之前传输的报文就被这六个显性位破坏掉了。这就相当于发现了错误的节点主动站出来报告告诉总线上其他节点,刚才的信号有问题,你们不要接收处理,丢掉就好。 - 如果某个节点发送错误帧的次数较多,以至于REC>127或TEC>127,那么该节点就处于被动错误状态。在该状态下,节点检测到一个错误就会发送带有被动错误标志的错误帧,因为被动错误标志是连续的六个隐性位,所以这个时候总线上传输的报文都不会受到该被动错误帧的影响,其他节点收发正常。
- 已经处于被动错误的节点,仍然多次发送被动错误帧,最终使得TEC>255,这样就进入总线关闭状态。
在该状态下,节点无法收发报文 ,从总线上离线。只有等到检测到128次11个连续的隐性位时,TEC和REC才会重置0,节点回到主动错误状态。
CAN总线错误分类 CAN节点计数器如何计数
超载帧
超载帧用于先前和后续的数据帧(或远程帧)之间提供一附加延时,超载标志由6个显性位组成,超载界定符由8个连续的隐性位组成 。
CAN总线非破坏性仲裁
在CAN总线上发送的每一条报文都是具有唯一的一个11位或29位数字的ID,当节点同时发送报文时CAN总线将按“线与”机制对ID的每一位进行判断,当有一个节点发送0则总线的状态就是0.所以ID的值越小优先级越高,这也是为什么在整车上越重要的报文ID值越小 。
如下图节点1、2、3同时发送报文,依次对比ID的每一位,节点3的ID值最小,最终取得了CAN总线的控制权
CAN总线位填充机制
CAN总线采用多种抗干扰措施以减少消息帧在传送过程中出错,位填充技术是其中很重要的一种。CAN总线规定信号的跳变沿即为同步信号,所以只要信号发生了变化,节点时钟就会被同步。但如果有连续相同的信号发送,没有跳变发生,则可能出现发送接收节点不同步,从而导致信号异常。所以当检测到5个连续相同的位信号时,实际发送会自动插入一个补码发送,然后再接着发送原有信号
SOF之前的总线空闲区域,不需要同步,无需进行位填充。CRC之后的位域都是固定格式,不允许位填充操作。
CAN总线位时序及同步
位定时是指CNA总线上一个数据位的持续时间,主要用于CAN总线上各节点的通信波特率设置,同总线上的通信波特率必须相同 。
正常的位时间 = 1/波特率。(比如1Mbit/s波特率,一个位的发送时间就是1微妙)
位时间可以分为以下四段:
- 同步段:用于同步总线上不同的节点,该段内需要一个跳变沿;
- 传播段:用于补偿CAN网络上的物理延迟;
- 相位缓冲段1和2:用于补偿相位误差,可以通过重同步加长或缩短。
CAN通信数据流不包含时钟信息,CAN总线规范中定义的同步保证报文可以不管节点间积累的相位误差正确的译码。
CAN的同步方式包括硬同步 和重同步 两种:
- 一个位时间内只允许一种同步方式,要么硬同步要么重同步;
- 任何一个从隐性到显性的下降沿都可以用于同步;
- 硬同步发生在报文的SOF位(帧起始),所有接收节点调整各自当前位的同步段,使其位于发送的SOF位内;
- 重同步发生在一个报文SOF位之外的其他段,当下降沿落在了同步段之外发生重同步;
- 在SOF到仲裁场发送的时间段内,如果有多个节点同时发送报文,那么这些发送节点对跳变沿不进行重同步。
硬同步 发送在SOF位,所有接收节点调整各自当前位的同步段,调整宽度不限。
发送节点Node_A在发送SOF位时,SOF位的下降沿在同步(SS)段,这个时候NodeB发现自己当前位的SS段和发送节点SOF位的同步SS段不同步,于是接收Node_B强行将自己当前位的SS段拉到与SOF位的SS段同步。
重同步 发生在一个报文SOF位之外的其他场内,当接收节点Node_b当前位的下降沿落在了发送节点Node_A当前位的同步段之外发生重同步。
发的晚,收的早,会导致相位缓冲段1延长。 发送节点Node_A当前位的SS段产生的时候,接收节点Node_B当前位的SS段已经早于他产生了,此时接收节点Node_B就要延长一段时间与Node_A的采样点进行同步。
发的早,收的晚,会导致相位缓冲2缩短 。发送节点Node_A当前位的SS段产生时间早于接收节点Node_B的当前位SS段产生时间,此时接收节点Node_B要缩短相位缓冲段2,以保证两者采样点同步。
至此CAN的基本原理就结束了,有兴趣的同学可以在B站上观看教程(含实验) 传送门
|