can总线通讯入门教程(CAN总线原理-精华整理)

CAN总线是汽车电子工程师必备基础知识,如今街上跑的每台车几乎都应用了CAN总线通信协议,那什么是CAN总线?它又是如何联系汽车上各个电子控制单元的?汽车电子工程师又是如何设计开发CAN通信的?下面我们一一道来。

为了大家阅读有所侧重,以下内容用★号做了标识:★★★★★表示汽车电子工程师必须熟悉的★★★★表示汽车电子工程师推荐了解的★★★及以下表示专门从事CAN总线开发的工程师需要知道的

什么是CAN总线?★★★★★

CAN(Controller Area Network)是二十世纪八十年代初德国Bosch公司为解决现代汽车中众多电控单元(ECU)之间的数据交换而开发的一种多主机局部网络串行通信协议

1983年 由Bosch和Intel共同开发1987年 第一块CAN控制器芯片(Intel)1990年 第一辆应用CAN的量产车:Mercedes S-Class1991年 CAN 2.0发布(PART A 与 PART B)1993年 CAN成为ISO标准(ISO 11898)

很多同学一看这名字就晕了,其实可以简单把CAN通信理解成开一场电话会议,当一个人讲话时其他人就听(广播),当多个人同时讲话时则根据一定规则来决定谁先讲话谁后讲话(仲裁),这就好比会议中你和领导同时讲话,你肯定会很识趣地让领导先讲。

但值得注意的是,在这场会议中,讲话人会确认听话人是否成功接收信息,如果说话人传递的信息有误,听话人会及时指出错误。

can总线通讯入门教程(CAN总线原理-精华整理)(1)

CAN总线有哪些优势?★★★★★

随着通信技术的发展,现今通信方式和协议五花八门,但CAN通信仍然是车载网络最安全可靠且应用最广的技术之一。

过去,汽车通常采用常规的点对点通信方式将电子控制单元及电子装置连接起来,但随着电子设备的不断增加,导线数量也随之增多,采用CAN总线网络结构,可以达到信息共享、减少布线、降低成本以及提高总体可靠性的目标。

总的来说CAN总线有以下几点优势:

① 数据传输速度相对较高,可达到1 Mbit/s。(CAN-FD和CAN-XL分别可以达到2 Mbit/s和10 Mbit/s。)

② 采用差分数据线,抗干扰能力强;

③多主通信模式,大幅减少单点通信线束成本;

④具有错误侦听的自我诊断功能,通信可靠性较高。

CAN总线原理及工作机制是怎样的?★★★★★

这一部分内容比较多,建议小伙伴们沉下心来阅读。

(1)CAN通信硬件基础:接口电路

CAN总线节点有两种硬件构成方案:

① MCU控制器 独立CAN控制器 CAN收发器。(独立CAN控制器如NXP半导体的SJA1000等)使用独立CAN控制器程序复用移植性较好,但占用主控芯片I/O资源。

② 集成CAN控制器的MCU CAN收发器。(集成CAN控制器的单片机如NXP半导体的P87C591等)该方案程序复用性不佳,有很强针对性,但可以使电路更加简单。

如下图完整的CAN接口电路包括接收发送CAN报文的CAN控制器,转换数字信号和CAN信号的CAN收发器,消除噪声的滤波器以及提供合适阻抗的CAN高和CAN低终端电路

can总线通讯入门教程(CAN总线原理-精华整理)(2)

(2)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”表示,这里可能有小伙伴会问为什么“0”是显性,感官上不应该这样规定啊?其实这是因为CAN总线采用“线与”规则进行冲突仲裁,即当多个CAN信号同时发送时,有的发1有的发0,而只要有0,当前总线就是0(1&0 = 0),看上去就是1被0覆盖了。另一方面,从电位看,高电位为0,当1和0同时发送时,总线处于高电位,显现出来的是0,所以把0规定为显性。

can总线通讯入门教程(CAN总线原理-精华整理)(3)

下面我再来说说CAN消息帧(报文)是怎么实现信息交换的。一般书本教材都是先讲CAN报文的格式再去谈应用,但这对于强调应用的工程技术人员并不友好,所以我们反着来讲,先看下在车辆开发中ECU报文都是如何传递有用信息的,开发工程师常接触的知识点有哪些。

拿发动机控制单元EMS的一条报文举例,我们要知道哪些关键信息?

can总线通讯入门教程(CAN总线原理-精华整理)(4)

这条报文的名称为EMS_Control,ID为0x100,报文发送周期是10ms,报文长度为8个byte。上表定义了两个典型信号:

一个信号为发动机转速EMS_RPM,数据长度8bit,那这8bit如果按照二进制与十进制单纯转换,只能表示 ,但这远远不能覆盖实际发动机高达几千的转速,所以工程师们想了个办法,让二进制转换来的数乘上系数再加上偏置数来表达实际值,如例子里面转速范围为0~7650,这个最大值7650就是得来的。

第一个信号是表示数值,另外一个信号则是常用的标志位信号,通常来反映系统所处的状态。例子中的EMS_FAIL_F表示发动机控制单元是否出现错误,只占1bit,也就是只有两个状态,0b表示运行正常,1b表示出现错误。

是不是大概理解报文里面工程应用的一些关键信息了?那还有没提到的报文起始字节和数据起始字节又如何理解?我们先来看一张图:

can总线通讯入门教程(CAN总线原理-精华整理)(5)

这个是汽车电子工程师常用工具CANoe里面报文layout的一张截图,关于CANoe的使用及仿真编程在后面的文章会详细介绍,我们先看看这个图怎么看。第一列从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协议就能转换成我们想要的结果。

说到这里,大家应该对整车开发常用的CAN报文格式有了粗略的印象,但是CAN报文在传输中可不只是这8个byte总共64bit在双绞线上跑,这8个byte只是具有实际工程意义的数据场信号,整车几十个ECU彼此之间要准确无误的发送接收消息则要遵循一定的规则。

CAN消息帧格式★★★★

相互通信的ECU要想彼此收发消息,需要使用相同的CAN报文格式,这就好比两个不同母语的人要对话必须讲同一种语言才行,不然就是鸡同鸭讲了。目前主要有CAN2.0A和CAN2.0B两种技术规范。

CAN2.0A规定了11位标识符的标准帧格式,CAN2.0B在此基础上又增加了一种具有29位标识符的扩展帧格式。

CAN消息帧根据用途不同分为四种类型:数据帧、远程帧、错误帧、超载帧。

(1)数据帧:用于传送数据

can总线通讯入门教程(CAN总线原理-精华整理)(6)

帧起始:标志一个数据帧的开始,仅由一个显性位构成,只有在总线空闲期间才能够发送。

仲裁场:在标准帧中,仲裁场由11位标识符和RTR位组成;在扩展帧中,仲裁场由29位标识符、SRR位、IDE位和RTR位组成。

ID(标识符)是用来确定一条报文,表明报文含义及优先级,如上面举例的0x100。

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~8个byte,如上面举例的主要信息就是围绕数据场来说明的,这也是整车电子工程师讨论得最多的一部分内容,如果你不是专门的CAN设计工程师,其他的格式内容仅作了解即可。

CRC场:包括CRC序列CRC界定符DEL,CRC校验是为了通信双方的安全可靠性制定的”暗号“,只有发送方根据发送信息计算的CRC值与接收方根据接收信息计算的CRC值对上,才能判断这次通信成功了,否则就会报错。

can总线通讯入门教程(CAN总线原理-精华整理)(7)

应答场:包括2位,应答间隙(ACK)和应答界定符(DEL)。发送节点发出的报文中ACK及DEL均为隐性电平1,接收节点正确接收后会用显性电平0覆盖隐性电平,以表示正确接收。总结说就是,正确接收ACK=0,DEL=1;未正确接收ACK=DEL=1。

can总线通讯入门教程(CAN总线原理-精华整理)(8)

帧结束:7个连续的隐性位,表示数据帧结束。节点在检测到11个连续的隐性位后认为总线空闲。

(2)远程帧:向其他节点请求发送具有同一标识符的数据帧,远程帧没有数据场,且RTR位为隐性电平。

can总线通讯入门教程(CAN总线原理-精华整理)(9)

(3)错误帧:当节点监测到一个或多个由CAN标准所定义的错误时,就会产生一个错误帧。错误帧由错误标志错误界定符两个部分组成。

错误标志分为主动错误标志被动错误标志

  • 主动错误标志由6个连续的显性位组成;
  • 被动错误标志由6个连续的隐性位组成,除非被其他节点的显性位覆盖;
  • 错误界定符由8个连续的隐性位组成。

can总线通讯入门教程(CAN总线原理-精华整理)(10)

can总线通讯入门教程(CAN总线原理-精华整理)(11)

什么时候发带有主动错误标志的错误帧?什么时候发带有被动错误标志的错误帧?这里我们先要说下节点的错误状态。

节点的错误状态有三种,主动错误状态、被动错误状态、总线关闭状态。

主动错误状态:节点处于主动错误状态可以正常通信,处于主动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出主动错误标志。

被动错误状态:节点处于被动错误状态可以正常通信,处于被动错误状态的节点(可能是接收节点也可能是发送节点)在检测出错误时,发出被动错误标志。

总线关闭状态:节点处于总线关闭状态不能收发报文,只能一直等待,在满足一定条件时才能再次进入到主动错误状态正常收发报文。

can总线通讯入门教程(CAN总线原理-精华整理)(12)

一个CAN节点在什么情况下处于主动错误状态,什么情况下处于被动错误状态?根据CAN协议的规定,CAN节点内有两个计数器:发送错误计数器TEC和接收错误计数器REC,CAN节点就是根据这两个计数器值得大小来判断处于什么状态的。

  • 0<REC<=127且0<TEC<=127时,节点处于主动错误状态。在该状态下,节点检测到一个错误就会发送带有主动错误标志的错误帧,因为主动错误标志是连续六个显性位,所以这个时候主动错误标志将会覆盖总线上其他位信号,这样CAN总线上之前传输的报文就被这六个显性位破坏掉了。这就相当于发现错误的节点主动站出来告诉总线上其他节点,刚才的信号有问题,你们都不要接收处理,丢掉就好了。
  • 如果某个节点发送错误帧次数较多,以至于REC>127或TEC>127,那么该节点就处于被动错误状态。在该状态下,节点检测到一个错误就会发送带有被动错误标志的错误帧,因为被动错误标志是连续六个隐性位,所以这个时候总线上传输的报文都不会受到该被动错误帧的影响,其他节点收发正常。
  • 已经处于被动错误状态的节点,仍然多次发送被动错误帧,最终使得TEC>255,这样就进入总线关闭状态。在该状态下,节点无法收发报文,从总线上离线。只有等到检测到128次11个连续的隐性位时,TEC和TEC才会重新置0,节点回到主动错误状态。

CAN总线错误分类:

can总线通讯入门教程(CAN总线原理-精华整理)(13)

CAN节点计数器如何计数:

can总线通讯入门教程(CAN总线原理-精华整理)(14)

(4)超载帧:超载帧用于在先前和后续的数据帧(或远程帧)之间提供一附加延时,超载标志由6个显性位组成,超载界定符由8个连续的隐性位组成。

can总线通讯入门教程(CAN总线原理-精华整理)(15)

CAN总线非破坏性仲裁★★★★★

在CAN总线上发送的每一条报文都具有唯一的一个11位或29位数字的ID,当节点同时发送报文时CAN总线将按”线与“机制对ID的每一位进行判断,当有一个节点发送0则总线的状态就是0,所以ID的值越小优先级就越高,这也是为什么在整车上越重要的报文ID值越小。

如下图节点1,2,3同时发送报文,依次对比ID的每一位,节点3的ID值最小,最终取得了CAN总线的控制权。

can总线通讯入门教程(CAN总线原理-精华整理)(16)

CAN总线位填充机制★★★

CAN总线采用多种抗干扰措施以减少消息帧在传送过程中出错,位填充技术是其中很重要的一种。CAN总线规定信号的跳变沿即为同步信号,所以只要信号发生变化了,节点时钟就会被同步。但如果有连续相同的信号发送,没有跳变发生,则有可能出现发送接收节点不同步,从而导致信号异常。所以当检测到5个连续相同的位信号时,实际发送会自动插入一个补码发送,然后再接着发送原有信号。

SOF之前的总线空闲区域,不需要同步,无需进行位填充。CRC之后的位域都是固定格式,不允许位填充操作。

can总线通讯入门教程(CAN总线原理-精华整理)(17)

下图举例说明了位填充机制具体是如何操作的,值得注意的是第二个填充位也被包含到了5个连续相同位的计数中,因为填充位同样是被当成总线数据位处理的。

can总线通讯入门教程(CAN总线原理-精华整理)(18)

CAN总线位时序及同步★★★

位定时是指CAN总线上一个数据位的持续时间,主要用于CAN总线上各节点的通信波特率设置,同一总线上的通信波特率必须相同。

正常的位时间=1/波特率。(比如1Mbit/s波特率,一个位的发送时间就是1微秒)

位时间可以分为以下四段:

  • 同步段:用于同步总线上不同的节点,该段内需要一个跳变沿;
  • 传播段:用于补偿CAN网络上的物理延迟;
  • 相位缓冲段1和2:用于补偿相位误差,可以通过重同步加长或缩短。

can总线通讯入门教程(CAN总线原理-精华整理)(19)

CAN通信数据流中不包含时钟信息,CAN总线规范中定义的同步保证报文可以不管节点间积累的相位误差正确地译码。

CAN的同步方式包括硬同步重同步两种:

  • 一个位时间内只允许一种同步方式,要么硬同步要么重同步;
  • 任何一个从隐性到显性的下降沿都可以用于同步;
  • 硬同步发生在报文的SOF位(帧起始),所有接收节点调整各自当前位的同步段,使其位于发送的SOF位内;
  • 重同步发生在一个报文SOF位之外的其他段,当下降沿落在了同步段之外时发生重同步;
  • 在SOF到仲裁场发送的时间段内,如果有多个节点同时发送报文,那么这些发送节点对跳变沿不进行重同步。

硬同步发生在SOF位,所有接收节点调整各自当前位的同步段,调整宽度不限。

发送节点Node_A在发送SOF位时,SOF位的下降沿在同步(SS)段,这个时候接收节点Node_B发现自己当前位的SS段和发送节点SOF位的同步SS段不同步,于是接收Node_B强行将自己当前位的SS段拉到与SOF位的SS段同步。

can总线通讯入门教程(CAN总线原理-精华整理)(20)

重同步发生在一个报文SOF位之外的其他位场内,当接收节点Node_b当前位的下降沿落在了发送节点Node_A当前位的同步段之外时发生重同步。

发得晚,收得早,会导致相位缓冲段1延长。发送节点Node_A当前位的SS段产生的时候,接收节点Node_B当前位的SS段已经早于它产生了,此时接收节点Node_B就要延长一段时间与Node_A的采样点进行同步。

can总线通讯入门教程(CAN总线原理-精华整理)(21)

发得早,收得晚,会导致相位缓冲段2缩短。发送节点Node_A当前位的SS段产生时间早于接收节点Node_B的当前位SS段产生时间,此时接收节点Node_B要缩短相位缓冲段2,以保证两者采样点同步。

can总线通讯入门教程(CAN总线原理-精华整理)(22)

到这里,常用的CAN通信原理就介绍完了,希望对各位有所帮助。

参考:

1.恒润科技-CAN基础.PDF

2. 恒润科技-CAN总线快速入门.PDF

3.《汽车CAN总线系统原理、设计与应用》 罗峰 孙泽昌 著

4.《CAN总线嵌入式开发从入门到实战》 牛跃听 周立功 方丹 等编著

5.《CAN入门》 瑞萨

6. CAN总线学习笔记(1)~(5) CSDN站点

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页