我正在设计一个嵌入式设备,我想通过串行总线与第三方外围设备进行互操作。我应该选择 SPI、I²C 还是其他总线?
外围设备的带宽将非常低(一些传感器通过总线进行通信,定期轮询)并且很可能在控制器的一米或更短的范围内。控制器的唯一任务是收集传感器数据,以某种方式对其进行打包,然后通过另一条总线将其发送到无线模块(尽管传感器总线也可能被重用)。
我正在设计一个嵌入式设备,我想通过串行总线与第三方外围设备进行互操作。我应该选择 SPI、I²C 还是其他总线?
外围设备的带宽将非常低(一些传感器通过总线进行通信,定期轮询)并且很可能在控制器的一米或更短的范围内。控制器的唯一任务是收集传感器数据,以某种方式对其进行打包,然后通过另一条总线将其发送到无线模块(尽管传感器总线也可能被重用)。
如果您不确定,并且您的要求非常模糊,我会选择 I²C。
SPI 和 I²C 之间的主要区别在于 SPI 需要为每个外设提供片选线。I²C 在通信开始时广播外设地址,因此不需要片选线。在最初的几条之后,芯片选择线变得很麻烦。
另一方面,SPI 可能更容易实现和调试。如果您只想连接到几个设备,它可能是赢家。
除非您需要相对较长距离(米而不是厘米)的高数据速率,否则我会排除 USB。我也会排除 RS-232,除非它仍然是 1976 年,并且您的外围设备需要大量信号来区分一点噪音。
您可能会考虑 Dallas 1-wire,但我怀疑它不像 I²C 那样常见,而且需要 2 根线来操作的“1-wire”总线对我来说总是有点可疑。
既然你说这将是低带宽,我会分配足够的 IO 来处理 SPI 和 I2C。如果可能的话,我还会有额外的 CS 线,这样你就可以运行多个 SPI 设备。另外不要忘记查看您将如何为外围设备供电。如果您正在耗尽电池以获得最大寿命,则需要将设备置于低功耗模式或在不使用时移除电源。如果可能的话,也使用你的控制器串行控制器模块,很多控制器将复用 SPI、I2C 和串行。如果可以的话,将无线与传感器分开,这样可以更容易地在不使用时关闭设备。此外,一些传感器有一条线可以告诉控制器何时需要对其进行维修,因此您还希望有一个额外的 IO 进入一个理想的引脚,您可以从中生成中断。
基本上,您应该在 I2C 和 SPI 之间进行选择。
无论您使用哪种总线,都应考虑传感器和第三方外围设备的电压水平。您可以通过使用两个 MOSFET 制作自己的转换器来做到这一点(只有一种方式 - 拾取/不更改或向下/不更改;如果您需要以 3.3 运行传感器并与 1.8 和 5V 主设备接口,则只会出现问题)。请参阅恩智浦的AN10441 [PDF]。这也适用于 SPI(只需移除上拉)。您需要在连接器上添加一条线以建立参考电压(如果您还没有这样做的话。)
I2C 的一个缺点是您只能使用总线上最慢的时钟。如果一个传感器只能达到 100kHz,而您想以 400kHz 或 1MHz(均为有效速度)与内存通信,则未指定较慢传感器的行为。如果您使用 SPI,芯片选择线意味着较慢的传感器甚至不会监听总线上的内容,您可以为不同的传感器运行不同的速度。