久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

i2c- sda掛死分析

 吳家小院 2012-06-18

i2c- sda掛死分析

I2C是由Philips公司發(fā)明的一種串行數(shù)據(jù)通信協(xié)議,僅使用兩根信號線:SerialClock(簡稱SCL)和 SerialData(簡稱SDA),。I2C是總線結(jié)構(gòu),,1個Master,1個或多個Slave,,各Slave設(shè)備以7位地址區(qū)分,,地址后面再跟1位讀 寫位,表示讀(=1)或者寫(=0),所以我們有時也可看到8位形式的設(shè)備地址,,此時每個設(shè)備有讀,、寫兩個地址,高7位地址其實是相同的,。
I2C數(shù)據(jù)格式如下:
無數(shù)據(jù):SCL=1,,SDA=1;
開始位(Start):當(dāng)SCL=1時,,SDA由1向0跳變,;
停止位(Stop):當(dāng)SCL=1時,SDA由0向1跳變,;
數(shù)據(jù)位:當(dāng)SCL由0向1跳變時,,由發(fā)送方控制SDA,此時SDA為有效數(shù)據(jù),,不可隨意改變SDA,;
當(dāng)SCL保持為0時,SDA上的數(shù)據(jù)可隨意改變,;
地址位:定義同數(shù)據(jù)位,,但只由Master發(fā)給Slave;
應(yīng)答位(ACK):當(dāng)發(fā)送方傳送完8位時,,發(fā)送方釋放SDA,,由接收方控制SDA,且SDA=0,;
否應(yīng)答位(NACK):當(dāng)發(fā)送方傳送完8位時,,發(fā)送方釋放SDA,由接收方控制SDA,,且SDA=1,。
當(dāng)數(shù)據(jù)為單字節(jié)傳送時,格式為:
開始位,,8位地址位(含1位讀寫位),,應(yīng)答,8位數(shù)據(jù),,應(yīng)答,,停止位。
當(dāng)數(shù)據(jù)為一串字節(jié)傳送時,,格式為:
開始位,,8位地址位(含1位讀寫位),應(yīng)答,,8位數(shù)據(jù),,應(yīng)答,,8位數(shù)據(jù),,應(yīng)答,,……,8位數(shù)據(jù),,應(yīng)答,,停止位。
需要注意的是:
1,,SCL一直由Master控制,,SDA依照數(shù)據(jù)傳送的方向,讀數(shù)據(jù)時由Slave控制SDA,,寫數(shù)據(jù)時由Master控制SDA,。當(dāng)8位數(shù)據(jù)傳送完畢之后,應(yīng)答位或者否應(yīng)答位的SDA控制權(quán)與數(shù)據(jù)位傳送時相反,。
2,,開始位“Start”和停止位“Stop”,只能由Master來發(fā)出,。
3,,地址的8位傳送完畢后,成功配置地址的Slave設(shè)備必須發(fā)送“ACK”,。否則否則一定時間之后Master視為超時,,將放棄數(shù)據(jù)傳送,發(fā)送“Stop”,。
4,, 當(dāng)寫數(shù)據(jù)的時候,Master每發(fā)送完8個數(shù)據(jù)位,,Slave設(shè)備如果還有空間接受下一個字節(jié)應(yīng)該回答“ACK”,,Slave設(shè)備如果沒有空間接受更多的 字節(jié)應(yīng)該回答“NACK”,Master當(dāng)收到“NACK”或者一定時間之后沒收到任何數(shù)據(jù)將視為超時,,此時Master放棄數(shù)據(jù)傳送,,發(fā)送 “Stop”。
5,,當(dāng)讀數(shù)據(jù)的時候,,Slave設(shè)備每發(fā)送完8個數(shù)據(jù)位,如果Master希望繼續(xù)讀下一個字節(jié),,Master應(yīng)該回答“ACK” 以提示Slave準(zhǔn)備下一個數(shù)據(jù),,如果Master不希望讀取更多字節(jié),Master應(yīng)該回答“NACK”以提示Slave設(shè)備準(zhǔn)備接收Stop信號,。
6,,當(dāng)Master速度過快Slave端來不及處理時,,Slave設(shè)備可以拉低SCL不放(SCL=0將發(fā)生“線與”)以阻止Master發(fā)送更多的數(shù)據(jù)。此時Master將視情況減慢或結(jié)束數(shù)據(jù)傳送,。
在實際應(yīng)用中,,并沒有強制規(guī)定數(shù)據(jù)接收方必須對于發(fā)送的8位數(shù)據(jù)做出回應(yīng),尤其是在Master和Slave端都是用GPIO軟件模擬的方法來 實現(xiàn)的情況下,,編程者可以事先約定數(shù)據(jù)傳送的長度,,slave不檢查NACK,有時可以起到減少系統(tǒng)開銷的效果,。但是如果slave方是硬件i2c要求一 定要標(biāo)準(zhǔn)的NACK,,master方是GPIO軟件模擬i2c并沒有正確的發(fā)送NACK,就會出現(xiàn)“slave收不到stop”導(dǎo)致i2c掛死,。
 
 在正常情況下,,I2C總線協(xié)議能夠保證總線正常的讀寫操作。但是,,當(dāng)I2C主設(shè)備異常復(fù)位時(看門狗動作,,板上電源異常導(dǎo)致復(fù)位芯片動作,手動按鈕復(fù)位等等)有可能導(dǎo)致I2C總線死鎖產(chǎn)生,。下面詳細(xì)說明一下總線死鎖產(chǎn)生的原因,。

    在I2C主設(shè)備進行讀寫操作的過程中.主設(shè)備在開始信號后控制SCL產(chǎn)生8個時鐘脈沖,然后拉低SCL信號為低電平,,在這個時候,,從設(shè)備輸出應(yīng)答信號,將SDA信號拉為低電平,。如果這個時候主設(shè)備異常復(fù)位,,SCL就會被釋放為高電平。此時,,如果從設(shè)備沒有復(fù)位,,就會繼續(xù)I2C的應(yīng)答,將SDA一直拉為低電平,,直到SCL變?yōu)榈碗娖?,才會結(jié)束應(yīng)答信號。 而對于I2C主設(shè)備來說.復(fù)位后檢測SCL和SDA信號,,如果發(fā)現(xiàn)SDA信號為低電平,,則會認(rèn)為I2C總線被占用,會一直等待SCL和SDA信號變?yōu)楦唠? 平,。這樣,,I2C主設(shè)備等待從設(shè)備釋放SDA信號,而同時I2C從設(shè)備又在等待主設(shè)備將SCL信號拉低以釋放應(yīng)答信號,,兩者相互等待,,I2C總線進人一種 死鎖狀態(tài),。同樣,當(dāng)I2C進行讀操作,,I2C從設(shè)備應(yīng)答后輸出數(shù)據(jù),,如果在這個時刻I2C主設(shè)備異常復(fù)位而此時I2C從設(shè)備輸出的數(shù)據(jù)位正好為0,也會導(dǎo) 致I2C總線進入死鎖狀態(tài),。

 方法

    (1)盡量選用帶復(fù)位輸人的I2C從器件,。

    (2)將所有的從I2C設(shè)備的電源連接在一起,通過MOS管連接到主電源,,而MOS管的導(dǎo)通關(guān)斷由I2C主設(shè)備來實現(xiàn)。
    (3)在I2C從設(shè)備設(shè)計看門狗的功能,。

    (4)在I2C主設(shè)備中增加I2C總線恢復(fù)程序,。

        每次I2C主設(shè)備復(fù)位后,如果檢測到SDA數(shù)據(jù)線被拉低,,則控制I2C中的SCL時鐘線產(chǎn)生9個時鐘脈沖(針對8位數(shù)據(jù)的情況,,“9個clk可以激活”的方法來自NXP的文檔,NXP(Philips)作為I2C總線的鼻祖,,這樣的說法是可信的),,這樣I2C從設(shè)備就可以完成被掛起的讀操作,從死鎖狀態(tài)中恢復(fù)過來,。


 

        這種方法有很大的局限性,,因為大部分主設(shè)備的I2C模塊由內(nèi)置的硬件電路來實現(xiàn),軟件并不能夠直接控制SCL信號模擬產(chǎn)生需要時鐘脈沖,。

        或者,,發(fā)送I2C_Stop條件也能讓從設(shè)備釋放總線。

        如果是GPIO模擬I2C總線實現(xiàn),,那么在I2C操作之前,,加入I2C總線狀態(tài)檢測 I2C_Probe ,如果總線被占用,,則可嘗試恢復(fù)總線,,待總線釋放后,再進行操作,。要保證I2C操作最小單元的完整性,,不被其他事件(中斷、高優(yōu)先級線程,,等)打斷,。

  (5)在I2C總線上增加一個額外的總線恢復(fù)設(shè)備。這個設(shè)備監(jiān)視I2C總線,。當(dāng)設(shè)備檢測到SDA信號被拉低超過指定時間時,,就在SCL總線上產(chǎn)生9個時鐘 脈沖,,使I2C從設(shè)備完成讀操作,從死鎖狀態(tài)上恢復(fù)出來,??偩€恢復(fù)設(shè)備需要有具有編程功能,一般可以用單片機或CPLD實現(xiàn)這一功能,。

  (6)在I2C上串人一個具有死鎖恢復(fù)的I2C緩沖器,,如Linear公司的LTC4307是一個雙向的I2C總線緩沖器,并且具有I2C總線死鎖恢復(fù)的功能,。LTC4307總線輸入側(cè)連接主設(shè)備,,總線輸出側(cè)連接所有從設(shè)備。當(dāng)LTC4307檢測到輸出側(cè)SDA或SCL信號被拉低30ms時,,就自動斷開I2C總線輸入側(cè)與輸出側(cè)的連接.并且在輸出側(cè)SCL信號上產(chǎn)生16個時鐘脈沖來釋放總線,。當(dāng)總線成功恢復(fù)后,LTC4307會再次連接輸入輸出側(cè),,使總線能夠正常工作,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多