2009-12-31 79 views
5

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

但是,似乎一个驱动程序正在同一个芯片上同时进行通话。这会导致我的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

你有没有试过在http://chiphacker.com上提出这个问题?这是一个类似SO的网站,但对于电子产品(尽管不像SO本身那么活跃)。 – Wim 2010-01-03 10:30:51

回答

6

我不知道具体的芯片,但往往你有需要写入命令序列,首先要一个地址来设置一定的模式,那么你读或写另一个地址 - 在那里第二个地址的功能根据您写到第一个地址的内容而改变。因此,如果驱动程序处于其中一个操作的中间,并且您中断了该操作(反之亦然),则您的竞争条件很难调试。对于可靠的解决方案,您最好通过芯片的驱动程序进行通信...

+0

如果我们正在编写芯片驱动程序,我们如何处理这个问题。根据我的理解,我在我的芯片驱动代码中使用I2C_SLAVE和I2C_SLAVE_FORCE。那么在芯片的驱动代码中使用I2C_SLAVE_FORCE是否明智? – 2015-05-25 06:36:34

2

我大多数人都认同@Wim。但我想补充一点,这可能会导致不可逆转的问题或破坏,这取决于设备。

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

这似乎是一个很容易避免的问题,但如果您考虑I2C如何工作,则所有字节都一次传递一次。如果在传输另一个字节的过程中发生中断,结果不仅可能是不可预测的,而且还会增加指数级永久性损坏的风险。当然,这完全取决于如何处理问题的芯片。由于微控制器的速度往往比I2C所允许的总线速度快得多,并且由于总线速度本身是基于设备处理信息的速度而动态变化的,所以最好的办法是在两者之间插入暂停或循环等待事情完成的传输。如果你不得不,你甚至可以插入超时。如果这些暂停不起作用,那么实施会出现问题。