發表文章

目前顯示的是 6月, 2022的文章

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狀態出錯或卡死。