I2C之知(三)--I2C總線(xiàn)的字節格式、時(shí)鐘同步和仲裁
發(fā)送到SDA線(xiàn)上的每個(gè)字節必須是8位.每次傳輸的字節數量是不受限制的.每個(gè)字節后必須跟著(zhù)一個(gè)ACK應答位.數據從最高有效位(MSB)開(kāi)始傳輸.如果從機要執行一些功能后才能接收或者發(fā)送新的完整數據,比如說(shuō)服務(wù)一個(gè)內部中斷,那么它可以將時(shí)鐘線(xiàn)SCL拉低來(lái)強制使主機進(jìn)入wait狀態(tài).當從機準備好新的字節數據傳輸時(shí),釋放時(shí)鐘線(xiàn)SCL,數據傳輸便繼續進(jìn)行.

ACK和NACK
每個(gè)字節后都有ACK發(fā)生.ACK應答位允許接收器通知發(fā)送器字節成功接收了下一個(gè)字節可以發(fā)送了.主機產(chǎn)生所有的時(shí)鐘脈沖,包括應答位的第9個(gè)時(shí)鐘脈沖.
ACK應答信號是如下定義的:在A(yíng)CK的第9個(gè)時(shí)鐘脈沖中發(fā)送器釋放SDA線(xiàn),所以接收器可以將SDA拉低,使得在這個(gè)時(shí)鐘脈沖的高電平期間保證SDA是低電平.建立和保持時(shí)間也應該計算在內.
當在第9個(gè)時(shí)鐘脈沖期間SDA仍然是高,這時(shí)定義為NACK信號.這時(shí)主機可以產(chǎn)生一個(gè)終止條件來(lái)終止傳輸,或者一個(gè)重復的開(kāi)始條件來(lái)開(kāi)始一個(gè)新的傳輸.這里有5中情況導致NACK的產(chǎn)生:
1.總線(xiàn)當前的傳輸地址上沒(méi)有接收器,所以沒(méi)有設備用ACK來(lái)響應.
2.因為接收者正在處理一些實(shí)時(shí)的功能,尚未準備與主機的通信,所以接收者不能收發(fā).
3.在傳輸期間,接收者收到不能識別的數據或者命令.
4.在傳輸期間,接收者無(wú)法接收更多的數據字節.
5.主-接收器要通知從-發(fā)送器傳輸的結束.
時(shí)鐘同步
在空閑總線(xiàn)上兩個(gè)主機可以同時(shí)開(kāi)始傳輸,所以必須要有一個(gè)方法來(lái)決定哪個(gè)主機來(lái)控制總線(xiàn)并完成其數據傳輸.這個(gè)方法就是時(shí)鐘同步和仲裁.在單主機系統中,時(shí)鐘同步和仲裁不需要了.
時(shí)鐘同步通過(guò)使用I2C接口與SCL線(xiàn)的線(xiàn)與連接實(shí)現.意味著(zhù)SCL線(xiàn)從高到低期間會(huì )引起主機開(kāi)始計算它的低電平周期,一旦主機時(shí)鐘變低,它會(huì )保持SCL線(xiàn)處于這種狀態(tài)直到時(shí)鐘到達高電平.然而,如果另一個(gè)時(shí)鐘依舊是低電平,時(shí)鐘的從低到高的變化并不會(huì )改變SCL線(xiàn)的狀態(tài).SCL拉低的時(shí)間由最長(cháng)的低電平周期決定.短一些的低電平周期的主機在這時(shí)進(jìn)入HIGH wait-state.

當所有的主機的低電平周期都結束了,時(shí)鐘線(xiàn)才回到高電平.這時(shí)主機時(shí)鐘和SCL的狀態(tài)一致,所有的主機開(kāi)始計數他們的高電平周期.第一個(gè)結束高電平的主機將SCL線(xiàn)重新拉低.
這樣的話(huà),同步的SCL時(shí)鐘的低電平周期由所有主機中最長(cháng)的低電平周期決定,高電平周期由最短的高電平周期決定.
仲裁
仲裁和同步一樣,都是在系統中多于一個(gè)主機條件下協(xié)議要求的一部分.從機不參與仲裁處理.只有當總線(xiàn)空閑時(shí),主機才可以開(kāi)始一個(gè)傳輸.兩個(gè)主機可能在開(kāi)始條件規定的最小保持時(shí)間(tHD;SDA)內產(chǎn)生一個(gè)開(kāi)始條件,結果總線(xiàn)上產(chǎn)生一個(gè)有效的開(kāi)始條件.這個(gè)時(shí)候就需要仲裁來(lái)決定哪個(gè)主機完成它的傳輸.
仲裁處理是逐個(gè)bit進(jìn)行的.在每個(gè)bit,當SCL為高,每個(gè)主機都check一下來(lái)看看SDA的電平是否和它發(fā)送的電平吻合.這個(gè)過(guò)程可能會(huì )持續很多個(gè)bit.只要傳輸是同一的,那么兩個(gè)主機可以無(wú)誤的完成完整的傳輸.當一個(gè)主機試著(zhù)發(fā)送高,但是檢測到SDA為低,那么這個(gè)主機知道自己失去仲裁然后關(guān)掉自己的SDA輸出.另外的主機就會(huì )去完成它的傳輸.
在仲裁處理過(guò)程中沒(méi)有信息丟失.失去仲裁的主機在它失去仲裁的字節末尾處產(chǎn)生時(shí)鐘脈沖,當總線(xiàn)空閑時(shí)必須重啟它的傳輸.
如果一個(gè)主機包含從機的功能,當它在尋址階段丟失仲裁,那么贏(yíng)得仲裁的主機可能會(huì )尋址它.丟失仲裁的主機必須立即切換到它的從模式.
下圖顯示了兩個(gè)主機的仲裁處理.在主機產(chǎn)生的DATA1和SDA線(xiàn)的實(shí)際電平的值出現不同時(shí),DATA1的輸出就關(guān)掉了.主機1失去了仲裁.贏(yíng)得仲裁的主機2的傳輸數據不受影響.

因為I2C總線(xiàn)只是僅由地址來(lái)控制,數據只由贏(yíng)得仲裁的主機發(fā)送,這里沒(méi)有最重要的主機,在總線(xiàn)上也沒(méi)有優(yōu)先級順序.
在仲裁處理正在進(jìn)行的時(shí)候,一個(gè)主機發(fā)送重復的開(kāi)始條件或者是終止條件而另一個(gè)主機仍然在發(fā)送數據,那么這時(shí)候有一個(gè)未定的狀態(tài).換句話(huà)說(shuō),下面的條件下會(huì )出現這種情況:
主機1發(fā)送重復的開(kāi)始條件,主機2發(fā)送一個(gè)數據位
主機1發(fā)送終止條件,主機2發(fā)送一個(gè)數據位
主機1發(fā)送重復的開(kāi)始條件,主機2發(fā)送終止條件
評論