本文将介绍CAN总线通信协议的基础知识,目前的内容仅为通用的协议部分,暂不涉及具体的外设模块的用法。研究通信协议的具体内容,主要是看建立通信的物理环境(信号与总线拓扑结构),通信过程的对象(通信帧),以及交互过程(通信或握手过程)。
在后续的文章中,将以实现本文描述的协议作为需求,结合具体的IP外设,以及配套的软件,基于具体的硬件电路实现功能。
CAN总线有两个ISO国际标准:ISO11898 和 ISO11519。其中:
Tips: 总线的传输速率,又称为总线的通信速率,指的是位速率,或称为比特率(和波特率不是一回事),表示单位时间内,通信线路上传输的二进制位的数量,其基本单位是 bps 或者 b/s (bit per second)。波特率强调的是传送数据的同步载波信号的速率。
在汽车中为了满足车载系统的不同要求,主要采用高速CAN和低速CAN。这两者以不同的总线速率工作以获得最佳的性价比,在两条总线之间采用CAN网关进行连接。
figure-can-network-in-car
图x 整车CAN网络示意图CAN总线是一种串行数据通讯协议,其中包含了CAN协议的物理层以及数据链路层。可以完成对数据的位填充,数据块编码,循环冗余效验,帧优先级的判别等工作。其主要特点如下:
CAN总线采用双线差分传输,两根导线分别作为CAN_H、CAN_L,并在终端配备有120Ω的电阻。CAN收发器收到总线信号时,将信号电平转化为逻辑状态,即CAN_H与CAN_L电平相减后,得到一个差分电平。各种干扰(如点火系统)在两根导线上的作用相同,相减后得到的插值电平可以滤过这些干扰(共模抑制)。
figure-can-bus-connection
图x CAN总线连接CAN总线有两种逻辑电平状态,即显性与隐性。显性电平代表“0”,隐性电平代表“1”。采用非归零码编码,即在两个相同电平之间并不强制插入一个零状态电平。
figure-can-voltage-high-speed
图x 高速CAN总线上的信号电平
figure-can-voltage-low-speed
图x 低速CAN总线上的信号电平为了确保通讯的正确性,总线信号必须在一定时间内出现在总线上,并且保证被正确采样。总线信号传输有一定的时间延迟,最大的可靠的总线波特率与总线长度有关。ISO11898中对各种总线长度有着以下定义:
接入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总线上,报文是以“帧”来发送的,每一帧都包含以下几个部分:
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总线报文传输有4种不同的格式:
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总线通信的全貌,便于理解设定一些规则的来由,对于调试环节也大有裨益。
全部0条评论
快来发表一下你的评论吧 !