1. 程式人生 > >GPIO模擬I2C操作除錯注意事項

GPIO模擬I2C操作除錯注意事項

I2C作為板級序列資料匯流排,其規格相對簡單,但除錯過程中的一些細節問題容易被忽視,產生意想不到的時序錯誤。寫這邊文章為了記錄我在除錯I2C過程中遇到的問題,以便今後查閱並作為經驗與大家分享。

關於I2C匯流排的規格可以參考I2C的規格書,描述準確詳細,此不贅述。

使用MCU等SoC晶片中的I2C模組,一般不會出現問題,因為關於I2C的操作時序都經過晶片設計公司封裝成功能完好的IP。但通過GPIO來模擬I2C操作時,所有的時序需由使用者自己把握,因此,對於I2C的時序和操作要有深刻的認識。以下是使用GPIO模擬I2C除錯時需要重點關注的問題:

(1)I2C匯流排訊號引腳開漏輸出特性。Specification中明確規定SCL,SDA需使用開漏引腳,這一規定是與I2C匯流排特性相關的,因此,GPIO的選用要滿足這一特性。

(2)I2C匯流排訊號引腳上拉。I2C匯流排空閒時,訊號線需處於高電平狀態,匯流排無驅動時由電阻上拉到電源。MCU或其他SoC晶片可以使能內部上拉或使用外部電阻上拉。

(3)SCL時鐘速度。標準速度SCL通常為100KHz,高速SCL可達400KHz,根據I2C裝置時鐘特性,除錯時需合理設定delay time。

(4)SDA資料線釋放(取消驅動)。I2C匯流排的SDA是單工雙向的資料線,同一時間只能由一方提供驅動(主機或是裝置),否則會出現驅動衝突,導致資料出錯或時序錯誤。以下幾種情況SDA要及時釋放:

1)主機發送1位元組資料,check ack之前要及時釋放SDA。主機發送資料時SDA由主機驅動,check ack時主機檢測由裝置驅動的1bit資料。如果主機驅動SDA未及時釋放,SCL為低時產生衝突,SCL為高時檢測ack出錯,甚至會出現SCL為高時SDA的跳變產生錯誤Start/Stop標誌,尤其是在主機發送資料最後1bit為高的情況下。
2)主機接收1位元組資料(非最後1位元組),send ack之後要及時釋放SDA。主機接收資料時SDA由裝置驅動,之後裝置會釋放SDA,由主機驅動SDA傳送ack,傳送ack之後要及時釋放SDA,驅動權交給裝置。如果主機send ack之後未及時釋放SDA,在SCL為低時產生驅動衝突,SCL為高時主機取樣資料會出現SDA跳變產生錯誤Stop標誌,尤其是在接收下一位元組資料的第1bit位為高的情況下。
這種情況下除錯eeprom讀寫現象:資料高bit位為0時讀寫正常,資料高bit位為1時,讀資料全0xFF。