5

对于我正在进行的一个项目,我必须通过 I2C 与多功能芯片通信。我可以通过 I2C /dev/i2c-1 接口从 linux 用户空间执行此操作。

但是,似乎驱动程序正在同时与同一个芯片通话。这导致我的 I2C_SLAVE 访问失败,错误值为 EBUSY。好吧 - 我可以通过 ioctl I2C_SLAVE_FORCE 覆盖它。我试过了,它有效。我的命令到达芯片。

问题:这样做安全吗?我确信我写的地址范围永远不会被任何内核驱动程序访问。但是,我不确定以这种方式强制 I2C 通信是否会混淆一些内部状态机左右。(我不喜欢I2C,我只是使用它......)

供参考,硬件事实:

操作系统:Linux
 架构:TI OMAP3 3530
 I2C 芯片:TWL4030(电源、音频、usb 和许多其他东西..)
4

2 回答 2

6

我不知道那个特定的芯片,但通常你有需要一系列写入的命令,首先到一个地址以设置某种模式,然后你读取或写入另一个地址——其中第二个地址的功能会根据你写给第一个的。因此,如果驱动程序处于其中一个操作的中间,并且您中断了它(反之亦然),您就会遇到难以调试的竞争条件。为了获得可靠的解决方案,您最好通过芯片的驱动程序进行通信......

于 2009-12-31T15:48:58.120 回答
2

我大多同意@Wim。但我想补充一点,这肯定会导致不可逆转的问题或破坏,具体取决于设备。

我知道陀螺仪(L3GD20)要求您不要写入某些位置。芯片的设置方式,这些位置包含制造商的设置,这些设置决定了设备的功能和执行方式。

这似乎是一个容易避免的问题,但如果您考虑 I2C 的工作原理,所有字节一次传递一位。如果您在另一个字节的传输过程中中断,结果不仅可能无法真正预测,而且还会成倍增加永久性损坏的风险。当然,这完全取决于如何处理问题的芯片。

由于微控制器的运行速度往往比 I2C 允许的总线速度快得多,而且由于总线速度本身是动态的,基于设备处理信息的速度,所以最好的办法是在等待的传输之间插入暂停或循环。要完成的事情。如果必须,您甚至可以插入超时。如果这些暂停不起作用,则说明实现有问题。

于 2014-03-07T21:36:39.453 回答