2009-12-31 40 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所允許的總線速度快得多,並且由於總線速度本身是基於設備處理信息的速度而動態變化的,所以最好的辦法是在兩者之間插入暫停或循環等待事情完成的傳輸。如果你不得不,你甚至可以插入超時。如果這些暫停不起作用,那麼實施會出現問題。