初学CAN总线时,对于CAN总线中的隐性为逻辑“1”,显性为逻辑“0”的疑惑一直令人困扰。在工控应用中,我们通常将有电压信号称为逻辑“1”,没有电压信号称为逻辑“0”,这与CAN总线的定义看起来不太一致。下面对这个问题进行详细解答。
CAN总线采用双绞线结构,利用差分传输方式进行数据传输,也称为差分传输。通过双绞线的电压差来实现数据传输,有效抑制共模干扰。然而,这也带来了一个问题,即在没有数据传输时,两根线的电压相同,形成隐性信号,逻辑信号为1。一旦有数据传输发生,电压差异出现,此时CAN总线表现为显性信号,逻辑信号为0。
那么为什么隐性为逻辑1,显性为逻辑0呢?
首先,我们可以暂时忘记逻辑1和0的定义,只需理解隐性电平表示无数据传输,显性信号表示有数据传输。
考虑CAN总线上存在多个节点,每个节点通过收发器与总线相连。每个节点都能主动发送报文。在同一时刻,如果多个节点同时发送报文,可能会发生数据干扰。为了解决这个问题,我们来看一个单个CAN节点的收发器信号示意图:
在这个示意图中,单个节点输出隐性电平时,开关断开,由于存在上拉电阻,输出电平为高。输出显性电平时,开关闭合,输出对地短路变成低电平。当多个节点存在时,某个节点的开关闭合(输出显性电平)将总线电平拉低,即使其他节点断开,总线电平仍然保持低电平。因为所有节点都是并联的,只要一个或多个节点的开关闭合,总线就会输出低电平。这种逻辑与逻辑“与”相同,也就是“线与”。因此,当多个节点发送报文时,隐性电平会被显性电平覆盖,此时不管谁是1谁是0,显性&隐性=显性。
因此,我们可以将1定义为显性,0定义为隐性。
接下来,我们再来看第二个概念:仲裁段。
每个节点通过数据帧的形式发送报文,每个数据帧都有一个标识符(ID),表示其优先级。当多个节点同时发送数据帧时,优先级较高的数据帧先发送,低优先级的数据帧等待空闲后发送。规定优先级数值越小,优先级越高。此时,先发送数据的节点使总线电平信号为显性。因此,我们称0为显性,1为隐性。
在逻辑世界中,1和0代表两个相反的概念,并不代表实际电压。因此,“1”和“0”是逻辑关系的两种可能取值,不表示具体电压的理解才是正确的。