将信息从一个系统发送到另一个系统的一般协议是什么?例如,假设我们在一段时间内从微控制器收集了一些信息,我们希望将这些信息发送到另一个微控制器。我听说过 SPI 和 I2C 接口,但我不清楚您何时使用一种方法而不是另一种方法以及如何实现它。除了 SPI 和 I2C 之外,还有其他常见的方法吗?不同微控制器的实现过程是否相似?它基本上是在解析我在接收微控制器上所做的数据字节吗?
从一个系统到另一个系统的数据传输的通用协议?
没有一种发送数据的方式,根据距离、数据速率、环境、应用程序的不同,有许多不同的通信方式......
最低层是物理层,它实际上是在移动位。
SPI 和 I²C 用于设备内部的短距离,其中没有太多可能干扰传输的噪声。
对于在长达几十米的距离上不太快的通信,通过 RS-232 进行串行通信是一个不错的选择。
如果存在更多噪声或使用更长距离的差分信号,例如在 RS-485 中。为了更快的数据传输,有以太网,它变得越来越流行。
然后还有各种无线标准。
在物理层之上,还有更多层来组织数据的发送方式,用于检测和纠正传输中的错误、网络中的路由以及许多其他事情。例如,互联网协议是一个相当复杂的多层堆栈,通常位于以太网协议之上。
SPI 和 I2C 有点相似,因为它们实际上更多地用于将外围设备连接到控制器或 cpu,而不是在系统之间实际传输数据。USB 是另一种人们似乎希望将其视为通信系统的接口,它实际上是一种外围连接总线。
系统之间的通信并不完全像将设备连接到总线。总线连接允许处理器直接敲击设备中的寄存器,而通信接口允许您发送/接收数据流。连接在总线上的设备通常需要设备驱动程序,而对于通信,就主机而言,另一端连接什么实际上并不重要。
当然,这一直是一个模糊的界限。PCI 和 ISA 之类的东西无疑是总线。I2C、SPI、USB 可以说是总线;而 RS232、RS485 和以太网绝对是通信接口。但是还有像 CAN 总线和 1553 之类的东西,它们肯定是关于移动数据的,但是以一种非常复杂的方式。
确实没有“通用”协议,您最终使用的协议在很大程度上取决于应用程序。为了让我们给您一个更好的答案,我们需要更好地了解您的要求。您提到您希望单独的微控制器作为子系统相互通信。
关于这个应用程序的一些问题:
- 这个项目会不会有2个以上的微控制器?
- 您的速度和吞吐量要求是什么?信息需要多快到达那里?您发送/接收数据的频率是多少?
如果您对问题 1 的回答为“否”:
如果这个项目中只有 2 个微控制器,你绝对可以在它们之间使用 UART。如果他们都需要发起通信,请使用流量控制,否则在一个方向发送数据应该是微不足道的。在大多数情况下,它应该“足够快”,因为您选择了较高的波特率之一。I2C 和 SPI 通常只适用于主/从架构。
如果您对问题 1 回答“是”(超过 2 个控制器):
- 如果您的项目中有超过 2 个微控制器,哪一个发起通信?会不会只有一个主控制器(即主从架构)?或者任何子系统都可以随时说话?
- 是否需要任何子系统相互通信?eg:对于设备A、B和C:A可以发送给B和C,B可以同时发送给A和C等。
所以现在你需要一些更具可扩展性的东西,你可以将可寻址设备放到公共总线上。这些后续问题的答案将帮助您在 I2C 和 SPI(主从)或 CAN(多主)之间做出选择。
你的微控制器很可能有一个 UART 外设,其他的(尤其是 CAN)可能只在更高端的芯片上可用。无论哪种情况,都应该有大量关于如何使用这些外围设备来移动字节的文档。