UART、I2C和SPI在微控制器之间进行处理器通信方面的比较

27

我正在研究一种连接两个微控制器的方法。在序列化层面上,我考虑使用Nano Protobuffers (http://code.google.com/p/nanopb/),这样我可以编码/解码消息并在两个处理器之间发送它们。

基本上,一个小型处理器将是RPC服务器,能够执行几个功能。更大的处理器将通过发送消息调用其RPCs,然后当数据准备好时,它将从较小的处理器中读取数据。

使用UART、I2C或SPI的优缺点是什么?

在发送之前,消息将被放入邮箱队列中。


1
这个问题似乎不适合讨论,因为它涉及到计算机设计而非编程。 - Adi Inbar
3
I2C通信总体上来说不太好用,双向数据线经常会引起问题,只有在没有其他选择的情况下才将其作为外围设备的最后一种选择。 - old_timer
1
您可以使用最快的一种。基本上它是SPI。 - kirill
3个回答

28

这取决于您的总体需求以及引脚的成本。

I2C只需要两根引脚,但它很慢,无论使用中断与否都很麻烦,即使使用了内置的外设模块。 它是一个主/从系统,适用于控制许多缓慢的设备,如温度传感器。
所有总线设备仅需要两条线路,在协议中通过I2C地址进行选择。

UART需要两个引脚,通常更快,易于处理,但在两侧几乎需要相同的时钟。 异步的一对一系统,如果两个系统都需要发送数据而不等待主轮询请求,则可以很好地使用。
也可以用作总线系统,但那样就需要主/从结构或更复杂的协议。

SPI需要3(或4个带CS的)引脚,速度最快,即使使用DMA也很容易实现,CPU时间开销低,经常有缓冲。 如果您有足够的空闲引脚,则我会更喜欢使用SPI。


SPI是主/从模式 - 主设备发送时钟,因此从设备(如果使用CS,则每个从设备)需要一个中断线来请求传输。对我而言,在想要每端能够随时传输的情况下,UART是最简单实现的选择。 - DisappointedByUnaccountableMod

2
所有这些接口都有其优点和缺点。
UART连接在其基本功能中需要2个引脚:RX和TX。如何通过UART传递消息的软件实现要复杂得多……您必须在设备之间开发自己的消息协议,并决定什么是好消息,什么是坏消息。它可能会变得非常复杂,因为您几乎必须定义如何在物理链路上进行“通信”,什么是错误、重试等。除非您正在将串行端口连接到PC或其他外部设备,否则我认为UART对于IC到IC通信路径来说过于冗余。主机和从机没有特别定义。
SPI是主从关系,可以更快地传输数据(我看过高达60MHz的时钟频率,但不常见),但也需要更多的引脚,至少需要3个引脚用于点对点通信方案,但随着“从机”数量超过1个,引脚数量将增加到3+n。SPI没有错误指示。SPI是一种“事实标准”,这意味着它的实现可能会有所不同,具体取决于IC供应商如何定义“他们”的SPI实现。我通常认为SPI缺乏真正的标准是一个“缺点”。
I2C也是一种两个引脚的接口,是由Phillips(现在的NXP)开发的实际“标准”。作为一个标准,它在操作方式、错误引发方式方面都有很好的定义,并且易于实现。它具有寻址方案,可以发送命令,并且可以在事务中支持0个或多个数据帧。可以支持CRC(可选)和更高的数据速率(高达5Mbits)。它确实存在缺点,即总线电容可能会限制实际数据速率(上升/下降时间),但是通常您可以设计解决这个“问题”。
在其最基本的形式中,所有这些总线都是“接地参考”的……并且可能受到系统诱导噪声的影响。显然,低电压会使这种问题变得更加严重。再次强调,谨慎的设计实践可以缓解许多人报告的问题,这是他们存在的祸根。
对于最初由发布者要求的点对点系统,如果需要主从配置,则SPI或I2C接口可能是适当的(数据速率相关)。如果需要主-主关系,则可能需要I2C或UART。
从软件实现的易用性角度来看,我将这些通信方法排列如下:
  1. 如果您需要比I2C更快的数据传输速率,则选择I2C。
  2. 如果您需要多主机,则选择I2C或UART。
  3. UART作为最后的选择……需要更多的软件开销来管理通信通道。

1
我会使用UART、CAN、ETH或任何异步协议。
如果使用同步协议,则主设备必须始终“询问”从设备是否有数据并生成不必要的流量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接