I2C總線的仲裁問題
【問】有網(wǎng)友問關(guān)于I2C總線的仲裁問題:
The I2C-bus specification的第13頁有這樣的話:
In other words, arbitration isn’t allowed between:
* A repeated START condition and a data bit
* A STOP condition and a data bit
* A repeated START condition and a STOP condition.
Slaves are not involved in the arbitration procedure.
我現(xiàn)在遇到了一個問題,假設(shè)說有兩臺主機A和B同時發(fā)送數(shù)據(jù)給C,但是A發(fā)送一個字節(jié)的數(shù)據(jù),B發(fā)送兩個字節(jié)的數(shù)據(jù)。并且他們第一個字節(jié)的數(shù)據(jù)都相同。即A 發(fā)送的是" start+C地址+字節(jié)1+stop",B發(fā)送的數(shù)據(jù)是"start+C地址+字節(jié)1+字節(jié)2+stop".由于第一個字節(jié)相同所以在第一個字節(jié)傳送完后仲裁過程沒有結(jié)束。這就遇到了規(guī)范上所講到的一個停止位和一個數(shù)據(jù)位的情況,那么是不應(yīng)該發(fā)生仲裁的。如果說B發(fā)送的第二個字節(jié)的第一位是1,那么“線與”后SCL和SDA線實際上就表示了stop信號,如果不仲裁則B繼續(xù)發(fā)數(shù)據(jù),而此前C已經(jīng)收到了一個停止信號。C停止了,那么B所發(fā)送的第二個字節(jié)的數(shù)據(jù)根本就沒有成功。有那位大蝦可以幫我解釋一下,應(yīng)該怎么辦。多謝了。另外如果兩個主機,一個發(fā)送停止條件,一個發(fā)送重復(fù)起始條件,如果不仲裁,總的效果就是產(chǎn)生一個低電平的數(shù)據(jù),那么從機就會把這個數(shù)據(jù)接收過去,但事實上這并不是兩個主機期望發(fā)送的數(shù)據(jù),I2C總線的時序就亂了。
【答】I2C規(guī)范的這段話的含義可以譯為:
也就是說,仲裁不能在下面情況之間進行:
* 重復(fù)起始條件和數(shù)據(jù)位。
* 停止條件和數(shù)據(jù)位。
* 重復(fù)起始條件和停止條件。
從機不被卷入仲裁過程。
翻閱《I2C總線規(guī)范》,對于I2C總線的仲裁有比較詳細(xì)地論述。個人認(rèn)為需要明白其的先決條件:
1、I2C總線的控制只由地址或主機碼以及競爭主機發(fā)送的數(shù)據(jù)決定,沒有中央主機,總線也沒有任何定制的優(yōu)先權(quán)。
2、主機只能在總線空閑的時侯啟動傳送。兩個或多個主機可能在起始條件的最小持續(xù)時間tHD;STA內(nèi)產(chǎn)生一個起始條件,結(jié)果在總線上產(chǎn)生一個規(guī)定的起始條件。
3、當(dāng)SCL線是高電平時,仲裁在SDA 線發(fā)生;這樣,在其他主機發(fā)送低電平時,發(fā)送高電平的主機將斷開它的數(shù)據(jù)輸出級,因為總線上的電平與它自己的電平不相同。
然后,進一步獲得其的判定條件:
1、仲裁可以持續(xù)多位。首先是比較地址位。如果每個主機都試圖尋址同一的器件,仲裁會繼續(xù)比較數(shù)據(jù)位(假設(shè)主機是發(fā)送器),或者比較響應(yīng)位(假設(shè)主機是接收器)。
2、I2C總線的地址和數(shù)據(jù)信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機可以產(chǎn)生時鐘脈沖直到丟失仲裁的該字節(jié)末尾。
3、在串行傳輸過程中時,一旦有重復(fù)的起始條件或停止條件發(fā)送到I2C總線的時侯,仲裁過程仍在進行。如果可能產(chǎn)生這樣的情況,有關(guān)的主機必須在幀格式相同位置發(fā)送這個重復(fù)起始條件或停止條件,也就是開始那段話的含義。
4、此外,如果主機也結(jié)合了從機功能,而且在尋址階段丟失仲裁,它很可能就是贏得仲裁的主機在尋址的器件。那么,丟失仲裁的主機必須立即切換到它的從機模式
編輯:admin 最后修改時間:2019-07-31