你的项目应该使用 I2C 还是 SPI 设备?
这取决于你想实现什么。
注意一些设备只提供 I2C 或 SPI 设备中的一种,通常最佳解决方案是如果你的微控制器有足够的引脚,则同时使用 I2C 和 SPI。许多设计师认为总线是零件搜索的主要选择标准,但通常零件的性能和价格比它使用的接口更重要!
I2C 的优势:
- I2C 仅使用两个引脚(与 SPI 的三个引脚加上大多数配置中每个设备一个地址引脚相对)
- I2C 可以用相同的两个引脚支持多个设备,如果每个设备有不同的地址。
- I2C 标准定义了如何从/向特定地址读写,因此你不需要为每个单独设备仔细查看数据手册。注意许多复杂设备在某种程度上扩展了此标准,例如较大的 EEPROM 有多个 I2C 地址以允许访问整个存储器。
- I2C 有更少的参数需要配置,因为速度和其他属性在标准中固定(100 kbit/s、400 kbit/s 或 1 MBit/s = FM+)。因此你不需要担心 SPI 模式或为任何设备正确配置 SPI 速度。
- I2C 默认较慢的速度使得 I2C 更可能在较长的走线/导线上开箱即用。SPI 如果在 PCB 设计的物理速度限制或接近该限制下运行,更容易出现间歇性问题。对于 I2C,通常可以安全地假设它可以在 50cm 长的走线上工作(对于标准 400 kbit/s 速度)。I2C 比 SPI 能在更长走线上工作的唯一原因是其较慢的规定速度。如果你将速度设置得足够低,SPI 也能同样工作。
SPI 的优势:
- SPI 快得多。I2C 通常以 400 kbit/s 通信(在 Fast mode plus = FM+ 中:1 Mbit/s),SPI 以约 20-50 MBit/s 通信(它根据你的配置和每个部件支持的速度而变化)。但是对于许多应用你不需要那么多速度。
- 使用 SPI 你不需要担心分配 I2C 地址,因为每个设备有自己的片选引脚。请参见我们的分配 I2C 地址指南获取更多详细信息。
- SPI 在可以传输什么数据方面更灵活,因为通信消息格式不像 I2C 那样标准化。
- 每个 SPI 引脚仅在单一方向通信。因此 SPI 更容易使用光耦合器或类似设备进行电隔离。I2C 需要特殊(因此昂贵)的隔离设备如 TI ISO1541。
- SPI 通常使用示波器调试稍微容易,因为你知道每个引脚的数据来自哪个设备。对于 I2C,你需要查看发送的数据才能找出哪个设备尝试发送数据。
- I2C 有时会遇到由于设备锁定导致的问题,如果 I2C 通信在字节中间被中断(例如由于微控制器重启),因此导致设备状态机保持在与 I2C 主机状态不匹配的状态。大多数设计师不预期此问题,并且在其固件中不包括 I2C 锁定缓解。这意味着通常需要完全断电重启系统以消除总线锁定。此问题在固件开发期间更常见,因为微控制器重启由于重新编程、崩溃和断点而更频繁,在生产测试中通常很难创建在部署中创建锁定的特定条件。SPI 永远不会锁定,因为一旦片选引脚被取消断言它就会重置。
- SPI 通常可用于控制逻辑 IC 如 74HC 系列,因此你不需要单独的引脚来控制逻辑设备。注意这是否有效
在什么情况下你需要使用不同的接口(非 I2C 或 SPI)?
- 长电缆/线路。SPI 和 I2C 根据你的布局和总线速度可靠运行至几十厘米。如果你有更长的走线,你可能需要减慢总线(特别是在 SPI 的情况下)。这里的主要问题是时钟偏移:时钟引脚上电压电平的变化需要太长时间才能到达设备,因此设备"回答太晚"(此外来自设备的响应需要太长时间才能到达主机)。如果你想检查你的设计是否属于这种情况,只需将总线减慢到极慢速度(如 20 kbit/s)。如果问题仍然存在,则你没有时钟偏移问题。你也可以使用示波器调试。
- 来自环境的电磁噪声,例如在你的设备附近启动的大型电机。由于 I2C 不使用差分线路
- 多主机通信:I2C 和 SPI 通常仅在(预定义的)主机发起通信时通信。在大多数配置中,设备不可能仅使用 I2C 或 SPI 总线发起通信,因此你经常需要每秒轮询设备多次以检查状态是否已更改。I2C 和 SPI 没有内置的冲突检测机制来检测多个设备是否同时尝试写入总线。
- 异步通信:如果你想相互独立地发送/接收数据,你应该使用 UART、以太网或类似具有完全独立发送/接收子系统且不依赖公共时钟的总线。
- 非常快的通信:FPGA、快速 ADC/DAC、闪存等可能使用例如:
- QSPI:具有多个数据引脚的 SPI(通常 4 个数据引脚 - 因此名为 quad SPI)。
- LVDS:高速差分总线系统
- JESD204B:用于 IC 的超高速(多千兆位)数据链路系统。如果你不知道自己在做什么就不要碰!
- 并行:只是很多引脚,没有什么特别的。
如果在电路板外通信,你应该考虑哪些其他接口?
- RS485/RS422:稳健的高速工业总线(仅物理层,用于 Profibus 等系统)。快速(15 MBit/s)。RS422 类似 UART 但差分。RS485 在同一差分线上操作接收/发送。
- RS232:旧工业总线系统,非差分,需要 +-15V 通信(因此需要特殊 IC 来生成这些电压电平)。有些稳健,但不如看起来那么稳健。慢(典型 0.1 MBit/s,但在大多数情况下如果所有设备支持通常可工作至约 0.5 Mbit/s),不支持长电缆,特别是在电磁噪声环境中。
- LVDS:高速,但不能长距离(最多几米)。差分且有些稳健,但如果使用较长的电缆则不太适合嘈杂的工业环境。需要高速电路设计知识才能正确完成。
- 以太网:从 PCB 角度来看非常复杂(你需要特殊的 PHY = 物理层收发器 IC 和支持生成以太网消息 = 帧的 MAC 层的微控制器)但非常快(大多数微控制器最大 100 Mbit/s,但 FPGA、处理器等)且非常稳健(差分、32 位 CRC 校验和)。非常方便与计算机接口;可切换。支持 TCP/IP。PHY 和其他硬件非常便宜,因为它们大量生产。注意:PHY 相当复杂,如果你不了解高速电路设计的一些基础知识并且不非常仔细地阅读所有数据手册,你的设计很可能不工作 - 这通常很复杂调试,特别是如果你没有至少 50 MHz 带宽的多通道示波器和一些高速电路调试经验。从 PHY 到你的微控制器的接口对于 100 MBit/s 以太网通常是 RMII,此外你需要 SMC 接口(类似 I2C)来配置 PHY。
- USB:快速,但在理想情况下如果你的 IC 实际支持它(许多需要外部收发器 = USB HS PHY)仅可达到 480 MBit/s。大多数微控制器仅支持高达 12 MBit/s IC。复杂,除非你使用即用型 IC。调试在实践中相当困难,因为 USB 固件可能以许多非直接的方式失败(同样,对于仅执行 USB 到 X 转换的即用型 IC 除外)。我建议使用 USB 到 UART 转换器 IC 如
FT230XQ。微控制器上的 USB 有时往往不能与某些计算机一起工作,除非完全正确完成,因此如果可能的话尝试使用经过多种设备测试的专业制作的 USB 示例,并尽量不要修改太多。或者首先使用即用型转换器 IC。 - UART:对调试有用但不稳健。UART 到 USB IC 广泛可用(我目前推荐
FT230XQ)用于与计算机接口。有些快(许多现代微控制器可以做到约 12 MBit/s,但并不总是可行在该速度下使用它,特别是由于信号退化而不适用于长走线/电缆)。用于调试的 USB 到 UART 适配器在中国 readily available 且非常便宜。 - CAN:主要用于汽车系统。不是很快(1 MBit/s)但具有优先级系统,允许在传输低优先级消息期间发送高优先级消息(这些消息被中断并稍后重新发送)。差分且相当稳健。在 IC 级别上大多容易使用,但在固件级别上很难完全正确(有许多非直接的配置选项)。
Check out similar posts by category:
Electronics
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow