为什么 I2C、SPI 等板载通信一般不进行错误检查?

电器工程 i2c spi 错误修正
2022-01-25 23:37:20

一些错误检查方法,如奇偶校验、校验和、CRC 等,用于有线/无线通信。但是,大多数具有 I2C、SPI 等接口的 IC 不使用错误检查方法。

让我们搜索“i2c i/o expander”并打开一个随机数据表。例如,让我们考虑一下TI 的PCF8574,它是一个 8 位 I/O 扩展器。如果在 I2C 传输期间与输出寄存器对应的位发生翻转,IC 会将相应的引脚驱动到不希望的电平。为什么大多数这类 IC 根本没有任何错误检查机制?我的假设是,即使在 IC 之间进行通信,所有信号都是嘈杂的。虽然概率会很低,但噪声会导致有点翻转。

这可能是原因吗?:任何错误检查机制都不能保证完全无错误的通信。它们只能帮助我们降低出错的概率。很明显,远程通信的误码概率高于车载通信。即使没有任何错误检查机制,板载通信的误码概率也可能在可接受的范围内。

你怎么看?

4个回答

您必须假设某些事情正常工作,即使在有错误检查的世界中也是如此。当板上通常有更多的数字信号时,为什么要选择 IIC 或 SPI?您似乎可以假设这些都将按预期进行解释。

正确设计的电路板上的正确设计电路应该是可靠的。想一想 CMOS 输出在电路板上驱动 CMOS 输入。除了彻底的组件故障(这与偶尔的数据损坏完全不同的问题)之外,想想实际可能出现的问题。在驱动端,您有一个 FET,它具有将线路连接到 Vdd 或接地的最大保证电阻。你想象的究竟是什么导致接收端没有正确的电平?

最初,状态可能不确定,因为线路上的任何电容都被充电或放电。然后在短迹线中可能会出现振铃。但是,我们可以计算出所有这一切稳定的最大最坏情况时间,并且线路在另一端可靠地跨越某个阈值。

一旦达到这个时间并且我们已经等待逻辑的最坏情况传播延迟是什么,就几乎没有改变信号了。您可能会认为来自电路板其他部分的噪声会耦合到信号上。是的,这可能发生,但我们也可以为此进行设计。电路板另一部分的噪声量通常是已知的。如果不是,那么它来自其他地方,并且在适当的设计中,它将被限制在某些最大 dV/dt 和其他特性上。这些东西都是可以设计的。

理论上,外部噪声会扰乱电路板上的走线,但对于设计合理的电路板,场强需要过大。高噪音环境确实存在,但仅限于已知位置。一块板可能无法在距离 10 kW 发射器 10 米处工作,但即使是这样也可以设计。

所以答案基本上是同一块板上的数字信号,如果设计得当,对于大多数普通用途来说是绝对可靠的。在失败成本非常高的特殊情况下,例如太空和某些军事应用,则使用其他策略。这些通常包括冗余子系统。您仍然认为板上的单个信号是可靠的,但假设板或子系统作为一个整体可能偶尔会出错。另请注意,这些系统的成本要高得多,而这样的成本负担会使大多数普通系统(例如个人计算机)因太贵而无用。

话虽如此,在某些情况下,即使在普通的消费电子产品中也会使用错误检测和纠正。这通常是因为过程本身具有一定的错误概率,并且因为限制被推动。计算机的高速主存储器通常确实包含用于错误检测和/或纠正的额外位。通过推动限制和增加资源来纠错来获得性能和最终错误率比放慢速度并使用更多的芯片来使一切本质上更可靠更便宜。

尤其是对于不是设计为通过电缆使用的​​协议,设计合理的电路板不会出现错误,而设计不佳的电路板在有或没有错误检查的情况下都无法正常工作。例如,具有多个从机的 I2C 总线上的毛刺可能会永久锁定总线 (*),除非主机有一个驱动器可以将 SDA 拉高,即使从机试图将其拉低。防止这种情况会使协议变慢,但如果总线足够没有故障,这种可能的行为不被认为是风险,那么通常就不需要错误检查逻辑。

(*) 如果从设备认为它在从另一个设备读取的数据字节的中间看到了一个开始条件,并将正在读取的数据解释为启动一个应该读取一串零的命令,那么它是可能的让每个从设备以这样的方式确认发送给另一个的数据字节,即在任何给定时间,至少有一个从设备将保持总线。

你为什么只问关于错误检查的问题?

您如何确定正确解释了开始条件?在有线或无线通信中,帧的开始是一个非常复杂的位组合,而在 RS-232 上它是一个简单的从高到低的变化,而在 I2C 上则是一个简单的协议违规。

我的观点是,不仅错误检查不同,而且协议的所有元素对于板载协议来说都比有线和无线通信的对应协议简单得多。原因是出错概率比有线/无线通信低几个数量级。

简短的回答是,I2C 和 SPI 所针对的许多设备都是指令集小且程序内存有限的低功耗设备。这些规范允许它们以很少的开销在固件中实现。如果您有足够的能力,您可以根据需要添加任意数量的层,但这些层会消除许多小型嵌入式应用程序。