CAN总线通信协议的基础知识|报道
引言
本文将介绍CAN总线通信协议的基础知识,目前的内容仅为通用的协议部分,暂不涉及具体的外设模块的用法。研究通信协议的具体内容,主要是看建立通信的物理环境(信号与总线拓扑结构),通信过程的对象(通信帧),以及交互过程(通信或握手过程)。
(相关资料图)
在后续的文章中,将以实现本文描述的协议作为需求,结合具体的IP外设,以及配套的软件,基于具体的硬件电路实现功能。
CAN总线应用
CAN总线有两个ISO国际标准:ISO11898 和 ISO11519。其中:
ISO11898 定义了通信速率为 125 kbps~1 Mbps 的高速 CAN 通信标准,属于闭环总线,传输速率可达1Mbps,总线长度 ≤ 40米。ISO11519 定义了通信速率为 10~125 kbps 的低速 CAN 通信标准,属于开环总线,传输速率为40kbps时,总线长度可达1000米。Tips: 总线的传输速率,又称为总线的通信速率,指的是位速率,或称为比特率(和波特率不是一回事),表示单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。波特率强调的是传送数据的同步载波信号的速率。
在汽车中为了满足车载系统的不同要求,主要采用高速CAN和低速CAN。这两者以不同的总线速率工作以获得最佳的性价比,在两条总线之间采用CAN网关进行连接。
高速CAN总线(动力总线)的传输速率范围在125kbit/s - 1Mbit/s之间,主要用于传动系数传输的实时性要求(如发动机控制、自动变速箱控制、行驶稳定系统、组合仪表等)。低速CAN总线(舒适总线)的传输速率范围在5kbit/s - 125kbit/s之间。主要用于舒适系统和车身系统的数据传输的实时性要求(如空调控制、座椅调节、车窗升降等)。figure-can-network-in-car
图x 整车CAN网络示意图CAN总线是一种串行数据通讯协议,其中包含了CAN协议的物理层以及数据链路层。可以完成对数据的位填充,数据块编码,循环冗余效验,帧优先级的判别等工作。其主要特点如下:
多主机方式工作,网络上任意一个节点(未脱离总线)均可以随时向总线网络上发布报文帧。节点发送的报文帧可以分为不同的优先级,满足不同实时要求。采用载波侦听多路访问/冲突检测(CSMA/CD)技术,当两个节点同时发布信息时,高优先级报文可不受影响地传输数据。节点总数实际可达110个。采用短帧结构,每一帧最多有8个有效字节的数据负载。短帧的优势在于,发送和接收速度快,实时性好,被干扰的概率小,抗干扰能力强。当某个节点错误严重时,具有自动关闭功能,切断与总线的联系,致使总线上的其他操作不受影响。CAN总线信号与拓扑结构(物理层)
CAN总线采用双线差分传输,两根导线分别作为CAN_H、CAN_L,并在终端配备有120Ω的电阻。CAN收发器收到总线信号时,将信号电平转化为逻辑状态,即CAN_H与CAN_L电平相减后,得到一个差分电平。各种干扰(如点火系统)在两根导线上的作用相同,相减后得到的插值电平可以滤过这些干扰(共模抑制)。
figure-can-bus-connection
图x CAN总线连接CAN总线有两种逻辑电平状态,即显性与隐性。显性电平代表“0”,隐性电平代表“1”。采用非归零码编码,即在两个相同电平之间并不强制插入一个零状态电平。
高速CAN在传输隐性状态位时,CAN_H与CAN_L上的电平位均为2.5V;在传输显性状态位时分别为3.5V与1.5V。低速CAN在传输隐性状态位时,CAN_H上的电平为0V,CAN_L上的电平为5V;在传输显性状态位时,CAN_H上的电平为3.6V,CAN_L为1.4V。figure-can-voltage-high-speed
图x 高速CAN总线上的信号电平
figure-can-voltage-low-speed
图x 低速CAN总线上的信号电平为了确保通讯的正确性,总线信号必须在一定时间内出现在总线上,并且保证被正确采样。总线信号传输有一定的时间延迟,最大的可靠的总线波特率与总线长度有关。ISO11898中对各种总线长度有着以下定义:
1Mbit/s 总线长度为40m(规范)。500kbit/s 总线长度最大值为100m(建议值)。250kbit/s 总线长度最大值为250m。125kbit/s 总线长度最大值为500m。40kbit/s 总线长度最大值为1000m。接入CAN总线的设备需要满足一定的条件:
CAN通信线缆,实现节点的互联,是传输数据的通道。主要有:普通双绞线,同轴电缆,光纤。CAN微控制器,嵌有部分或全部CAN控制模块及相关接口的通用型微控制器现如今很多芯片都配备CAN接口。CAN收发器,将绝对电平信号表示的数据帧与差分信号表示的通信帧相互转换。集成CAN外设模块的微控制器接入CAN总线,如图x所示。
figure-can-transiver
图x 微控制器通过CAN收发器接入CAN总线在这块电路中,CAN外设同CAN收发器之间的两根信号线CAN_TX
和CAN_RX
是单方向的位数据流,分别对应发送数据和接收数据,用绝对电平表示数据位;CAN收发器同总线之间的两根信号线CAN_H
和CAN_L
的数据方向是双向的,走的是差分电平信号。用逻辑分析仪可以观察CAN_TX
和CAN_RX
上的数据帧,如图x所示。至于CAN_H
和CAN_L
上的差分信号,可以通过示波器直接观察,或者通常会使用“CAN分析仪”,一种可以抓CAN通信帧的抓包工具,将在后续文章中介绍。
figure-can-tx-line-waveform
图x CAN_TX线上的信号波形## CAN通信帧格式
在CAN总线上,报文是以“帧”来发送的,每一帧都包含以下几个部分:
SOF帧起始:在总线空闲时,总线为隐性状态。帧起始由单个显性位构成,标志着报文的开始,并在总线上起着同步作用。仲裁段:仲裁段定义了报文的标识符,俗称ID。在CAN2.0A规范中,标识符为11位,而在CAN2.0B中扩展到了29位。这意味着在2.0B中可以存在更多不同类型的报文,但是也降低了总线的利用率。仲裁段还包含RTR远程帧/数据帧控制位。DLC控制段:定义了数据域字节的长度。通过数据长度码,接收节点可以判断报文数据是否完整。DATA数据域:包含有0~8个字节数据。实际有效的数据负载。此处仅是基本CAN协议的定义,在CAN FD协议的通信帧中,有效数据负载可以达到64字节,在更高速的CAN XL协议中,定义有效数据负载可达2048字节。CRC域:CRC又称循环冗余码校验(Cyclical Redundancy Check),是数据通信中常见的查错方法。ACK域:用于接收节点的反馈应答。EOF帧结束:由一串7个隐性位组成,表示报文帧的结束。CAN标准帧结构如图x所示。
figure-can-frame-standard
图x CAN标准帧格式CAN2.0B中新增了扩展帧,扩展帧相对于标准帧,ID标识符字段从11位扩展到29位,可以容纳更多的消息种类。如图x所示。
figure-can-frame-ext
图x CAN扩展帧格式注意,扩展帧的29位ID不是连续的,其中前11位同标准帧相同,之后紧跟着SRR和IDE位(均为1),然后才是接下来的18位ID。
开发CAN总线的过程中,主要关注CAN报文ID和数据域。根据客户的要求,ECU接收自己需要的ID报文的同时,也向外发送别的ECU所需要的ID报文。一般不同整车厂在开发自己的CAN协议规范的同时,也会有自己的校验机制,不满足校验规则的报文,数据将被ECU所遗弃。
CAN网络通信
CAN网络将多个CAN节点设备通过总线连接在一起,在通信过程中传递报文消息。通信过程以帧为基本通信单元。总线上节点之间的通信过程大体有节点向总线发送消息,和节点向总线请求消息。
CAN报文帧种类
CAN总线报文传输有4种不同的格式:
数据帧:由发送节点发出,包含0 - 8个数据字节。主要用于本节点向总线主动发送数据。远程帧:发送远程帧向网络节点请求发送某一标识符的数据帧。主要用于本节点向总线发出数据请求,被能够提供数据的节点捕获到后,再通过数据帧把消息发送到总线上。错误帧:总线节点发现错误时,以错误帧的方式通知网络上的其他节点。过载帧:发送过载帧,表示当前节点不能处理后续的报文(如帧延迟等)。Ps:为了保持总线的利用率,在车载CAN总线上数据帧的报文一般均为8字节。
其中关于错误帧监测的错误情况详加说明。CAN总线将错误分为临时性错误和长期性错误。前者主要由外部因素引起,如总线上驱动电压波形不规整、有尖峰或毛刺时,其数据传输性能会受到一定程度的短期干扰。长期性错误则主要由网络组建非正常状况引起,比如接触不良、线路故障、发送器或接收器失效等。CAN中每个具有数据通信能力的网络单元内部都集成有一个发送错误计数器和接收错误计数器,当该单元在数据发送阶段出现一次错误时,其发送错误计数器自加8;在数据接收阶段出现一次错误时,其接收错误计数器自加1。在相应计数器内容非0的情况下,网络单元每成功发送一帧,发送错误计数器自减1;每成功接收一帧,接收错误计数内容原本小于127时自减1,大于127时被置为119 - 127之间任意值。这样,如果某个网络单元的错误计数在不断增长,就说明该单元的数据通信在频繁发生故障。当计数器内容超过一定阈值时,可以认为该故障是由长期性错误引起的。这种机制保证了当某一个节点出现故障的时候,不会造成总线长时间瘫痪。
仲裁机制
仲裁是CAN总线应用中一个重要的概念。在CAN总线采用载波侦听多路访问/冲突检测(CSMA/CD)技术。如果总线空闲(隐性位),那么每一个节点都可以开始发送报文。报文以显性位(报文帧开始位)开始,接着是标识符。如果多个节点同时开始发送报文,那么将使用“线与”仲裁机制(仲裁用逻辑“与”)来解决总线冲突,低电平(显性位)将获得仲裁,从而确定优先级最高的报文,而不需要损失高优先级报文的通信时间或数据(非破坏性仲裁)。仲裁机制使用标识符ID为判断依据,不仅代表报文帧的内容,还代表报文帧发送的优先级。二进制数越小的标识符,优先级越高;反之亦然。
关于报文的标识符ID,这里要强调一个特别有用的知识点。CAN总线仲裁的是报文消息的优先级,而不是节点的优先级(CAN总线上的节点没有优先级)。例如,某个CAN总线节点发送低优先级的报文时,可能被正在进行的高优先级报文通信抢占,但同一个节点发送更高优先级的报文时,就可以获得总线的使用权。报文的优先级,也就是报文的标识符ID,是由消息的表示的内容决定的。这里面体现了一个“公平”合作的系统,合作的开发者人人不分贵贱,只以任务的重要性获取更多的资源,并且多个开发者可以共同做一个任务,一个开发者也可以做多个不同的任务。整个总线上所有节点构成的系统作为整体调度多任务。
总结
本文试图用最简约的描述总结出CAN总线通信协议的要点。CAN总线是一个共享介质的总线结构,因此具备典型的总线型通信方式,例如通信过程建立在总线与节点之间(而不是点对点直连的通信),存在冲突检测和仲裁等。需要注意的是,CAN总线通信的帧结构,包括各个字段的位置以及含义,这些数据位将以位流的方式出现在总线上,后续使用微控制器上的CAN外设模块,也是在芯片内部的缓冲区按照这些字段组织好数据,交由外设收发引擎将位流转变成电平信号接入总线。
关于CAN总线协议,仍有很多细节尚未在本文中记录,例如CAN总线为了确保电平信号是“中和”的,会将超过连续5个相同的位流电平信号翻转,或是更详细的错误检测判定机制,这些电路系统中的设计,通常已经固化在常规的集成电路中了,对于开发者来说,不需要直接操作。但如果仍有兴趣继续探究,可以参见标准化文档ISO11989和ISO11519,通读协议有注意读者了解CAN总线通信的全貌,便于理解设定一些规则的来由,对于调试环节也大有裨益。
标签: