有人曾经将I2C分成两个微控制器吗?

时间:2016-11-02 06:29:35

标签: c embedded distributed i2c

所以我有这个疯狂的想法尝试在两个微控制器上拆分I2C控制器实现。也就是说,一个uC控制SDA,一个uC控制SCL,并作为一个I2C设备在总线,主设备或从设备上进行通信。我不想在这里进行基本的I2C通信,我希望两个物理上独立的控制器作为一个I2C接口一起工作。

这里的任何人都做过这样的事情,可以建议我如何去做吗?

我假设我的单独的SDA和SCL控制器必须被点击,对于初学者,但我不确定其余的。你会使用什么样的处理器间通信?处于更高速率的SPI似乎是一个开始的地方。这种工作的可能性有多大,人们可能期望从这样一个系统中获得什么样的性能?它可能只有几百赫兹,也许?

是否存在这类事情常见的应用?不同的协议或其他;我想知道的是一个分布在多个控制器上的硬件通信接口。

1 个答案:

答案 0 :(得分:0)

假设你有理由为什么要这样做,如果它是"为了好玩"或者"只是因为它在那里" (为什么你可以到处爬山时为什么要爬山。)

了解I2C的工作原理。如果您有SDA(该信号的所有者)观看SCL,则两者都必须观察彼此的信号(或其他一些保持同步的方法),反之亦然。查看波形要求,如果两者都从高电平开始,然后SDA下降,则SCL所有者会看到并丢弃SCL,sda所有者会看到并断言第一位。现在我们已经陷入困境了。如果第一位为零,则SCL所有者不知道SDA是否已设置该位,因此它无法提升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所有者可能就像一个时钟源一样愚蠢而没有其他逻辑。