如何檢測I2C的開始條件和結(jié)束條件:
開始條件檢測:
?。?)盡量選用帶復(fù)位輸人的I2C從器件,從I2C總線死鎖產(chǎn)生的原因可以發(fā)現(xiàn)I2C總線死鎖的一個必要條件是主設(shè)備復(fù)位了而從設(shè)備沒有復(fù)位。
如果從設(shè)備選用帶復(fù)位輸入的芯片,將主從設(shè)備的復(fù)位信號連接在一起,當(dāng)外部產(chǎn)生復(fù)位事件時,主從設(shè)備同時復(fù)位,這樣就不會發(fā)生I2C總線死鎖現(xiàn)象了。
這種方法的缺點也是顯而易見的,首先,大部分I2C從器件都沒有復(fù)位輸入,器件選型受到了很大的限制;其次,這種對于主設(shè)備集成看門狗引起的復(fù)位也沒有效果。
?。?)將所有的從I2C設(shè)備的電源連接在一起,通過M0S管連接到主電源,而MOS管的導(dǎo)通關(guān)斷由I2C主設(shè)備來實現(xiàn)一般來說,I2C主設(shè)備都是具有運算單元的處理器??刂乒δ芸梢酝ㄟ^處理器的GPIO來實現(xiàn)。
每次主設(shè)備復(fù)位時,運行程序控制GPIO關(guān)斷MOS,使從設(shè)備失去電源。然后延時一段時間后再導(dǎo)通MOS管,給從設(shè)備上電,從而達到讓從設(shè)備強制復(fù)位的效果。
這種方法能彌補第一種方法的不足,但是會增加電源設(shè)計的復(fù)雜性,影響Layout設(shè)計時電源的完整性;同時還需要更改處理器的底層boot代碼,影響底層軟件的通用性和可移植性。
結(jié)束條件檢測:
在I2C主設(shè)備中增加I2C總線恢復(fù)程序。
每次I2C主設(shè)備復(fù)位后,如果檢測到SDA數(shù)據(jù)線被拉低,則控制I2C中的SCL時鐘線產(chǎn)生9個時鐘脈沖(針對8位數(shù)據(jù)的情況),這樣I2C從設(shè)備就可以完成被掛起的讀操作,從死鎖狀態(tài)中恢復(fù)過來。
這種方法有很大的局限性,因為大部分主設(shè)備的I2C模塊由內(nèi)置的硬件電路來實現(xiàn)。軟件并不能夠直接控制SCL信號模擬產(chǎn)生需要時鐘脈沖。使用此種方法可以使用IO模擬I2C,SCL時鐘易控制。
I2C總線SDA\SCL以及開始終止條件
I2C只用兩條線(SDA和SCL)在連接到總線上的設(shè)備之間傳送數(shù)據(jù)。每一個設(shè)備都由唯一的地址來識別(不管是微處理器、LCD驅(qū)動器、存儲器或者鍵盤接口),并且可以依照設(shè)備的功能作為發(fā)送器或者接收器使用.LCD驅(qū)動器可能只是個接收器,而存儲器可以發(fā)送和接受數(shù)據(jù)。除了發(fā)送器和接收器,當(dāng)傳送數(shù)據(jù)時設(shè)備還可以作為主機或者從機。主機就是初始化數(shù)據(jù)傳輸和產(chǎn)生時鐘信號的設(shè)備,在那個時刻,任何被尋址的設(shè)備都是從機。
I2C總線是一個多主機總線。意味著可以連接多個可以控制總線的設(shè)備到總線上。主機通常是微控制器,我們可以考慮以下兩個連接到總線上的微處理器之間的數(shù)據(jù)傳輸?shù)那闆r。
這個例子中突出了I2C總線中的主從和接收器-發(fā)送器之間的關(guān)系。注意這些關(guān)系不是固定的,僅依賴于當(dāng)前時刻數(shù)據(jù)傳輸?shù)姆较颉?shù)據(jù)傳輸?shù)倪^程如下:
1.假定微控制器A向微控制器B發(fā)送數(shù)據(jù)
微控制器A(主機)尋址微控制器B(從機)
微控制器A(主機-發(fā)送器)發(fā)送數(shù)據(jù)到微控制器B(從機-接收器)
微控制器A結(jié)束數(shù)據(jù)傳輸
2.假定微控制器A從微控制器B接收數(shù)據(jù)
微控制器A(主機)尋址微控制器B(從機)
微控制器A(主機-接收器)從微控制器B(從機-發(fā)送器)接收數(shù)據(jù)
微控制器A結(jié)束數(shù)據(jù)傳輸
甚至在這種情況下,主機(微控制器A)產(chǎn)生時序并終止傳輸。
在多個微控制器連接到I2C總線上時意味著可能有多個主機嘗試初始化數(shù)據(jù)傳輸。為了避免由此引發(fā)的混亂,設(shè)計了一個仲裁機制。它依靠線與邏輯連接所有I2C接口道I2C總線。
如果有多個主機嘗試發(fā)送信息到總線上,在其它產(chǎn)生“0”的情況下,首先產(chǎn)生“1”的主機會丟擲仲裁。仲裁時的時鐘信號是用線與連接到SCL線的主機產(chǎn)生的時鐘的同步結(jié)合。
I2C總線上的主機設(shè)備通常負責(zé)產(chǎn)生時鐘,當(dāng)傳輸數(shù)據(jù)時每個主機產(chǎn)生自己的時鐘信號。只有在低速從設(shè)備控制時鐘線或者仲裁發(fā)生時,主機的總線時鐘才會被改變。
下表總結(jié)了I2C總線中的一些配置選擇:
?。?]這里也指被當(dāng)作從機的主機
?。?]時鐘拉伸是部分從機的特性。如果在系統(tǒng)中沒有從機可以拉伸時鐘(將SCL拉低),主機一定需要設(shè)計處理程序
?。?]‘Bit banging’(軟件模擬)多個主機系統(tǒng)應(yīng)該考慮START字節(jié)
SDA和SCL信號
SDA和SCL都是雙向線路,通過電流源或者上拉電阻連接到一個正向電壓。(見下圖)當(dāng)總線空閑時,兩條線都是高電平。連接到總線的設(shè)備的輸出級必須是OD(漏極開路)或者OC(集電極開路)門才能執(zhí)行線與功能。在標(biāo)準(zhǔn)模式下I2C總線傳輸數(shù)據(jù)可以達到100kb/s的速度,而在快速模式下達到400kb/s的速度,快速plus模式下是1Mb/s的速度,告訴模式下是3.4Mb/s的速度??偩€的電容限制連接到總線上的接口數(shù)量。
對于一個單一主機的應(yīng)用,如果總線上沒有設(shè)備可以拉低時鐘那么主機的SCL輸出應(yīng)該是push-pull(推挽)驅(qū)動設(shè)計。
SDA和SCL的邏輯電平
由于有各種不同的工藝的設(shè)備(CMOS NMOS 雙極性)可以連接到I2C總線,低電平和高電平不是固定的而是依賴于相對應(yīng)的VDD的電平。
數(shù)據(jù)有效性
在時鐘為高期間SDA線上的數(shù)據(jù)必須穩(wěn)定。只有在SCL線上的時鐘信號低時數(shù)據(jù)線才可以改變高低狀態(tài)。每個數(shù)據(jù)位傳輸都需要一個時鐘產(chǎn)生。
開始和終止條件
所有的傳輸都由一個START(S)開始,有一個STOP(P)終止。
START條件是當(dāng)SCL高時SDA從高到低
STOP條件是SCL高時SDA從低到高
開始條件和終止條件一直由主機產(chǎn)生。在開始條件后總線就處于忙狀態(tài)。在終止條件后隔上一個固定時間總線就處于空閑狀態(tài)。如果沒有終止條件產(chǎn)生,而是一個重復(fù)的開始條件(Sr),那總線依舊是忙狀態(tài)。這種情況下S和Sr在功能上是一樣的。
如果連接到總線的設(shè)備包含了必須的接口硬件那么開始條件和終止條件的檢測時很容易的。但是沒有這樣接口的微控制器在每個時鐘周期內(nèi)至少要采樣兩次SDA線來識別有沒有電平變化.
評論
查看更多