因此,我有了一个大胆的想法,尝试在两个微控制器之间划分I2C控制器实现。也就是说,一个uC控制SDA,一个uC控制SCL,并作为总线,主机或从机上的一个I2C设备进行通信。我不是在这里尝试进行基本的I2C通信,而是希望两个物理上分开的控制器作为一个I2C接口一起工作。
在座的任何人都可以做这样的事情来建议我如何去做?
我以为对于初学者来说,我单独的SDA和SCL控制器将不得不有点笨拙,但是我不确定其余的东西。您将使用哪种处理器间通信? SPI的普及率似乎要高得多。这工作的可能性有多大?人们可能期望这种系统具有什么样的性能?可能只有几百赫兹吗?
在这种情况下,是否有应用程序很常见?不同的协议或其他;我想知道的是跨多个控制器分布的硬件通信接口。
最佳答案
假设您有理由这样做,即使它是“为了好玩”还是“仅仅因为它在那里”(为什么可以爬山越过)。
看一下I2C的工作原理。如果您让SDA(该信号的所有者)监视SCL,则两者都必须彼此监视信号(或其他保持同步的方法)。查看波形要求,如果两者都开始为高电平,则SDA下降,SCL所有者看到并下降SCL,sda所有者看到并确定第一位。现在我们已经遇到麻烦了。如果第一位为零,则SCL所有者不知道SDA是否已将其设置为1,因此它不能提高SCL来对其进行计时。必须有更多信息。 SDA和SCL所有者必须在某些规则上达成共识,当SCL变低时,SDA所有者必须在某个窗口内同意更改其状态。 SCL必须同意在该窗口之后才更改其状态。然后SDA可以看到SCL从高到低。重复一遍。否则,使用SCL不能超过I2C或该外设的最大速率,并且SDA处于该范围之内。如果SCL在此外设和/或I2C的规范之内,则SDA可以满意地更改直到ACK为止的比特,然后就可以了(即使没有这两个所有者方案,也是这样)。当您要停止时,您真正的问题就来了,SCL如何知道SDA已经完成了它需要做的事情,并且走高并保持高位?因此,SDA可以上升并保持高电平,并且SCL返回等待SDA启动的模式。您之间至少需要一个不属于i2c的信号,并且还需要达成另一个协议,即SCL的运行速度不比X和SDA满足的快(不能随意声明SCL以最大速率运行,因为SDA可能无法始终保持这样,外围设备可以但SDA不能,因此您的系统设计必须涵盖这一点。
远远地,仅用两个信号的所有者进行操作就容易了。从技术上讲,尽管有可能,但除了有趣的系统设计之外,它不会给您带来任何好处。可以攀岩的人比刚绕山的人有经验。
可以说,如果没有第三个信号,您可能会使SDA更改状态快两倍,比商定的I2C时钟速度快。 SCL可能会将其视为您要停止的指示。然后,SCL变为高电平,然后保持高电平,直到看到SDA变为高电平,然后变为低电平,表示再次启动。
我试图确定SCL是否甚至必须呆在那里,您是否可以为SCL使用一个自由运行的时钟,而SDA是唯一做出决定的事情?变低,等待SCL变高(SDA仍必须监视SCL),然后变高以创建STOP。保持高位,您既不会创建止损也不会创建起点。等待SCL高电平然后走低,您创建一个开始,观察scl通过事务驱动sda,在正确的时间创建停止,我认为只要不混淆外设的设计,它就可以工作。也许规格说明了这一点,但是与I2C和SPI只是勉强相关,通常外围设备会忽略该规格。有问题的外围设备占主导地位,因为那是您真正想要与之交谈的对象。因此,我认为SCL所有者可以像只是时钟源一样愚蠢,没有其他逻辑。