i2c bus 通訊異常
I2C bus 是 WIRE AND
I2C bus上連接的裝置 SDA和SCL線路都是設定open drain。藉由pull high電阻拉高電位,實現線與。
i2c bus上只要其中一個裝置,拉LOW SDA或SCL,其他裝置就無法拉HIGH,如果有裝置拉LOW以後沒有release回idle high,整個 bus的通訊會被暫停,稱I2C bus hangs
問題如果出在i2c master 端藉由除錯可以知道,主動去重置i2c周邊功能。但i2c slave不一定有reset pin,如果 slave hang住bus, 即使系統reset也不能解除,須將slave重新上電。
SDA hang.
master 通訊中如果意外中斷,沒有發出完整的CLK。卡在SCL為HIGH, SDA被slave拉LOW。此時master無法發起START條件,沒辦法開始下次與slave通訊。
可以藉由gpio對SLC拉pluse使slave的狀態往下走。直到SDA被釋放,master可以發出STOP條件。結束這次錯誤通訊。
SCL hang.
Clock Stretching. slave在接收資料來不及處理時,主動拉low SCL 直到 slave ready 釋放SCL。
SCL被咬住通常是程序設計問題, ISR狀態出錯或卡死。
留言
張貼留言