查看: 3343|回复: 5

干货分享 | CAN 2.0总线协议详解

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2019-8-20 09:39:13 | 显示全部楼层 |阅读模式
    引言

    CAN是Controller Area Network的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。

    由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应"减少线束的数量"、"通过多个LAN,进行大量数据的高速通信"的需要,1986年德国汽车电子巨头博世(BOSCH)公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,在欧洲乃至全球已成为汽车网络的标准协议,也是目前汽车电子应用中使用最广泛的通信协议。

    CAN经过30多年的发展,其高性能和可靠性早已被市场所验证和认可,除汽车电子外,还被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。

    但是,很多汽车电子ECU的开发工程师却并不真正清楚CAN总线协议本身,这让很多工程师,在实际ECU项目的CAN总线硬件设计和软件开发过程中遇到CAN总线相关的问题时无从下手,事倍功半。
          
    本文就为大家详细梳理一下CAN总线中,目前使用最为广泛的CAN 2.0 A/B协议,该版本也被称作传统CAN(Classic CAN)协议,希望能够让大家对CAN总线协议有一个比较全面深入的了解,从而厚积薄发、让CAN总线开发变得更easy,事倍功半!
         

    CAN总线发展历史与ISO规范


    控制器局域网CAN(Controller Area Network),最初是由德国Bosch公司设计的,应用于汽车的监测和控制。
          
    作为一种技术先进、可靠性高、功能完善、成本合理的远程网络通讯控制方式,CAN总线被广泛应用到各种电磁辐射强和振动大的工业环境和控制领域。
         
    1991年9月,Philips半导体公司制定并发布了CAN技术规范:CAN 2.0 A/B。CAN协议经 ISO标准化后有ISO11898标准和ISO11519-2标准两种。ISO11898和ISO11519-2标准对于数据链路层的定义相同,但物理层不同。
          
    CAN总线是唯一成为国际标准的现场总线,也是国际上应用最广泛的现场总线之一。

    CAN总线规范(Version 2.0)

        CAN2.0 A:CAN标准报文格式
        CAN2.0 B:CAN标准报文格式和扩展报文格式

    CAN总线技术规范的目的

        定义数据链路层
        定义CAN协议在周围各层中所发挥的作用

    CAN总线主要功能特性


    CAN总线控制器中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等项工作。
    30.png

    CAN总线网络中通信节点个数在理论上不受限制

    CAN协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码。采用这种方法的优点可使网络内的节点个数在理论上不受限制,数据块的标识符可由11位或29位二进制数组成,因此可以定义2或2个以上不同的数据块,这种按数据块编码的方式,还可使不同的节点同时接收到相同的数据,这一点在分布式控制系统中非常有用。

    数据段长度最多为8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长,从而保证了通信的实时性。CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。CAN卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。

    各节点之间可实现自由通信


    CAN总线采用了多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播通信的特点。CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。CAN总线协议已被国际标准化组织认证,技术比较成熟,控制的芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数据通讯。CAN总线插卡可以任意插在PC AT XT兼容机上,方便地构成分布式监控系统。

    CAN 2.0总线具有如下显著功能特性


         多主(master)架构依据优先权进行总线访问
         无破坏性的基于优先权的逐位仲裁     借助验收滤波器的多地址帧传递
         远程数据请求
         全系统数据相容性
         错误检测和出错信令
         很远的数据传输距离(长达10Km@5Kbps)
         高速的数据传输速率(高达1Mbps)
         高度实时性:每帧报文允许传输最高8个字节的数据
         发送期间丢失仲裁或出错而遭到破坏的帧可自动重发
         暂时错误和永久性故障节点的判别以及故障节点的自动脱离
         脱离总线的节点不影响总线的正常工作

    CAN 2.0总线协议的物理层电气特性



    MCU硬件只能提供3.3V/5V的TTL/CMOS电平信号,而CAN总线上传输的是差分信号。因此CAN2.0总线规范的物理层规定了CAN总线通信的物理层(Physical Layer, CAN收发器)实现要求:
    31.png

         使用双绞线通信,一根为CAN_H,另一根为CAN_L.

         总线上的电平有显性电平和隐性电平两种。
         总线上执行逻辑上的线“与”时,显性电平的逻辑值为“0”,隐性电平为“1”。

    “显性”具有“优先”的意味,只要有一个单元输出显性电平,总线上即为显性电平。并且,“隐性”具有“包容”的意味,只有所有的单元都输出隐性电平,总线上才为隐性电平。(显性电平比隐性电平更强)

    在一个CAN网络的最远两个节点需要端接120Ω的匹配电阻,才能保证信号传输,进行正常通信。

    ISO11898和ISO-11519-2两个不同的CAN总线标准在物理层上规范的通信电平对比如下:
    32.png

    常用的SO11898规范规定:

         逻辑“1” 时,总线呈现“隐性”状态。VCAN-H和VCAN-L固定在平均电压2.5V,即Vdiff近似为0。


         逻辑“0” 时,总线呈现“显性”状态。VCAN-H为3.5V,VCAN-L为1.5V,即Vdiff为2V??

    Tips


    ISO11898和ISO-11519-2两个不同的CAN总线标准的差别还包括:

         ISO11898 是通信速度为 5kbps-1Mbps  的 CAN 高速通信标准。

         ISO11519 是通信速度为 125kbps以下的 CAN 低速通信标准,也就是容错CAN(LSFT CAN)。提供从5 Kbit/s到125 Kbits/s的波特率。该标准允许在CAN总线连线失败时CAN总线通信得以继续进行。在低速/容错CAN网络,每种设备都有它自己的终端。
    电平不同,匹配电阻不同。由于终端的类型不同,因此高速和低速/容错CAN设备不能在同一个网络中使用。
    33.png

    Tips


    不仅是ISO,SAE(Society of Automotive Engineers)等其它的组织、团体、企业也对 CAN 协议进行了标准化。其他标准介绍下:
    34.png

    Tips


    通常使用CAN收发器都是符合ISO11898规范的,比如NXP的TJA1040/2/3/4/5/6以及TJA1050/1/2等;而符合ISO1111519-2规范的CAN收发器使用介绍,只有NXP的TJA1055T



    Tips


    两个CAN节点即使时同一个MCU中的两个CAN控制器)间(通信必须使用CAN收发器,并连接匹配的端接电阻,否则无法完成CAN报文传输。

    CAN 2.0总线协议消息报文详解


    CAN2.0总线的通信报文帧格式(Message Frame Format)

    CAN2.0总线有两种不同的CAN帧格式

         具有11位标识符的CAN帧称为:标准帧(Stand Frame)
         具有29位标识符的CAN帧称为:扩展帧(Extend Frame)
                
    CAN规范2.0B中引入了第二种报文格式——扩展帧,同时兼容CAN规范2.0A的标准帧:

         CAN控制器必须完全支持标准帧(收/发),半双工通信
         CAN控制器必须支持接收扩展帧

    CAN2.0总线的通信报文帧类型(Message Frame Type)

    CAN2.0总线规定了4种不同的通信报文帧类型,用于不同的通信目的:
    35.png

    CAN2.0总线通信报文之标准/扩展数据帧

    CAN2.0总线的通信报文的数据帧是使用最大的帧类型,一帧完整的CAN 2.0总线数据帧报文包含如下7个场(Field,也有译作域):

         帧起始(Start Of Frame)
         仲裁场(Arbitration Field)
         控制场(Control Field )
         数据场(Data Field )
         CRC场(CRC Filed)
         应答场(ACK Field)
         帧结尾(End Of Frame)
    36.png

    CAN 2.0总线标准数据帧(Standard Data Frame)结构如下:

         帧起始:标志数据帧和远程帧的起始,它仅由一个“显性”位构成。

         仲裁场:由标识符(ID)和远程发送请求(RTR)位组成。

    标识符 (Identifier) 的长度为11位。这些位以ID-10至ID-0的顺序发送,最低位为ID-0,其中最高7位(ID-10 ~ID-4)必须不是全“隐性”。

    RTR位 (Remote Transmission Request Bit) 在数据帧中,必须是“显性”的,而在远程帧中,RTR位必须是“隐性”的。

        控制场:由6位组成,包括两个用于将来扩展的保留位和4位数据长度码

         数据场:由数据帧中被发送的数据组成,它可包括0至8个字节,每个字节包括8位,其中首先发送最高有效位(MSB)。??

        CRC场:包括CRC序列、CRC界定符。

    参加CRC校验的位场包括帧起始、仲裁场、控制场、数据场(假若存在)在内的无填充位流。CRC序列后随CRC界定符,它只包括一个“隐性”位。

         应答场:为两位长度,包括应答间隙和应答界定符。

    在应答场中发送站送出两个“隐性”位。一个正确地接收到有效报文的接收器,在应答间隙期间,通过传送一个“显性”位将此信息报告给发送器(接收器发送“应答”)。所有接收到匹配CRC序列的站,在应答间隙期间通过把“显性”位写入发送器的“隐性”位来报告此信息。应答界定符是应答场的第二位,并且必须是“隐性”位。因此,应答间隙被两个“隐性”位(CRC界定符和应答界定符)包围。

        帧结束:每个数据帧和远程帧均是由7个“隐性”位组成的标志序列界定的。??

    CAN 2.0总线扩展数据帧(Extend Data Frame)结构如下:

    相比标准数据帧,扩展数据帧的ID为29-bit,控制场的IDE-bit为1:
    37.png

    Tips


    两种帧格式的区别通过“控制场”(Control Field)中的“识别符扩展”位(IDE bit)来实现;

    两种帧格式可出现在同一总线上。

    CAN2.0总线通信报文之标准/扩展远程帧

    CAN2.0总线的通信报文的远程帧是用于请求远程CAN节点发送本节点所需的数据,一帧完整的CAN 2.0总线远程帧报文包含如下6个场(Field,也有译作域):

         帧起始(Start Of Frame)

         仲裁场(Arbitration Field)

         控制场(Control Field )

         CRC场(CRC Filed)

         应答场(ACK Field)

         帧结尾(End Of Frame)

    与数据帧一样,远程帧也有二种--标准远程帧、扩展远程帧。

    除了没有数据场(Data field),以及RTR位是隐性(“1”)以外,远程帧与数据帧完全一样。

    数据帧和远程帧的不同

         远程帧的RTR位为隐性位,没有数据段。

         没有数据段的数据帧和远程帧可通过RTR位区别开来。

    远程帧没有数据段,数据长度码该如何表示?

    远程帧的数据长度码以所请求数据帧的数据长度码表示;。

    CAN2.0总线的通信报文之错误帧
          
    CAN2.0总线协议中规定:当节点检测到一个或多个由CAN标准所定义的错误时,就产生一个错误帧。

    错误帧由错误标志错误界定符构成。

    错误标志包括主动错误标志和被动错误标志两种:

    主动错误标志:6 个位的显性位。

    被动错误标志:6 个位的隐性位。

    错误界定符


    错误界定符由 8 个位的隐性位构成。

    CAN2.0总线的通信报文之过载帧

    CAN2.0总线协议中规定:过载帧用于在先行和后续的数据帧(或远程帧)之间提供一附加的延时。

    过载帧由过载标志和过载界定符构成。
         
    过载标志:6个位的显性位。过载标志的构成与主动错误标志的构成相同。

    过载界定符:8 个位的隐性位。过载界定符的构成与错误界定符的构成相同。
    38.png

    CAN2.0总线的通信报文之帧间空间

    帧间空间是用于分隔数据帧和远程帧。数据帧和远程帧可通过插入帧间隔将本帧与前面的任何帧(数据帧、远程帧、错误帧、过载帧)分开。

    过载帧和错误帧前不能插入帧间隔。

    帧间空间的组成:

    间歇场 : 3个位的隐性位。

    总线空闲场 : 隐性电平,无长度限制(0亦可)。
         
    本状态下,可视为总线空闲,要发送的节点可开始访问总线。
         
    暂停发送场发送暂时停止:8个位的隐性位。

    只在处于被动错误状态的节点刚发送一个消息后的帧间隔中包含。
    40.png

    CAN 2.0总线协议的总线仲裁(Bus Arbitration)


    总线空闲时,任何节点可以开始发送报文;总线上每条报文都具有唯一的一个11位或29位标识符;报文标识符的值越小,报文具有越高的优先权。

    多个节点同时发送时,总线在“仲裁场”进行“逐位仲裁” ;传送高优先级报文的节点赢得仲裁,并继续传输报文;失去仲裁的节点在总线空闲时重新传送。

    在总线空闲态,最先开始发送消息的单元获得发送权。多个单元同时开始发送时,各发送单元从仲裁段的第一位开始进行仲裁。连续输出显性电平最多的单元可继续发送。

    具有相同ID的数据帧和远程帧在总线上竞争时,仲裁段的最后一位(RTR)为显性位的数据帧具有优先权,可继续发送。

    标准格式ID与具有相同ID的远程帧或者扩展格式的数据帧在总线上竞争时,标准格式的 RTR 位为显性位的具有优先权,可继续发送。   

    CAN 2.0总线协议的位流编码(Bit Coding)与位填充(Bit Stuffing)


    CAN 2.0总线协议规定位流编码采用“不归零”(NRZ)方法编码。在完整的位时间里,位电平要么为“显性”,要么为“隐性”;

    各个位的开头或者结尾都没有附加同步信号。发送单元以与位时序同步的方式开始发送数据。接收单元则根据总线上电平的变化进行同步并进行接收工作。

    另外,发送单元和接收单元存在的时钟频率误差及传输路径上的(电缆、驱动器等)相位延迟会引起同步偏差。因此接收单元通过硬件同步或者再同步的方法调整时序进行接收。

    为了保证通信过程中时钟有足够的跳边沿以实现总线各节点重新同步;要求CAN控制器采取“位填充”(Bit Stuffing):

    当发送器检测到位流里有5个连续相同值的位,便会自动在位流里插入一补充位,接收器会自动删除这个补充位。

    最多经过5个位时间,各节点可以重同步。

    能够通过总线上的错误标志(Error Flag  6个连续相同的位)反映发送错误。

    在固定的位场中不使用位填充,只对在发送数据帧和远程帧时,SOF〜CRC 场间的数据进行位填充。

    下图为一个具体的位填充实现结果,在发送系列的BIT8和BIT16分别自动加入了一个隐性位(逻辑"1"):
    41.png

    CAN 2.0总线协议的错误检测机制


    为了保证通信的正常,CAN 2.0 总线协议总线中各节点需要采取以下措施进行错误检测:

         监视(对发送位的电平与被监控的总线电平进行比较)

         循环冗余检查

         位填充

         报文格式检查  

    CAN 2.0 总线协议的错误检测机制具有以下属性:

         检测到所有的全局错误

         检测到发送器所有的局部错误

         可以检测到报文里多达5个任意分布的错误

         检测到报文里长度低于15-bit的突发性错误

         检测到报文里任一奇数个错误

         对于没有被检测到的错误报文,其剩余的错误可能性概率低于:报文错误率4.7 x 10-11

    CAN 2.0总线节点的错误类型

    CAN 2.0 总线协议定义参与通信的CAN节点错误类型如下:

          位错误(Bit Error):发送的位值和总线监视的位值不相符合时,检测到一个位错误(除仲裁场、应答场外);

         填充错误(Stuff Error):如果在使用位填充编码的位流中,出现了第六个连续相同的位电平,将检测到一个位填充错误;

         形式错误 (Form Error):当一个固定形式的位场含有一个或多个非法位时,将检测到一个形式错误;

         应答错误 (Acknowledgment Error):在应答间隙(ACK SLOT)所监视的位不为“显性”,则会检测到一个应答错误;

         CRC错误(CRC Error):如果接收器的CRC结果和发送器的CRC结果不同,将检测到一个CRC错误。

    CAN 2.0总线节点的故障界定

    CAN 2.0总线节点使用两种错误计数器进行故障界定:

         发送错误计数(TEC)

         接收错误计数(REC)

    CAN 2.0 总线协议规定了12条错误计数规则:

         节点发送时产生错误,将导致TEC加8;

         节点成功发送1帧报文后,TEC将减1,直到0;

         节点接收时检测到错误,将导致REC加8;

         节点成功接收1帧报文后,REC将减1,直到0;

       (以下略)……

    CAN 2.0 总线节点的状态

    根据以上错误检测机制和故障界定方法,CAN 2.0总线节点存在以下三种状态:

    42.png

    错误主动(Error Active):“错误主动”的节点可以正常地参与总线通讯,并在错误被检测到时发出主动错误标志。

    错误被动(Error Passive):“错误被动”的节点不允许发送主动错误标志。“错误被动”的单元参与总线通讯,在错误被检测到时只发出被动错误标志。

    总线关闭(Bus Off):“总线关闭”的单元不允许在总线上有任何的影响 (比如,关闭输出驱动器)。

    Tips


    一个特例:如果CAN总线上只有一个节点,该节点发送数据帧后得不到响应(ACK),其发送计数器TEC最大只能计到128,即该节点只能进入错误被动状态,而不会进入总线关闭状态。

    CAN通信节点的状态分为暂时错误(Error active和Error Passive)和永久性故障(Bus Off)。

    永久性故障节点自动脱离总线,防止网络锁定。

    处于暂时错误(Error active和Error Passive)状态的CAN 2.0总线节点,其状态可以根据其发送错误计数器(TEC)和接收错误计数器(REC)值的变化,自动切换,而进入永久性故障(Bus Off))状态的节点,必须进入重新初始化才能恢复:

    Tips



    Bus Off恢复需要满足于以下两个条件:

         1.在bus off发生后,总线上已经检测到了128次11个连续的隐性位(逻辑"1");

         2.用户程序请求恢复,通常MCU中的CAN控制器都可以支持自动恢复和手动恢复两种方式。CAN总线的bus off恢复需要满足整车的网络管理规范。     

    CAN 2.0总线协议的位定时与同步


    CAN 2.0 总线协议的位时间定义与采用

    CAN 2.0 总线协议定义一个标称的位时间分为:同步段、传播段、相位缓冲段1、相位缓冲段2。

    同步段用于同步各节点,正常情况下跳变沿落在此段内。

    传播段用于补偿网络内的传输延时。

    采样点时刻读取的电平代表这个位的电平。

    43.png

    CAN总线的时间份额通常由振荡器周期分频而得

    各时间段长度为:同步段1份额,传播段1~8份额,相位缓冲段1,1~8份额,相位缓冲段2,Max(相位缓冲段1,信息处理时间),其中信息处理时间<=2份额。一个位的总时间份额数为8~25,可以编程灵活配置。

    CAN 2.0 总线协议的同步机制

    CAN 2.0 总线协议定义位同步的规则如下:

    (1)在总线空闲时,只要检测到一个隐性到显性的边沿,就执行一次硬同步(以该边沿作为同步段)

    (2)在总线不空闲时,若边沿落在同步段以外,则按其与同步段之差执行再同步:

    再同步情况①:边沿落在同步段以后,则把所差份额加到相位缓冲段1

    再同步情况② :边沿落在同步段以前,则从相位缓冲段2减去所差份额

    再同步所加减的份额有个上限,该上限可取值1~4个时间份额,但不可大于相位缓冲段1。

    (3)因为有位填充规则,所以可用于再同步的边沿在一定时间内总会出现。最大可能时间间隔是29个位。

    Tips


    一个位时间内只能执行一次同步,且一般只把隐性到显性的边沿用于同步。

    总结


    本文详细介绍了BOSCH的CAN 2.0总线协议,主要包括CAN总线主要特性、物理层电气特性、帧格式与帧类型、总线仲裁机制、位流编码、位填充、错误检测机制、错误类型、故障界定与节点状态以及位定时与同步等。

    除了CAN 2.0外,BOSCH还定义了一种与之兼容的CAN-FD总线协议--能够提供更高的速率(数据场通信速率可达8/10Mbit/s)和更大的报文帧有效载荷(支持最大64字节),以满足汽车电子日益发展对ECU间高速通信的需求,我将在后续文章中给大家介绍,敬请关注!

    (本文转载自微信公众号「汽车电子expert成长之路」,你可点击【阅读原文】查看原文,并与作者互动交流)







    作者:NXP                 文章出处:NXP客栈
    39.png
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-11-7 15:28
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    1

    主题

    29

    帖子

    0

    注册会员

    Rank: 2

    积分
    62
    最后登录
    2022-1-1
    发表于 2019-10-27 10:19:20 | 显示全部楼层
    很好,学习了
    上道
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-14 00:30
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    1

    主题

    54

    帖子

    0

    注册会员

    Rank: 2

    积分
    108
    最后登录
    2021-6-14
    发表于 2021-5-27 04:29:47 | 显示全部楼层
    是不是这个就是可以控制汽车各种开关的那个?比如有了这个就可以远程打开空调?
    开心
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-3-15 14:42
  • 签到天数: 87 天

    [LV.6]常住居民II

    2

    主题

    130

    帖子

    0

    高级会员

    Rank: 4

    积分
    610
    最后登录
    2024-4-24
    发表于 2022-8-11 19:47:51 | 显示全部楼层
    X G 发表于 2021-5-27 04:29
    是不是这个就是可以控制汽车各种开关的那个?比如有了这个就可以远程打开空调? ...

    是车上各个节点通信的桥梁
    光而不耀,静水长流
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    13
    最后登录
    2022-8-23
    发表于 2022-8-22 15:13:11 | 显示全部楼层
    这个讲解很详细,涨见识,感谢楼主
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 533 天

    [LV.9]以坛为家II

    6

    主题

    2839

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4668
    最后登录
    2024-4-26
    发表于 2022-8-25 09:53:09 | 显示全部楼层
    学习了,谢谢楼主。
    开心
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 22:34 , Processed in 0.126100 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表