使用iic進行數據傳輸時經(jing)常會碰到的狀況及解決辦法
時(shi)間:2018-09-25 來(lai)源:未知
對于很多工程師,iic確實不是(shi)一個(ge)省油(you)的(de)燈,相比其(qi)他的(de)串行總線,iic時序變化更復雜一些。
這(zhe)次我(wo)們說一個在使用iic進行數據傳輸時經常(chang)會碰到的狀況及解決辦(ban)法(fa)。
首(shou)先先準備調試(shi)工具:萬用表(biao)一(yi)臺(tai),示波器一(yi)臺(tai),電(dian)烙鐵(tie)一(yi)臺(tai)。如果用控(kong)制器的(de)話只需按照寄存器的(de)操作流(liu)程(cheng)走(zou)就(jiu)可以,這里不做詳細贅述(shu),我(wo)們主(zhu)要講(jiang)模擬iic需要注意的(de)問題。
在程(cheng)序(xu)調(diao)試(shi)前,首先確定硬件電路(lu)(lu)的正確性,iic總線為(wei)開漏輸出,所以(yi)一般需要接(jie)上拉(la)(la)電阻,查找電路(lu)(lu)圖,iic總線是(shi)否接(jie)上拉(la)(la)電阻,如(ru)果沒接(jie),一般都不(bu)(bu)能(neng)使用(yong)iic通信,即使電路(lu)(lu)板顯示接(jie)上了(le),大(da)家(jia)還是(shi)用(yong)萬用(yong)表測一下,以(yi)防萬一虛(xu)焊或是(shi)其他電路(lu)(lu)故障導致總線下拉(la)(la),避免不(bu)(bu)必(bi)要的麻煩(fan)。

在確(que)定硬件(jian)電路的正確(que)性之后,將程(cheng)序燒錄到(dao)芯片中進(jin)行(xing)測(ce)試。
模(mo)擬iic重(zhong)要是注意延時時間(jian)(jian)長短,因(yin)為(wei)iic總線時序(xu)是遵(zun)從仲裁制(zhi)度(du)的,如果從機的機器(qi)周期(qi)比(bi)較慢(man)的話,主(zhu)機延時太短就(jiu)會出問題,當(dang)然(ran)延時太長也(ye)不好,會導致數據傳輸速度(du)變慢(man),這(zhe)里就(jiu)需要去用(yong)示波(bo)器(qi)測(ce)試了(le)。其實有(you)時候也(ye)不用(yong)示波(bo)器(qi),網上關(guan)于(yu)各個芯片iic的操作很多,大家去借鑒(jian)一下就(jiu)可以,因(yin)為(wei)延時這(zhe)個東西雖(sui)然(ran)重(zhong)要,但(dan)是不難,所以不要浪費太多時間(jian)(jian)在這(zhe)里。
延時(shi)確(que)定以后,就可以按照嚴(yan)格(ge)的iic讀(du)寫(xie)(xie)時(shi)序去寫(xie)(xie)了,這(zhe)里我們列一(yi)個比較突出的案例(li)iic的eeprom操作時(shi)序來解(jie)析。
示(shi)意圖說明:示(shi)意圖分闡述了4種(zhong)不同的操作(zuo)方式,例如(ru)寫單(dan)(dan)(dan)個存(cun)儲(chu)單(dan)(dan)(dan)元(yuan)(yuan)(yuan),寫多個存(cun)儲(chu)單(dan)(dan)(dan)元(yuan)(yuan)(yuan),讀(du)單(dan)(dan)(dan)個存(cun)儲(chu)單(dan)(dan)(dan)元(yuan)(yuan)(yuan)和寫單(dan)(dan)(dan)個存(cun)儲(chu)單(dan)(dan)(dan)元(yuan)(yuan)(yuan)。對于單(dan)(dan)(dan)個操作(zuo)而言,上部為MCU通過(guo)I2C輸出(chu)的相關指令,下部為I2C設備的響應。例如(ru)寫單(dan)(dan)(dan)個存(cun)儲(chu)單(dan)(dan)(dan)元(yuan)(yuan)(yuan)操作(zuo)時,MCU發出(chu)I2C啟動,設備地址,寫標志位等,而I2C設備輸出(chu)多個ACK。
讀(du)寫如果按(an)照以上方式去(qu)寫的(de)話,結果還是未通(tong)信,讀(du)不出芯片內部的(de)數據。那(nei)就需要(yao)使(shi)用(yong)示波器(qi)去(qu)抓波形(xing)測量了(le),這里我說一個經常(chang)碰(peng)到的(de)問題(ti)。
在需要從芯片讀取多(duo)個字(zi)節的(de)時(shi)候,往往會讀不出(chu)來,在確定了起(qi)始信號和結束信號都沒問題(ti)之后,請(qing)確定應答和無應答位的(de)正確性。
什么(me)是(shi)無(wu)應答:
無(wu)應答為(wei)MCU發出(chu),無(wu)應答意為(wei)MCU不(bu)需要(yao)從(cong)機輸出(chu)數據,MCU將會(hui)停止本次I2C操作。需要(yao)說明的是(shi),無(wu)應答并不(bu)是(shi)一種異常情況。
所以(yi)在(zai)讀操作中,后一個數(shu)據(ju)讀取(qu)完成后需要主機發送一個無應(ying)答信號,告(gao)訴(su)從機數(shu)據(ju)已經(jing)讀取(qu)結束,不需要再讀了,發送完無應(ying)答信號后,發送停止(zhi)信號,釋放總(zong)線。
本人之前做的(de)msp430和zlg7290芯(xin)片通信,去讀(du)取顯示寄(ji)存器DpRam內容(rong)時(shi)(shi),就碰到(dao)過,可以往(wang)DpRam中(zhong)(zhong)寫數據,也可以從(cong)鍵(jian)值(zhi)寄(ji)存器讀(du)數據,但就是不能(neng)從(cong)DpRam中(zhong)(zhong)讀(du)數據,這(zhe)里就可以確定(ding),iic首先(xian)是建立通信成功了(le),只是時(shi)(shi)序未按照(zhao)(zhao)(zhao)規定(ding)時(shi)(shi)序來,使用示波(bo)器抓波(bo)后得知,讀(du)取多(duo)個字節操作源碼中(zhong)(zhong)應答(da)和無應答(da)的(de)操作寫反(fan)了(le),這(zhe)些(xie)問題比(bi)較瑣碎,需要抓波(bo)一個時(shi)(shi)鐘一個時(shi)(shi)鐘的(de)去對(dui)照(zhao)(zhao)(zhao),所以大家寫的(de)時(shi)(shi)候好找可靠的(de)資(zi)源去參(can)照(zhao)(zhao)(zhao),可以節省調試的(de)很多(duo)工(gong)作量(liang)。