如何检查CAN总线是否空闲


8

我读了很多有关CAN总线仲裁的文章,但没有回答我的问题。

如果一个节点已经在总线上传输数据,并且在另一个节点之间要启动数据传输,那么“另一个节点”将如何知道总线繁忙?

所有文档(我阅读的文档)都以两个节点同时开始传输为条件,然后一个具有第一个显性位的节点将获得总线,但是没有人解释我想知道的条件。


1
Swanand,如果您等待更长的时间来接受答案,可能会得到更好的答案。这是一个国际社会,某些专家可能无法立即做出回应。
W5VO 2011年

@ W5VO我下次会记得的!感谢您的建议!:)
Swanand 2011年

Answers:


10

简短的答案是,节点在尝试传输之前必须监​​视CAN线空闲一段时间。因此,如果另一个节点正在传输,则它必须保持安静,直到另一个节点完成。

CAN总线基于差分信号。当总线空闲时,CAN-High(CAN +)和CAN-Low(CAN-)这两条线都处于相同的电位。为了发送位,CAN发送器在大约2伏的线路上施加差分电压。

CAN发送器首先查看总线是否空闲,如果空闲,则开始发送。仲裁的工作方式是发射机在总线传输期间监视总线。如上所述,通过将两条线路保持在相同电位或不同电位来完成传输。因此,如果发送器通过将线路保持在相同的电势(sic)来发送比特,但是发现两条发送线具有差分电势,则意味着其他某个节点正在发送,并且第一个发送器已失去仲裁。然后必须停止传输。

当一个节点第一次开始发送时,发送的位是相同的,直到发送节点的地址明显不同为止。如果两个节点开始一起传输,则它们将同步传输直到到达地址部分。当地址不同时,即使节点不在线路上,节点也会注意到线路上的电位差。然后,它知道丢失了,必须重试。获胜的节点继续传输,而又不知道其他节点也在尝试。当然,该逻辑也扩展到两个以上的节点。

我希望这有帮助。


1
好答案!如果我没记错的话,发送“ 0”胜过“ 1”,这将导致最低的地址获胜仲裁。它的一个很好的功能是,如果丢失的节点在应该停止的时候停止,则总线上不会有数据损坏。
W5VO 2011年

好答案!如果您能解决这个问题,将不胜感激:假设当到达第三位时,标识符为“ 1011001”和“ 1000110”;第一个发送器发送“ 1”,第二个发送器发送“ 0”;因此根据CAN协议,显性位为0,并覆盖隐性位。因此,现在总线保持“ 0”;第一个模块检测到这一点并停止发送,而第二个模块继续发送。我的理解正确吗?
Febin Sunny

@FebinSunny是的...您说的是正确的!
斯旺德

1
这个答案既不是“好”,也不是“伟大”。实际上,这是完全错误的。首先,发送器不会 “将两条线保持在相同的电位”来发送隐性位。它只是简单地停止拉线,终端电阻使电位相等。其次,尽管某些基于CAN的更高级别的协议确实将其用作消息ID的一部分,但发送节点的地址不是 CAN规范中仲裁字段的一部分。第三,这都不与检测空闲总线有关
Maple

7

我知道两种解决方法:

首先,CAN控制器将始终监视总线。当它在总线上检测到一条消息时,便开始接收过程。现在它处于接收状态,当请求发送时,它知道总线正在使用。

其次,通过位填充,CAN收发器将在超过五个周期内不具有同一位(除非检测到总线错误,在这种情况下,您将连续看到多达12个主要位)。例外情况是,总线上没有任何内容传输时,总是读取一个被动位。刚启动的控制器可以在声明“可能空闲”之前侦听总线五个周期。

我不保证这些是实际的过程,但是基于我(对CAN的有限知识),这些方法会起作用。


我喜欢第二把戏!那是纯粹的逻辑和真棒!
斯旺德2011年

2
您错过了总线仲裁的要点-CAN数据包中的第一件事就是地址。
W5VO 2011年

1
那不是他真正的问题。问题是控制器如何确定总线上是否有活动
CoderTao 2014年

@ W5VO CAN帧没有地址,除非某些高级协议使其成为消息ID的一部分。
Maple

@CoderTao,虽然位填充不是控制器检测空闲总线的方式,但您正确的是,它在此过程中起着重要作用,通过确保传输的数据不会被误认为帧末
Maple

3

正如CoderTao所说的那样-CAN控制器一直在监视总线,因此它知道何时正在进行传输。因此,唯一可能发生冲突的时间是两个节点都开始“同时”传输-在彼此的一个位时间内(加上少量的总线传播额外时间)。因此,这些是您在文档中发现的唯一情况:)


2

节点地址确定优先级,低地址为高优先级。传输从节点广播其地址开始。在传输的同时,它也在监听。假设节点3和2同时传输。作为地址的最后一位,节点3广播1,而节点2广播0。由于0,数据线下拉至0状态。节点3看到的是广播而不是1,而是0。

CAN首先用于汽车和卡车。一些传感器需要比其他传感器具有更高的优先级。例如,防滑制动需要比低挡风玻璃清洗液具有更高的优先级。


我已经知道了...。我的问题与开始时的仲裁无关....只是在传输之间....
Swanand 2011年

1

CAN规范中有四个关键要素,这些要素允许CAN控制器检测空闲总线状态:

  • 有线与信令使得节点之一传输的显性位被同时传输隐性位的所有其他节点检测到成为可能。因此,如果任何传输隐性位的节点都看到了总线的主导状态,则它知道总线处于繁忙状态

  • 位填充确保不超过5个相同的连续位。就其本身而言,位填充用于维持同步。但是,它的副作用是,直到CRC分隔符的帧位中最多可以出现5个连续的隐性位。

  • 结束是帧末尾的一系列7个隐性位。它们没有填充,因此可以很容易地被控制器检测到。请注意,由于EOF被视为帧的一部分,因此总线在此期间尚未处于空闲状态

  • 帧间空间是帧之间的一系列3个隐性中断位,其后是总线空闲状态。除非节点想要发送错误过载帧,否则不允许在间歇期间发起传输。此外,发送最后一帧的节点还必须在中断后发送8个隐性暂挂传输位,然后再发起另一次传输。最后一个要求允许其他节点开始发送挂起的消息,因此没有节点可以无限期地“占用总线”。

综上所述,这是节点如何检测空闲总线状态的方法:

  • 接收节点 只需等待10个连续的隐性位,包括EOF和间断。在那之后,他们认为总线空闲,可以尝试开始自己的传输。

  • 发送节点在 发送最后一个帧的EOF之后发送11个连续的隐性位。如果在此期间没有其他节点启动传输,则认为总线空闲,可以尝试开始另一次传输。如果在此期间检测到显性位,则该节点将成为接收器。

以上信息以及有关位时序的其他信息可以在BOSCH开发的CAN规范中找到。


总线上有多个活动节点。没有通信时,将插入一个新节点。这个新节点如何知道总线空闲?当该新节点不在图中时,将发送10个连续的隐性位。
斯旺德

“有线与信号传输”表示隐性位不会像这样“传输”,这意味着传输节点不会主动生成主导电位。但是它们是被接收的,即接收节点以位间隔对总线进行采样,并且它们在线路上看到隐性位。因此,如果这个新节点对总线进行了10次采样,并且每次认为总线空闲时都会看到隐性位。

在“此新节点不在图像中时发送的10个连续隐性位”与之后的总线空闲状态之间没有区别。如果没有通信,则总线的任何读数都将返回隐性位(“ 1”)。因此,无论何时开始采样,最后一个显性位期间或之后,都没有关系。只要接收方看到10位,就可以开始发送。顺便说一句,没有人发送10位。最后一个发送器“发送” 11个隐性位,3个间歇+ 8个暂停。如果等待节点10日后开始发送的最后发射仲裁失败,并产生总线到新节点

0

特定节点仅在INTERMISSION周期后才开始传输(此持续时间也称为SUSPENDED持续时间,在此周期中,在将DATA / REMOTE帧传输到总线之后,向总线传输了3个隐性位。这表明BUS是处于“空闲”状态),因为在此期间,没有节点发起传输。总线处于空闲状态后,想要总线进行传输的节点进入仲裁。

在将帧间空间传输到总线后,CAN网络中存在的节点将尝试启动传输。因此,特定节点知道总线是否繁忙。


如果这将是总线上的第一个传输,该怎么办?在这种情况下,将没有任何“间歇时间”。有关详细信息,请参阅@Doc的答案。
斯旺德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.