将数据从一个系统传输到另一个系统的通用协议?


18

将信息从一个系统发送到另一个系统的一般协议是什么?例如,假设我们要在一段时间内从微控制器收集一些信息,然后将其发送给另一个微控制器。我听说过SPI和I2C接口,但不清楚何时将一种方法用于另一种方法以及如何实现它。除了SPI和I2C以外,还有其他通用的方法吗?不同的微控制器的实现过程是否相似?它基本上是解析我在接收微控制器上所做的数据字节吗?


4
您想做什么具体的事情?
starblue

仅考虑如何使系统的不同部分在一个小盒子中相互传递数据,因此可以认为距离很短。在一个盒子中放置不同部件的原因是为了简化功能,以使每个部件都有自己的功能(希望这很有道理。)
O_O 2011年

2
这不是人们通常所说的系统。这些更多是我将定义为子系统的内容。它们构成您可以考虑完成单个任务的单个系统的一部分。它是语义,但我认为您的许多答案都非常广泛,因为它们对您从问题中寻找的内容并不完全了解。
Kortuk

1
按照Kortuk所说,它有助于定义问题。需要问自己的一个重要问题是,您是否打算用同一功能的不同实现替换单个子系统,或者这是否是一次性设计。如果您使用真实的总线,并且将子系统的实现细节公开给您的cpu,则子系统的更改需要对控制器进行as / w更改,而如果您使用的是通信接口,则如何实现(替换)子系统,只要它符合相同的消息协议。
JustJeff 2011年

除了分离任务外,没有其他原因将功能拆分到多个设备上并不容易。通信和同步比在同一微控制器中具有两个进程要复杂得多。现在,如果这些进程的延迟配置文件特别不兼容(其中一个必须快速更新,而另一个可能需要一些时间才能完成一个块),则可能有合理的理由将它们拆分。即使这样,更常见的解决方案是使用中断或找到一种方法来进一步分解较长的任务。根据您的描述,我倾向于认为您应该重新考虑这一点。
darron 2011年

Answers:


10

SPI和I2C有点相似,因为它们实际上更多地用于将外围设备连接到控制器或cpu,而不是实际在系统之间传输数据。USB是人们似乎希望视为通信系统的另一种接口,实际上是外围设备附件总线。

系统之间的通信并不完全像将设备连接到总线上。总线附件允许处理器直接敲打设备中的寄存器,而通信接口允许您发送/接收数据流。连接在总线上的设备通常需要的设备驱动程序,而对于通信,它真的没关系什么连接的另一端,只要主机而言。

当然,这一直都是一个更加危险的边界。诸如PCI和ISA之类的总线无疑是总线。I2C,SPI,USB可以说是总线。RS232,RS485和以太网无疑是通信接口。但是,还有诸如CAN总线和1553之类的东西,这些东西肯定是关于移动数据的,但是是以非常复杂的方式进行的。


CANbus参与其中,而以太网不是吗?使用CAN进行简单的来回消息传递非常简单。它们是专用芯片,大多数家族都支持其内部的微控制器。
2011年

@Kortuk-就象232这样的点对点对称性而言,而1553或CAN则施加了主/从关系,是的。我不相信我说过以太网很简单,只是它没有在端点上强加总线控制器/总线设备的区别。
JustJeff 2011年

同样,要完全披露-我对CAN的看法完全来自切向暴露;在我使用过的几个系统上,它一直是未使用的可选外围设备,但是经过数百遍文档之后,您只是通过渗透来了解一些未使用的选项。因此,我假设CAN是控制器/受控设备类型的体系结构。
JustJeff 2011年

我认为公共汽车在不同的情况下具有不同的含义。从原理图的角度来看,具有多个信号的任何接口都可以视为总线。当您以更高的抽象度进入更高层次时,总线会改变含义。总线稍微高一点,通常意味着涉及或可以涉及多个设备。例如,RS485多点绝对是总线。从Linux设备的角度来看,更高得多的RS485再次成为通信接口,并从总线降级了……直到您在其之上添加自己的协议层,然后将其转换回总线。在每个级别上都有不同的含义。
darron 2011年

11

没有一种发送数据的方式,根据距离,数据速率,环境,应用程序的不同,通信方式有很多...

最低层是物理层,它实际上将位移动。

  • SPI和I²C用于设备内部的短距离传输,在设备中没有太多的噪声会干扰传输。

  • 对于距离不超过几十米的太快通讯,通过RS-232进行串行通讯是一个不错的选择。

  • 如果存在更多的噪声或距离较长,则使用差分信号,例如在RS-485中。为了实现更快的数据传输,以太网越来越流行。

  • 然后还有各种无线标准。

在物理层之上,还有更多的层来组织数据的发送方式,以检测和纠正传输中的错误,网络中的路由以及许多其他事情。例如,互联网协议是一个相当复杂的多层协议栈,通常在以太网协议之上。


7

可以使用一个简单的串行UART(一条Tx和一条Rx线路,没有离散时钟),并且可以很容易地通过光隔离磁隔离器进行调整,以在不同电势之间(甚至是初级和次级电路)交叉。

就协议而言,具有定义的命令字节和某种校验和方案的任何事物都可以正常工作。确实没有适用于所有类型通信的全覆盖标准协议。I2C具有信令标准(定义寻址,停止,启动等),但是实际通信的协议完全取决于开发人员。

例如,PMBus是一种使用I2C作为其物理介质的电源通信协议。


6

确实没有“通用”协议,最终使用的协议在很大程度上取决于应用程序。为了让我们给您更好的答案,我们需要更好地了解您的要求。您提到您希望有单独的微控制器作为子系统互相通信。

有关此应用程序的一些问题:

  1. 该项目中将有两个以上的微控制器吗?
  2. 您对速度和吞吐量有何要求?信息需要多快到达那里?您多久发送/接收一次数据?

如果您对问题1回答“否”:

如果此项目中只有2个微控制器控制器,那么您绝对可以在它们之间使用UART。如果它们都需要启动通信,请使用流控制,否则在一个方向上发送数据应该很简单。在大多数情况下,如果您选择较高的波特率之一,它应该“足够快”。I2C和SPI通常仅适用于主/从架构。

如果您对问题1回答“是”(超过2个控制器):

  • 如果您的项目中有2个以上的微控制器,哪个将启动通信?它只会是一个主控制器(即主从架构)吗?还是任何子系统都可以随时讲话?
  • 是否需要任何子系统相互通信?例如:对于设备A,B和C:A可以发送到B和C,B可以同时发送到A和C,依此类推。

因此,现在您需要更具可扩展性的东西,可以在其中将可寻址设备拖放到公共总线上。这些后续问题的答案将帮助您在I2C和SPI(主从)或CAN(多主)之类的系统中做出选择。

您的微控制器很可能具有UART外设,其他的(尤其是CAN)可能仅在更高端的芯片上可用。无论哪种情况,都应该有大量的文档说明如何使用这些外设来移动字节。


5

正如@Jon所指出的那样,选择通信接口时的一个问题是一个实体是否将始终负责发起通信,还是一个以上的实体可能对此负责。一个相关的问题是一个实体是否总是准备好接收未经请求的通信。SPI常用于一侧总是准备好接收通信的应用中。例如,诸如74HC595移位寄存器之类的东西永远不会“忙”起来。虽然SPI有利于微控制器与应该由微控制器控制的硬件之间的通信,但实际上却不利于两个微控制器之间的通信。当两个具有I2C硬件的处理器使用它进行通信时,软件可以花很长时间(在非常宽泛的约束下)来处理正在发生的事情,不会造成数据丢失。如果处理器要花费100微秒的时间来处理每个传入的字节,则将严重限制吞吐量,但是发送方的速度将降低到足以使接收方保持同步的速度。SPI通常会发生的唯一方法是,如果一根单独的导线用于握手。

I2C确实是一个很棒的协议。使其无法想象的最完美协议的最大限制是

  1. 它的速度是有限的。SPI可以运行得更快,甚至UART有时也可以运行得更快
  2. (2)虽然I2C只需要两条线非常方便,但是两条线都必须能够进行双向集电极开路通信。这使得很难通过中继器发送I2C。

我个人希望控制器供应商支持SPI的三线式变体,其中包括握手。不过,我不知道有任何这样做的控制器。


有趣的是,您应该提到这一点...我必须将SPI接口转换为非双向的I2C类接口(第一个字节是一个地址),以使更多的设备能够参与总线而不是我选择的芯片。 。如果您的从设备都是FPGA,则可以使用。:)我也希望这两个主要的同步标准之间能有所帮助。
darron 2011年

哦,我想我应该澄清一下,在从机上的输出使能直到接收到其地址字节后才被置为有效,并且直到单芯片选择被取消置位之前它们都保持开启状态……因此,这显然与正常的SPI +高电平稍有不同。协议。但是,从主设备角度来看,它与标准SPI完全兼容。(例如微处理器)
darron 2011年

@darron:好酷。我不知道该行业开始使用开放式三线通信总线(其中的线被主动驱动为高电平或低电平)会发生什么情况?我猜在避免被动上拉与允许任何设备发出中断信号之间存在细微的冲突,尽管可以通过添加一个可以连接到主机或不方便从机连接的中断引脚来解决(我目前的实现该协议只有一个从站,因此可以在需要服务时使用数据返回线异步发出信号)。
supercat

@darron:为避免使用片选引脚,主机通过在时钟为低电平时在数据线上发送两个上升沿来发出命令开始信号;当时钟和数据都为低(空闲)时,从机可以通过输出状态值来指示其最后一个数据字节是否有效;否则,当时钟为低且数据为高时,它们表示需要注意。如果我要为此协议设计主控硬件,则可以添加发送8个时钟脉冲的功能,其中数据线镜像时钟,而在从属硬件中,可以在……期间对上升沿的数量进行异步计数

@darron:...一个数据字节。如果大于等于5,则该字节将被忽略(从机将假定主机对接收字节数据感兴趣,但实际上并没有要说的内容)。但是,这并没有那么重要,因为当时钟为低时让从机报告最后一个字节的状态(如果从机是处理器,则允许主机知道从机尚未准备好)并错过了最后的“交易机会”
超级猫

3

以相同的顺序,最流行的用于2个CPU的物理层实例似乎是:

  • 菊花链SPI(例如JTAG使用的)
  • 每从选择线SPI
  • “ TTL级别RS-232”,也称为“异步启动-停止串行通信”(将一个CPU的UART TX引脚直接连接到另一个CPU的UART RX引脚)
  • I2C
  • 8位数据+选通(例如IEEE 1284打印机端口并行端口)
  • 共享内存(一次仅一个CPU驱动地址/数据/控制总线)

这些物理层实例(以及用于单独箱中2个CPU的其他物理层实例)通常为实现更高级别通信系统的软件提供字节流。

聪明的程序员以这样一种方式来编写软件:当硬件专家决定拆除一个物理层实例并将其替换为完全不同的物理层实例时,他们只需要重写一些函数来提供其字节输出流即可。硬件,并从硬件中读取字节流,所有更高级别的协议内容将继续保持不变。

将信息从一个CPU发送到另一个CPU的协议几乎总是涉及将字节流解释为一系列数据包:

  1. 前言
  2. 标头
  3. (可能转义的)序列化数据
  4. 预告片

某些人似乎喜欢通过将(2)多种报头结构之一与(3a)和多种序列化数据之一与(3b)多种混合之一进行混合匹配来构成全新的,自定义的,不兼容的协议。使用(4)多种预告片之一转义序列化的数据。

将数据封装到数据包中的一些最简单的协议包括:

将数据封装到数据包中的稍微复杂一些的协议包括:

有很多协议

您可能会喜欢阅读 Radia Perlman的“协议设计民俗”,其中描述了协议设计可能出错的地方。


3

没有单一的“通用”协议。选择可以(例如)取决于:

  • 距离
  • 所需的吞吐量
  • 特殊外围设备的可用性
  • 噪音水平
  • 需要光学隔离
  • 严重程度(容许的故障率)
  • 两端可用的CPU电源
  • 两端都有可用的I / O引脚

在很多情况下,您必须将物理层(信号层)与数据链路层区分开(+/-数据编码方式)(检查OSI模型,低2 ..4层)。可能的physscal层例如:

  • 简单的5V或3.3V甚至1.8V TTL
  • 以上任何一种,但采用集电极开路而不是推挽
  • 平衡lov电压信号传输(通常与FPGA一起使用)
  • 平衡高波动率(RS485,RS432)
  • 单端更高电压(RS232)
  • 平衡的trafo耦合(各种以太网版本,PDIF音频)
  • 光纤(光纤以太网,toslink)

您可以使用一行来传输数据和时钟信息,或将其拆分为多行。后者曾经很流行,但是如今,大多数新的/快速协议倾向于使用一条线路(或两条线路作为一条线路)。

有很多方法可以对线上的数据和时钟进行编码。RS232传统上使用NRZ,有Machester编码,并且在具有奇怪名称的2.7 RLL硬盘上使用各种格式。

概括起来:系统之间有数不胜数的通讯方式。而且我什至没有提到连接器或更高级别的方面,例如错误检测和恢复,数据编码,压缩和加密...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.