總線空閑狀態(tài)
I2C總線總線的SDA和SCL兩條信號線同時處于高電平時,規(guī)定為總線的空閑狀態(tài)。此時各個器件的輸出級場效應(yīng)管均處在截止?fàn)顟B(tài),即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。
啟動信號
在時鐘線SCL保持高電平期間,數(shù)據(jù)線SDA上的電平被拉低(即負(fù)跳變),定義為I2C總線總線的啟動信號,它標(biāo)志著一次數(shù)據(jù)傳輸?shù)拈_始。啟動信號是一種電平跳變時序信號,而不是一個電平信號。啟動信號是由主控器主動建立的,在建立該信號之前I2C總線必須處于空閑狀態(tài)。
重啟動信號
在主控器控制總線期間完成了一次數(shù)據(jù)通信(發(fā)送或接收)之后,如果想繼續(xù)占用總線再進行一次數(shù)據(jù)通信(發(fā)送或接收),而又不釋放總線,就需要利用重啟動Sr信號時序。重啟動信號Sr既作為前一次數(shù)據(jù)傳輸?shù)慕Y(jié)束,又作為后一次數(shù)據(jù)傳輸?shù)拈_始。利用重啟動信號的優(yōu)點是,在前后兩次通信之間主控器不需要釋放總線,這樣就不會丟失總線的控制權(quán),即不讓其他主器件節(jié)點搶占總線。
重啟動信號
在主控器控制總線期間完成了一次數(shù)據(jù)通信(發(fā)送或接收)之后,如果想繼續(xù)占用總線再進行一次數(shù)據(jù)通信(發(fā)送或接收),而又不釋放總線,就需要利用重啟動Sr信號時序。重啟動信號Sr既作為前一次數(shù)據(jù)傳輸?shù)慕Y(jié)束,又作為后一次數(shù)據(jù)傳輸?shù)拈_始。利用重啟動信號的優(yōu)點是,在前后兩次通信之間主控器不需要釋放總線,這樣就不會丟失總線的控制權(quán),即不讓其他主器件節(jié)點搶占總線。
停止信號
在時鐘線SCL保持高電平期間,數(shù)據(jù)線SDA被釋放,使得SDA返回高電平(即正跳變),稱為I2C總線的停止信號,它標(biāo)志著一次數(shù)據(jù)傳輸?shù)慕K止。停止信號也是一種電平跳變時序信號,而不是一個電平信號,停止信號也是由主控器主動建立的,建立該信號之后,I2C總線將返回空閑狀態(tài)。
不是在數(shù)據(jù)有效性中規(guī)定在SDA只能在SCL的低電平的時候變化,為何STAR,STOP不一樣?首先STAR和STOP不是數(shù)據(jù),所以可以不遵守數(shù)據(jù)有效性中的規(guī)定,其它數(shù)據(jù)都遵守,而STAR和STOP“不遵守”導(dǎo)致STAR和STOP更容易被識別。這樣不是不遵守而是更有優(yōu)勢。
起始和停止條件一般由主機產(chǎn)生,總線在起始條件后被認(rèn)為處于忙的狀態(tài),在停止條件的某段時間后總線被認(rèn)為再次處于空閑狀態(tài)。
如果產(chǎn)生重復(fù)起始(Sr) 條件而不產(chǎn)生停止條件,總線會一直處于忙的狀態(tài)。此時的起始條件(S)和重復(fù)起始(Sr) 條件在功能上是一樣的。
如果連接到總線的器件合并了必要的接口硬件,那么用它們檢測起始和停止條件十分簡便。但是沒有這種接口的微控制器在每個時鐘周期至少要采樣SDA 線兩次來判別有沒有發(fā)生電平切換。
數(shù)據(jù)位傳送
在I2C總線上傳送的每一位數(shù)據(jù)都有一個時鐘脈沖相對應(yīng)(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位數(shù)據(jù)。進行數(shù)據(jù)傳送時,在SCL呈現(xiàn)高電平期間,SDA上的電平必須保持穩(wěn)定,低電平為數(shù)據(jù)0,高電平為數(shù)據(jù)1。只有在SCL為低電平期間,才允許SDA上的電平改變狀態(tài)。邏輯0的電平為低電壓,而邏輯1的電平取決于器件本身的正電源電壓VDD(當(dāng)使用獨立電源時)。數(shù)據(jù)位的傳輸是邊沿觸發(fā)。
應(yīng)答信號
I2C總線上的所有數(shù)據(jù)都是以8位字節(jié)傳送的,發(fā)送器每發(fā)送一個字節(jié),就在時鐘脈沖9期間釋放數(shù)據(jù)線,由接收器反饋一個應(yīng)答信號。 應(yīng)答信號為低電平時,規(guī)定為有效應(yīng)答位(ACK簡稱應(yīng)答位),表示接收器已經(jīng)成功地接收了該字節(jié);應(yīng)答信號為高電平時,規(guī)定為非應(yīng)答位(NACK),一般表示接收器接收該字節(jié)沒有成功。 對于反饋有效應(yīng)答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩(wěn)定的低電平。 如果接收器是主控器,則在它收到最后一個字節(jié)后,發(fā)送一個NACK信號,以通知被控發(fā)送器結(jié)束數(shù)據(jù)發(fā)送,并釋放SDA線,以便主控接收器發(fā)送一個停止信號P。
插入等待時間
如果被控器需要延遲下一個數(shù)據(jù)字節(jié)開始傳送的時間,則可以通過把時鐘線SCL電平拉低并且保持,使主控器進入等待狀態(tài)。一旦被控器釋放時鐘線,數(shù)據(jù)傳輸就得以繼續(xù)下去,這樣就使得被控器得到足夠時間轉(zhuǎn)移已經(jīng)收到的數(shù)據(jù)字節(jié),或者準(zhǔn)備好即將發(fā)送的數(shù)據(jù)字節(jié)。帶有CPU的被控器在對收到的地址字節(jié)做出應(yīng)答之后,需要一定的時間去執(zhí)行中斷服務(wù)子程序,來分析或比較地址碼,其間就把SCL線鉗位在低電平上,直到處理妥當(dāng)后才釋放SCL線,進而使主控器繼續(xù)后續(xù)數(shù)據(jù)字節(jié)的發(fā)送。
總線封鎖狀態(tài)
在特殊情況下,如果需要禁止所有發(fā)生在I2C總線上的通信活動,封鎖或關(guān)閉總線是一種可行途徑,只要掛接于該總線上的任意一個器件將時鐘線SCL鎖定在低電平上即可。
總線競爭的仲裁
總線上可能掛接有多個器件,有時會發(fā)生兩個或多個主器件同時想占用總線的情況,這種情況叫做總線競爭。I2C總線具有多主控能力,可以對發(fā)生在SDA線上的總線競爭進行仲裁,其仲裁原則是這樣的:當(dāng)多個主器件同時想占用總線時,如果某個主器件發(fā)送高電平,而另一個主器件發(fā)送低電平,則發(fā)送電平與此時SDA總線電平不符的那個器件將自動關(guān)閉其輸出級??偩€競爭的仲裁是在兩個層次上進行的。首先是地址位的比較,如果主器件尋址同一個從器件,則進入數(shù)據(jù)位的比較,從而確保了競爭仲裁的可靠性。由于是利用I2C總線上的信息進行仲裁,因此不會造成信息的丟失。
為何識別到“0”將丟失仲裁呢?因為對于OD門,只能驅(qū)動到低電平,釋放總線只能通過不驅(qū)動總線釋放,停止驅(qū)動即產(chǎn)生“1”,但是發(fā)現(xiàn)總線還是“0”,這說明還有主機在跟自己競爭總線使用權(quán),自己線驅(qū)動到“1”,確檢測到“0”,那代表自己已經(jīng)失去了仲裁。
主機只能在總線空閑的時侯啟動傳送。兩個或多個主機可能在起始條件的最小持續(xù)時間tHD;STA 內(nèi)產(chǎn)生一個起始條件,結(jié)果在總線上產(chǎn)生一個規(guī)定的起始條件。
當(dāng)SCL 線是高電平時,仲裁在SDA 線發(fā)生;這樣,在其他主機發(fā)送低電平時,發(fā)送高電平的主機將斷開它的數(shù)據(jù)輸出級,因為總線上的電平與它自己的電平不相同。然后,進一步獲得其的判定條件:
仲裁可以持續(xù)多位。首先是比較地址位。如果每個主機都試圖尋址同一的器件,仲裁會繼續(xù)比較數(shù)據(jù)位(假設(shè)主機是發(fā)送器),或者比較響應(yīng)位(假設(shè)主機是接收器)。
I2C 總線的地址和數(shù)據(jù)信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機可以產(chǎn)生時鐘脈沖直到丟失仲裁的該字節(jié)末尾。
在串行傳輸過程中時,一旦有重復(fù)的起始條件或停止條件發(fā)送到I2C 總線的時侯,仲裁過程仍在進行。如果可能產(chǎn)生這樣的情況,有關(guān)的主機必須在幀格式相同位置發(fā)送這個重復(fù)起始條件或停止條件。
此外,如果主機也結(jié)合了從機功能,而且在尋址階段丟失仲裁,它很可能就是贏得仲裁的主機在尋址的器件。那么,丟失仲裁的主機必須立即切換到它的從機模式。
I2C 總線的控制只由地址或主機碼以及競爭主機發(fā)送的數(shù)據(jù)決定,沒有中央主機,總線也沒有任何定制的優(yōu)先權(quán)。
上圖顯示了兩個主機的仲裁過程當(dāng)然可能包含更多的內(nèi)容由連接到總線的主機數(shù)量決定此時產(chǎn)生DATA1 的主機的內(nèi)部數(shù)據(jù)電平與SDA 線的實際電平有一些差別如果關(guān)斷數(shù)據(jù)輸出這就意味著總線連接了一個高輸出電平這不會影響由贏得仲裁的主機初始化的數(shù)據(jù)傳輸。
時鐘信號的同步
在I2C總線上傳送信息時的時鐘同步信號是由掛接在SCL線上的所有器件的邏輯“與”完成的。SCL線上由高電平到低電平的跳變將影響到這些器件,一旦某個器件的時鐘信號下跳為低電平,將使SCL線一直保持低電平,使SCL線上的所有器件開始低電平期。此時,低電平周期短的器件的時鐘由低至高的跳變并不能影響SCL線的狀態(tài),于是這些器件將進入高電平等待的狀態(tài)。當(dāng)所有器件的時鐘信號都上跳為高電平時,低電平期結(jié)束,SCL線被釋放返回高電平,即所有的器件都同時開始它們的高電平期。其后,第一個結(jié)束高電平期的器件又將SCL線拉成低電平。這樣就在SCL線上產(chǎn)生一個同步時鐘??梢?,時鐘低電平時間由時鐘低電平期最長的器件確定,而時鐘高電平時間由時鐘高電平期最短的器件確定。
-
I2C
+關(guān)注
關(guān)注
28文章
1477瀏覽量
123098 -
時鐘信號
+關(guān)注
關(guān)注
4文章
443瀏覽量
28493
原文標(biāo)題:I2C總線信號時序總結(jié)
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論