对于我正在研究的项目,我必须通过I2C与多功能芯片通信。我可以通过I2C / dev / i2c-1接口从linux用户空间执行此操作。
然而,似乎司机正在同时与同一芯片通话。这导致我的I2C_SLAVE访问失败,其中错误的值为EBUSY。好吧 - 我可以通过ioctl I2C_SLAVE_FORCE覆盖它。我尝试过,它的确有效。我的命令到达芯片。
问题:这样做是否安全?我确信我写的地址范围永远不会被任何内核驱动程序访问。但是,我不确定强制I2C通信是否会混淆某些内部状态机左右。(我不是 进入I2C,我只是使用它......)
供参考,硬件事实:
OS: Linux Architecture: TI OMAP3 3530 I2C-Chip: TWL4030 (does power, audio, usb and lots of other things..)
答案 0 :(得分:6)
我不知道那个特定的芯片,但是经常你有需要一系列写操作的命令,首先是一个地址来设置某个模式,然后你读或写另一个地址 - 其中第二个地址的功能根据您写入第一个的内容进行更改。因此,如果驱动程序处于其中一个操作的中间,并且您中断它(反之亦然),那么您将遇到难以调试的竞争条件。为了获得可靠的解决方案,您最好通过芯片的驱动程序进行通信......
答案 1 :(得分:2)
我大多同意@Wim。但我想补充一点,这肯定会导致不可逆转的问题或破坏,具体取决于设备。
我知道陀螺仪(L3GD20)要求您不要写入某些位置。芯片的设置方式,这些位置包含制造商的设置,用于确定设备的功能和执行方式。
这似乎是一个容易避免的问题,但如果你考虑一下I2C是如何工作的,那么所有字节一次传递一位。如果在另一个字节的传输过程中中断,结果不仅可能真正无法预测,而且还会以指数方式增加永久性损坏的风险。当然,这完全取决于如何处理问题的芯片。
由于微控制器的运行速度比I2C允许的总线速度快得多,并且由于总线速度本身是基于设备处理信息的速度而动态的,因此最好的选择是在传输之间插入暂停或循环等待事情结束。如果必须,您甚至可以插入超时。如果这些暂停不起作用,那么实施就会出现问题。