對于很多工程師,iic確實不是一個省油的燈,相比其他的串行總線,iic時序變化更復雜一些。
這次我們說一個在使用iic進行數據傳輸時經常會碰到的狀況及解決辦法。
首先先準備調試工具:萬用表一臺,示波器一臺,電烙鐵一臺。如果用控制器的話只需按照寄存器的操作流程走就可以,這里不做詳細贅述,我們主要講模擬iic需要注意的問題。
在程序調試前,首先確定硬件電路的正確性,iic總線為開漏輸出,所以一般需要接上拉電阻,查找電路圖,iic總線是否接上拉電阻,如果沒接,一般都不能使用iic通信,即使電路板顯示接上了,大家還是用萬用表測一下,以防萬一虛焊或是其他電路故障導致總線下拉,避免不必要的麻煩。
在確定硬件電路的正確性之后,將程序燒錄到芯片中進行測試。
模擬iic重要是注意延時時間長短,因為iic總線時序是遵從仲裁制度的,如果從機的機器周期比較慢的話,主機延時太短就會出問題,當然延時太長也不好,會導致數據傳輸速度變慢,這里就需要去用示波器測試了。其實有時候也不用示波器,網上關于各個芯片iic的操作很多,大家去借鑒一下就可以,因為延時這個東西雖然重要,但是不難,所以不要浪費太多時間在這里。
延時確定以后,就可以按照嚴格的iic讀寫時序去寫了,這里我們列一個比較突出的案例iic的eeprom操作時序來解析。
示意圖說明:示意圖分闡述了4種不同的操作方式,例如寫單個存儲單元,寫多個存儲單元,讀單個存儲單元和寫單個存儲單元。對于單個操作而言,上部為MCU通過I2C輸出的相關指令,下部為I2C設備的響應。例如寫單個存儲單元操作時,MCU發出I2C啟動,設備地址,寫標志位等,而I2C設備輸出多個ACK。
讀寫如果按照以上方式去寫的話,結果還是未通信,讀不出芯片內部的數據。那就需要使用示波器去抓波形測量了,這里我說一個經常碰到的問題。
在需要從芯片讀取多個字節的時候,往往會讀不出來,在確定了起始信號和結束信號都沒問題之后,請確定應答和無應答位的正確性。
什么是無應答:
無應答為MCU發出,無應答意為MCU不需要從機輸出數據,MCU將會停止本次I2C操作。需要說明的是,無應答并不是一種異常情況。
所以在讀操作中,后一個數據讀取完成后需要主機發送一個無應答信號,告訴從機數據已經讀取結束,不需要再讀了,發送完無應答信號后,發送停止信號,釋放總線。
本人之前做的msp430和zlg7290芯片通信,去讀取顯示寄存器DpRam內容時,就碰到過,可以往DpRam中寫數據,也可以從鍵值寄存器讀數據,但就是不能從DpRam中讀數據,這里就可以確定,iic首先是建立通信成功了,只是時序未按照規定時序來,使用示波器抓波后得知,讀取多個字節操作源碼中應答和無應答的操作寫反了,這些問題比較瑣碎,需要抓波一個時鐘一個時鐘的去對照,所以大家寫的時候好找可靠的資源去參照,可以節省調試的很多工作量。