将信息从一个系统发送到另一个系统的一般协议是什么?例如,假设我们要在一段时间内从微控制器收集一些信息,然后将其发送给另一个微控制器。我听说过SPI和I2C接口,但不清楚何时将一种方法用于另一种方法以及如何实现它。除了SPI和I2C以外,还有其他通用的方法吗?不同的微控制器的实现过程是否相似?它基本上是解析我在接收微控制器上所做的数据字节吗?
将信息从一个系统发送到另一个系统的一般协议是什么?例如,假设我们要在一段时间内从微控制器收集一些信息,然后将其发送给另一个微控制器。我听说过SPI和I2C接口,但不清楚何时将一种方法用于另一种方法以及如何实现它。除了SPI和I2C以外,还有其他通用的方法吗?不同的微控制器的实现过程是否相似?它基本上是解析我在接收微控制器上所做的数据字节吗?
Answers:
SPI和I2C有点相似,因为它们实际上更多地用于将外围设备连接到控制器或cpu,而不是实际在系统之间传输数据。USB是人们似乎希望视为通信系统的另一种接口,实际上是外围设备附件总线。
系统之间的通信并不完全像将设备连接到总线上。总线附件允许处理器直接敲打设备中的寄存器,而通信接口允许您发送/接收数据流。连接在总线上的设备通常需要的设备驱动程序,而对于通信,它真的没关系什么连接的另一端,只要主机而言。
当然,这一直都是一个更加危险的边界。诸如PCI和ISA之类的总线无疑是总线。I2C,SPI,USB可以说是总线。RS232,RS485和以太网无疑是通信接口。但是,还有诸如CAN总线和1553之类的东西,这些东西肯定是关于移动数据的,但是是以非常复杂的方式进行的。
没有一种发送数据的方式,根据距离,数据速率,环境,应用程序的不同,通信方式有很多...
最低层是物理层,它实际上将位移动。
SPI和I²C用于设备内部的短距离传输,在设备中没有太多的噪声会干扰传输。
对于距离不超过几十米的太快通讯,通过RS-232进行串行通讯是一个不错的选择。
如果存在更多的噪声或距离较长,则使用差分信号,例如在RS-485中。为了实现更快的数据传输,以太网越来越流行。
然后还有各种无线标准。
在物理层之上,还有更多的层来组织数据的发送方式,以检测和纠正传输中的错误,网络中的路由以及许多其他事情。例如,互联网协议是一个相当复杂的多层协议栈,通常在以太网协议之上。
确实没有“通用”协议,最终使用的协议在很大程度上取决于应用程序。为了让我们给您更好的答案,我们需要更好地了解您的要求。您提到您希望有单独的微控制器作为子系统互相通信。
有关此应用程序的一些问题:
如果您对问题1回答“否”:
如果此项目中只有2个微控制器控制器,那么您绝对可以在它们之间使用UART。如果它们都需要启动通信,请使用流控制,否则在一个方向上发送数据应该很简单。在大多数情况下,如果您选择较高的波特率之一,它应该“足够快”。I2C和SPI通常仅适用于主/从架构。
如果您对问题1回答“是”(超过2个控制器):
因此,现在您需要更具可扩展性的东西,可以在其中将可寻址设备拖放到公共总线上。这些后续问题的答案将帮助您在I2C和SPI(主从)或CAN(多主)之类的系统中做出选择。
您的微控制器很可能具有UART外设,其他的(尤其是CAN)可能仅在更高端的芯片上可用。无论哪种情况,都应该有大量的文档说明如何使用这些外设来移动字节。
正如@Jon所指出的那样,选择通信接口时的一个问题是一个实体是否将始终负责发起通信,还是一个以上的实体可能对此负责。一个相关的问题是一个实体是否总是准备好接收未经请求的通信。SPI常用于一侧总是准备好接收通信的应用中。例如,诸如74HC595移位寄存器之类的东西永远不会“忙”起来。虽然SPI有利于微控制器与应该由微控制器控制的硬件之间的通信,但实际上却不利于两个微控制器之间的通信。当两个具有I2C硬件的处理器使用它进行通信时,软件可以花很长时间(在非常宽泛的约束下)来处理正在发生的事情,不会造成数据丢失。如果处理器要花费100微秒的时间来处理每个传入的字节,则将严重限制吞吐量,但是发送方的速度将降低到足以使接收方保持同步的速度。SPI通常会发生的唯一方法是,如果一根单独的导线用于握手。
I2C确实是一个很棒的协议。使其无法想象的最完美协议的最大限制是
我个人希望控制器供应商支持SPI的三线式变体,其中包括握手。不过,我不知道有任何这样做的控制器。
以相同的顺序,最流行的用于2个CPU的物理层实例似乎是:
这些物理层实例(以及用于单独箱中2个CPU的其他物理层实例)通常为实现更高级别通信系统的软件提供字节流。
聪明的程序员以这样一种方式来编写软件:当硬件专家决定拆除一个物理层实例并将其替换为完全不同的物理层实例时,他们只需要重写一些函数来提供其字节输出流即可。硬件,并从硬件中读取字节流,所有更高级别的协议内容将继续保持不变。
将信息从一个CPU发送到另一个CPU的协议几乎总是涉及将字节流解释为一系列数据包:
某些人似乎喜欢通过将(2)多种报头结构之一与(3a)和多种序列化数据之一与(3b)多种混合之一进行混合匹配来构成全新的,自定义的,不兼容的协议。使用(4)多种预告片之一转义序列化的数据。
将数据封装到数据包中的一些最简单的协议包括:
将数据封装到数据包中的稍微复杂一些的协议包括:
有很多协议
您可能会喜欢阅读 Radia Perlman的“协议设计民俗”,其中描述了协议设计可能出错的地方。
没有单一的“通用”协议。选择可以(例如)取决于:
在很多情况下,您必须将物理层(信号层)与数据链路层区分开(+/-数据编码方式)(检查OSI模型,低2 ..4层)。可能的physscal层例如:
您可以使用一行来传输数据和时钟信息,或将其拆分为多行。后者曾经很流行,但是如今,大多数新的/快速协议倾向于使用一条线路(或两条线路作为一条线路)。
有很多方法可以对线上的数据和时钟进行编码。RS232传统上使用NRZ,有Machester编码,并且在具有奇怪名称的2.7 RLL硬盘上使用各种格式。
概括起来:系统之间有数不胜数的通讯方式。而且我什至没有提到连接器或更高级别的方面,例如错误检测和恢复,数据编码,压缩和加密...