仅比较物理层时,CAN 和 RS-485 的相似之处在于它们都使用差分信号。这使它们都具有良好的共模噪声抗扰度。
主要区别在于 RS-485 使用对称信号。一条线是 5 V,另一条线是 0 V,表示一个状态,然后翻转到 0 V 和 5 V,表示另一种状态。这使得检测状态变得非常容易(一个简单的比较器,可能有一点滞后),但在终止总线时提出了挑战。
如果您认为携带信号的双绞线具有 120 Ω 的特性阻抗,那么理想情况下您希望在两条线之间放置 120 Ω。两条线之间的总电阻为 60 Ω。(5 V)/(60 Ω) = 83 mA。这对公共汽车来说是很大的电流,并且会一直被消耗。这相当于近半瓦的静态功率。请注意,每个 120 Ω 的终端电阻器会消耗 208 mW,这意味着它们必须至少是“¼ W”电阻器。例如,0805 表面贴装无需应用。
可能由于这些考虑,对 RS-485 的端接要求有所放宽。这会导致可用总线速度降低。这对于大多数 RS-485 应用程序来说是可以的,因为它们通常以常见的波特率运行,很少超过 115.2 kBaud。
另一方面,CAN 可以正确解决终端问题。它假设 120 Ω 双绞线用于不同的信号,并在总线的每一端指定 120 Ω 终端电阻。然后有两个重要的区别可以避免上述问题:
- 静止状态是未驱动的,这意味着线路通过终端电阻保持在相同的电压。
- 活动总线状态(在 CAN 规范中称为显性状态)是每条线路仅从空闲电平拉出 900 mV。因此,这两种状态是 0 V 或 1.8 V 差分,而不是像 RS-485 那样的 5 V 和 -5 V。
将 CAN 总线保持在显性状态的功率仅为 54 mW,而根本不需要将其保持在隐性(空闲)状态。CAN 旨在实现高达 1 Mbaud 的速度,这可以通过比 RS-485 更好的端接来实现。
已经提到的 CAN 和 RS-485 之间的另一个主要区别是 RS-485 被主动驱动到两种状态,而 CAN 只被驱动到显性状态,总线本身放松到隐性状态。这在更高的协议级别上对总线仲裁产生了重大影响。
那么用什么呢?在大多数情况下,CAN 是新设计的明确选择,因为:
- 低级信令允许碰撞检测方案。当一个节点正在向总线“写入”隐性状态并看到它实际上处于显性状态时,它就知道某个其他节点正在驱动总线。试图写入隐性状态的节点退出并等待消息结束。写入主导状态的节点永远不会知道这发生了。它的消息被所有其他节点正常发送和接收。
- 这种冲突检测能力允许对等网络架构无需任何中央仲裁。节点只是发送消息,但在检测到冲突时退出,然后在当前数据包完成后重试。最终,那些其他消息被发送,总线可用,并且先前冲突的消息被发送而不会发生冲突。
- CAN 指定的不仅仅是物理层,而这就是您使用 RS-485 所获得的全部内容。RS-485 中没有标准方法来决定谁来发送、发送什么、如何知道它完好无损地到达那里等。CAN 指定总线上的完整数据包,其中包括 16 位 CRC 校验和。
- 由于物理之上的几个协议层是用 CAN 指定的,因此实现它们的逻辑可以内置到现成的硬件中。您可以找到具有发送和接收整个 CAN 数据包的硬件的小型且便宜的微型计算机。该硬件自动处理数据包开始/结束检测、冲突检测、回退、重试、校验和生成和验证,以及一些与处理硬件故障相关的功能。
相比之下,使用 RS-485,您可以获得 UART,剩下的就是您的问题了。虽然在 RS-485 之上实现一个健壮的协议当然是可能的,但要正确处理所有极端情况并不像天真的工程师想象的那么容易。
对于某些应用程序可能需要解决的 CAN 限制之一是每个数据包 8 个数据字节的限制。这对于冲突/重试机制也是一件好事,但如果您打算通过 CAN 传递流数据,则必须考虑这一点。然而,对 RS-485 做同样的事情也并不像乍看起来那么简单。