UART与I2C对SPI,用于微控制器之间的处理器间通信

时间:2014-01-30 23:27:54

标签: embedded microcontroller i2c uart spi

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

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

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

邮件将在发送之前放入邮箱中。

祝你好运, Drasko

3 个答案:

答案 0 :(得分:28)

这取决于您的总需求以及引脚的价格。

I2C只需要两个引脚,但它很慢并且无论是否有中断来处理它都是一件痛苦的事情,即使是在外设模块中构建也是如此。 它是一个主/从系统,它有利于控制许多慢速设备,如温度传感器 所有总线设备只有两条线路,通过协议中的I2C地址进行选择。

Uart需要两个引脚,它通常更快,更容易处理,但两侧需要(几乎)相同的时钟。 如果两个系统有时需要在不等待主轮询请求的情况下发送数据,那么一对一的异步系统就会很好 也可以用作总线系统,但是你需要一个主/从结构或更复杂的协议。

SPI需要3个(或4个带CS)引脚,它是最快的,即使使用DMA也很容易实现,低CPU时间开销,通常是缓冲的。 当你有足够的自由针脚时我会更喜欢它。

答案 1 :(得分:2)

我会使用UART或CAN或ETH或任何异步协议。

如果您使用同步协议,则主机必须始终“询问”从机,如果它有数据并产生不必要的流量。

答案 2 :(得分:1)

所有这些界面都有优点/缺点。

UART连接的基本功能需要2个引脚:RX和TX。如何通过该UART进行消息传递的SW实现要复杂得多...您必须在设备之间开发自己的Messenger协议,并确定什么是好消息,什么是坏消息。这可能会变得非常复杂,因为您几乎必须定义如何通过物理链路进行“通信”,什么是错误,重试等。除非您要实现与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可以处理的更快的数据速率,那么SPI
  2. SPI,如果您需要多主设备,则需要I2C或UART
  3. 作为最后的手段,UART ...拥有更多的软件开销来管理通信通道