我读了很多有关CAN总线仲裁的文章,但没有回答我的问题。
如果一个节点已经在总线上传输数据,并且在另一个节点之间要启动数据传输,那么“另一个节点”将如何知道总线繁忙?
所有文档(我阅读的文档)都以两个节点同时开始传输为条件,然后一个具有第一个显性位的节点将获得总线,但是没有人解释我想知道的条件。
我读了很多有关CAN总线仲裁的文章,但没有回答我的问题。
如果一个节点已经在总线上传输数据,并且在另一个节点之间要启动数据传输,那么“另一个节点”将如何知道总线繁忙?
所有文档(我阅读的文档)都以两个节点同时开始传输为条件,然后一个具有第一个显性位的节点将获得总线,但是没有人解释我想知道的条件。
Answers:
简短的答案是,节点在尝试传输之前必须监视CAN线空闲一段时间。因此,如果另一个节点正在传输,则它必须保持安静,直到另一个节点完成。
CAN总线基于差分信号。当总线空闲时,CAN-High(CAN +)和CAN-Low(CAN-)这两条线都处于相同的电位。为了发送位,CAN发送器在大约2伏的线路上施加差分电压。
CAN发送器首先查看总线是否空闲,如果空闲,则开始发送。仲裁的工作方式是发射机在总线传输期间监视总线。如上所述,通过将两条线路保持在相同电位或不同电位来完成传输。因此,如果发送器通过将线路保持在相同的电势(sic)来发送比特,但是发现两条发送线具有差分电势,则意味着其他某个节点正在发送,并且第一个发送器已失去仲裁。然后必须停止传输。
当一个节点第一次开始发送时,发送的位是相同的,直到发送节点的地址明显不同为止。如果两个节点开始一起传输,则它们将同步传输直到到达地址部分。当地址不同时,即使节点不在线路上,节点也会注意到线路上的电位差。然后,它知道丢失了,必须重试。获胜的节点继续传输,而又不知道其他节点也在尝试。当然,该逻辑也扩展到两个以上的节点。
我希望这有帮助。
我知道两种解决方法:
首先,CAN控制器将始终监视总线。当它在总线上检测到一条消息时,便开始接收过程。现在它处于接收状态,当请求发送时,它知道总线正在使用。
其次,通过位填充,CAN收发器将在超过五个周期内不具有同一位(除非检测到总线错误,在这种情况下,您将连续看到多达12个主要位)。例外情况是,总线上没有任何内容传输时,总是读取一个被动位。刚启动的控制器可以在声明“可能空闲”之前侦听总线五个周期。
我不保证这些是实际的过程,但是基于我(对CAN的有限知识),这些方法会起作用。
节点地址确定优先级,低地址为高优先级。传输从节点广播其地址开始。在传输的同时,它也在监听。假设节点3和2同时传输。作为地址的最后一位,节点3广播1,而节点2广播0。由于0,数据线下拉至0状态。节点3看到的是广播而不是1,而是0。
CAN首先用于汽车和卡车。一些传感器需要比其他传感器具有更高的优先级。例如,防滑制动需要比低挡风玻璃清洗液具有更高的优先级。
CAN规范中有四个关键要素,这些要素允许CAN控制器检测空闲总线状态:
有线与信令使得节点之一传输的显性位被同时传输隐性位的所有其他节点检测到成为可能。因此,如果任何传输隐性位的节点都看到了总线的主导状态,则它知道总线处于繁忙状态。
位填充确保不超过5个相同的连续位。就其本身而言,位填充用于维持同步。但是,它的副作用是,直到CRC分隔符的帧位中最多可以出现5个连续的隐性位。
帧结束是帧末尾的一系列7个隐性位。它们没有填充,因此可以很容易地被控制器检测到。请注意,由于EOF被视为帧的一部分,因此总线在此期间尚未处于空闲状态。
帧间空间是帧之间的一系列3个隐性中断位,其后是总线空闲状态。除非节点想要发送错误或过载帧,否则不允许在间歇期间发起传输。此外,发送最后一帧的节点还必须在中断后发送8个隐性暂挂传输位,然后再发起另一次传输。最后一个要求允许其他节点开始发送挂起的消息,因此没有节点可以无限期地“占用总线”。
综上所述,这是节点如何检测空闲总线状态的方法:
接收节点 只需等待10个连续的隐性位,包括EOF和间断。在那之后,他们认为总线空闲,可以尝试开始自己的传输。
发送节点在 发送最后一个帧的EOF之后发送11个连续的隐性位。如果在此期间没有其他节点启动传输,则认为总线空闲,可以尝试开始另一次传输。如果在此期间检测到显性位,则该节点将成为接收器。
以上信息以及有关位时序的其他信息可以在BOSCH开发的CAN规范中找到。
特定节点仅在INTERMISSION周期后才开始传输(此持续时间也称为SUSPENDED持续时间,在此周期中,在将DATA / REMOTE帧传输到总线之后,向总线传输了3个隐性位。这表明BUS是处于“空闲”状态),因为在此期间,没有节点发起传输。总线处于空闲状态后,想要总线进行传输的节点进入仲裁。
在将帧间空间传输到总线后,CAN网络中存在的节点将尝试启动传输。因此,特定节点知道总线是否繁忙。