Can线通讯
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986 年德国电气商博世公司开发出面向汽车的CAN 通信协议。此后,CAN 通过ISO11898 及ISO11519 进行了标准化,在欧洲已是汽车网络的标准协议。
CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
CAN线的物理特性
CAN总线标准只规定了物理层和数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。

CAN收发器负责逻辑电平和物理信号之间的转换


Can线是通过两根线进行信息传递的,一个can高,一根can低。这两根线是差分信号进行传递信息的,这里的差分信号是指:差分信号是用一个数值来表示两个物理量之间的差异。差分信号又称差模信号,是相对共模信号而言的。
我们用一个方法对差分信号做一下比喻,差分信号就好比是跷跷板上的两个人,当一个人被跷上去的时候,另一个人被跷下来了 - 但是他们的平均位置是不变的。继续跷跷板的类推,正值可以表示左边的人比右边的人高,而负值表示右边的人比左边的人高。0 表示两个人都是同一水平。图1 用跷跷板表示的差分信号 应用到电学上,这两个跷跷板用一对标识为V+和V-的导线来表示。
简而言之我们的车辆上的can线信号是静态电压2.5V,动态电压一个高于2.5V,一个低于2.5V,我们的电压信号进入can收发器进行转换,然后进入CAN控制器,最后进入cpu进行计算。
与I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步通讯,只具有CAN_High和CAN_Low两条信 号线,共同构成一组差分信号线,以差分信号的形式进行通讯。(没有时钟)
CAN物理层的形式主要分为闭环总线及开环总线网络两种,一个适合于高速通讯,一个适合于远距离通讯。
闭环总线网络
CAN闭环通讯网络是一种遵循ISO11898标准的高速、短距离网络,它的总线最大长度为40m,通信速度最高为1Mbps,总线的两端各要求有一个“120欧”的电阻。

开环总线网络
CAN开环总线网络是遵循ISO11519-2标准的低速、远距离网络,它的最大传输距离为1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个“2.2千欧”的电阻。

下面是can线连接图:

CAN 物理特性还有很多,这里不给大家详细介绍了,物理层了解过后就要了解我们的can协议了,也就有我们的can数据链路层,这里我说一下我对can线的理解,can线是连接各个模块之间的通讯信息的传递,发动机控制模块和车身控制模块进行信息传递,就好比北京到上海我们通过铁路过去,铁路相当于can线,写的信或快递相当于信号,城市相当于各个模块。我们把快递运到不同的模块,通过收发器接收信号,是这个地方的就留下,然后进行整理分类,发送给相对应的人。
Can协议
Can协议是针对can线通讯进行的规定,就好比我们去某个地方,交通方式可以不同,但同一地点的风俗是一样的,所有can协议基本是一致的。以下借鉴内容可以了解以下
CAN 总线是一个广播类型的总线,所以任何在总线上的节点都可以监听总线上传输的数据。也就是说总线上的传输不是点到点的,而是一点对多点的传输,这里多点的意思是总线上所有的节点。但是总线上的节点如何知道那些数据是传送给自己的呢?CAN总线的硬件芯片提供了一种叫做本地过滤的功能,通过这种本地过滤的功能可以过滤掉一些和自己无关的数据,而保留一些和自己有关的信息。
1.
CAN消息机制
2.
CAN标准定义了四种消息类型,每条消息用一种叫做比特位仲裁(Arbitration)机制来控制进入CAN总线,并且每条消息都标记了优先权。另外CAN标准还定义了一系列的错误处理机制。
CAN报文的四种消息类型:
·数据帧:数据帧将数据从发送器传输到接收器。
·远程帧:总线单元发出远程帧,请求发送具有同一标识符的数据帧。
·错误帧:任何单元检测到总线错误就发出错误帧。
·过载帧:过载帧用在相邻数据帧或远程帧之间的提供附加的延时。
1.
数据帧
2.
下图为基本的格式:

CAN总线中有标准帧和扩展帧两种格式,两种格式不同的地方在于仲裁域格式的不同,看下面两个表格可以很清楚的看出两者的不同,下面第一个表是标准帧(CAN2.0 A),第二个为扩展帧(CAN2.0 B):

下面为扩展帧格式(CAN2.0B):

其中
·SOF为帧开始
·SRR为"替代远程请求位
·IDE为扩展标识符位
·RTR为远程传输请求位
·CRC delimiter 为CRC定界符。
·ACK delimiter 为应答定界符.
我们看到上图中的基本帧格式可以总结为以下几个域:
域 | 描述 |
仲裁域 | 仲裁域决定了当总线上两个或是多个节点争夺总线时的优先权。 |
数据域 | 包含了0到8字节的数据。 |
CRC域 | 包含了15位的校验和,校验和用来做错误检测。 |
应答槽 | 任何一个已经正确接收到消息的控制器在每一条消息的末端发送一个应答位,发送器检查消息是否存在应答位,如果没有就重发消息。 |
1.
远程帧
2.
作为数据接收器的站,通过发送远程帧,可以启动其资源节点传送它们各自的数据。远程帧和数据帧非常类似,只是远程帧没有数据域。

上图就是远程帧的帧格式,它相对与数据帧没有远程帧,但是要注意发送远程帧的时候RTR位要置1,表示发送的是远程帧。下图更加清晰了呈现了这种结构。


1.
错误帧
2.
错误帧是当总线的某一个节点检测到错误后发送出来的,它会引起所有节点检测到一个错误,所以当有任何一个节点检测到错误,总线上的其他节点也会发出错误帧。CAN总线设计了一套详尽的错误计数机制来确保不会由于任何一个节点反复的发送错误帧而导致CAN总线的崩溃。

如上图所示错误标志和错误定界符组成,高低代表分别代表隐性和显性,其中错误标志为所有节点发过来的错误标志的叠加(Superposition)。下图更为清楚的看出各个数据位的分布:


下面通过以下数据结构框图概括各个部分的定义:

错误标志有两种形式:
·主动错误标志,它由6个连续的显性位0组成,它是节点主动发送的错误标志。
·
被动错误标志,它由6个连续的隐性位1组成,除非被其他节点的显性位覆盖。
·
·
刚才说到一个节点上检测到错误会导致总线上所有的节点都会检测到错误并发送错误标志,这是为什么呢?
·
因为单一节点上的错误标志格式违背了从帧起始到CRC界定符的位填充规则,也破坏了ACK域或帧结尾的固定格式。下面简要说下位填充规则。
·
位填充规则:发送器只要检测到位流里有5个连续相同值的位,便自动在位流里插入补充位。
·
注意:位填充规则只是针对数据帧和远程帧,错误帧和过载帧格式固定。
·
所以所有其他的节点会检测到错误条件并且开始发送错误标志,因此错误帧就是各个站的不同错误标志叠加在一起的结果。
·
当某个节点发送错误帧(带有错误标志),其他节点收到了错误帧,检测到错误条件,就通过发送"被动错误标志"的错误帧来提示错误。
错误定界符:
传送了错误标志以后,每一个站就发送一个隐性位,并一直监视总线直到检测出一个隐性位为止,然后就开始发送其余7个隐性位。
1.
过载帧
2.
过载帧是接收节点用来向发送节点告知自身接收能力的帧。
过载帧,意思就是某个接收节点来不及处理数据了,希望其他节点慢点发送数据帧或者远程帧,所以告诉发送节点,我已经没有能力处理你发送过来的数据了。
过载帧跟错误帧结构类似包括过载标志和过载定界符,有3中情况会引起过载:
·接收器内部的原因,它需要延迟下一个数据帧或是远程帧。
·在间歇字段(看下面的帧间空间)的第一位和第二位检测到一个显性位(间歇字段都是隐性位的)
·如果CAN节点在错误界定符或是过载界定符的第八位(最后一位)采样到一个显性位逻辑0,节点会发送一个过载帧,错误计数器不会增加。


上图中很清晰的表示了过载标志有6个显性位组成,而叠加部分和"主动错误"标志一样,过载的标志破坏的是间歇域的固定格式。所以导致其他的节点都检测到过载条件,并一同发出过载标志。
过载定界符:
也就是上图的过载结束符,过载标志被传送以后,节点就一直监听着总线,直到检测到有一个从显性位到隐性位的跳变为止。当从总线上检测到这样的跳变,则就标志着每一个节点都完成了各自过载标志的发送,并开始同时发送其余7个隐性位。
1.
帧间空间(Interframe Space)
2.
帧间空间说白了就是帧与帧之间的间隔,但是这种间隔在CAN的帧中只存在于数据帧和远程帧,其他的帧就不一定是帧间空间隔开的,而是其他形式,或是直接是没有间隔,例如过载帧和错误帧之间就没帧间空间。过个过载帧之间有间隔但是不是有帧间空间隔开的。
这里所说的针间空间包括"间歇"、"总线空闲"的位域。如果是发送前一报文的"被动错误"的站,则还包括叫做"挂起传输"的位域。
若不是"被动错误"的站,或作为前一报文的接收器的站,帧间空间格式为下图:


若是"被动错误"的站,如果想要发送8个隐性电平,在发送其他帧,帧间空间格式为下图,即包括了挂起传输,

可以看到
1.间歇字段有3个隐性位。
特别的在间歇期间,所有的节点都不允许传送数据帧和远程帧,唯一看做的是标示一个过载条件。
1.总线空闲:
只要总线空闲,任何节点就可以往总线发送数据,并且是开始于间歇之后的第一个位。一旦总线上检测到显性位即逻辑"0",可以认为是帧的开始。
1.挂起传输
"被动错误"的节点发送报文之后,在下一个报文开始传送之前或是确认总线空闲之前发出8个隐性位跟随在间歇的后面。如果这个时候有一个报文从其他的节点发过来,则这个节点就成为了接收器。
1.
错误处理机制
2.
1.
错误侦测
2.
下标是几个错误类型:
错误类型 | 出错条件 | 出错域 | 帧测单元 |
比特错误 bit error | 发送的位值与所监控的位值不相符合(填充比特和ACK比特除外) | 数据帧(SOF~EOF) 远程帧(SOF~EOF) 错误帧 过载帧 | 发送单元 接收单元 |
填充错误stuff error | 监测到6个连续相同的电平 | 数据帧(SOF~CRC) 远程帧(SOF~CRC) | 发送单元 接收单元 |
CRC 错误 | 计算结果和接收到的CRC不同 | 数据帧(CRC) 远程帧(CRC) | 接收单元 |
格式错误 Form Error | 某个固定的格式位置出现无效的比特 | 数据帧: (CRC Delimiter, ACK Delimiter EOF) 远程帧: (CRC Delimiter,ACK Delimiter) 错误帧: (Error Frame Delimiter) 过载帧: (Overload Delimiter) | 接收单元 |
应答错误 Acknowledgment | 发送端在应答间隙所监视的位不为显性,即逻辑0,发送器就检测到一个应答错误。 | 数据帧(ACK slot) 远程帧(ACK slot) | 发送单元 |
1.
错误计数
2.
下面是错误计数表:
错误条件 | Transmit Error Counter | Receive Error Counter | |
1 | RECEIVER端侦测到一个位Error错误,除了发送ACTIVE ERROR FLAG 和OVERLOAD FLAG | - | +1 |
2 | TRANSMITIER 发送ERROR FLAG | +8 | |
3 | TRANSMITTER发送ACTIVE ERROR FLAG OVERFLAG时侦测到BIT ERROR | +8 | |
4 | 当RECEIVER发送ACTIVE ERROR FLAG或OVERFLAG时侦测到BIT ERROR | +8 | |
5 | 一个帧被成功发送之后(取得ACK并且知道END OF FRAME完成都没有错误) | -1 IF TEC=0,TEC will not be changed | - |
6 | 一个帧被成功接收(知道ACK域都没有检测到错误,并成功发送ACK比特) | - | 1. if 1 <= REC <= 127="" -=""> REC-1 2. if REC = 0 -> REC = 0 3. if REC > 127 -> REC = a value Between 119 to 127 |
7 | 在总线上检测到128此连续的11个1,"bus off"的节点允许变成不再是"bus off" | Cleared to TEC = 0 | Cleared to REC = 0 |
1.
错误抑制

一个节点挂到CAN总线上之后,处于ACTIVE状态;TEC>127或者REC>127导致节点进入passive状态;TEC>255之后节点处于bus off状态,就是不允许再往bus上发送东西了;处于bus off状态的节点,在检测到128个连续的11个1之后将回到active状态。
885

被折叠的 条评论
为什么被折叠?



