IIC
1 概念
IIC(Inter-Integrated Circuit)內部集成電路;多主機總線,非全雙工
Pin:
SDA:串行數據線
SCL:串行時鐘線
concept:
同步:SCL時鐘線進行高低電平控制逐位仲裁
仲裁:多主機嘗試控制總線,但只允許其中一個控制總線且報文不被破壞的過程。
模式:標準(100Kbit/s) 快速模式(400Kbit/s) 高速模式(3.4Mbit/s)
最大電容:400pF
2 傳輸過程
主機A->叢機B
A尋址B -> A(發送器)發數據B(接收器) -> A終止
從機B->主機A
A尋址B -> A(接收器)收數據B(發送器) -> A終止
總結:A(start) -> A(address)B[→] ->A(data)B[⇆] -> A(ack)B[⇆] -> A(stop)
3 數據規範
按位傳輸
3.1 數據有效
SDA數據需要在SCL高電平時保持穩定(讀數據時,SCL電平爲高)
SDA數據切換需要SCL電平變爲低電平
3.2 起始停止條件(由主機控制)
起始:SCL高電平下,SDA由高切低 -> 忙狀態
停止:SCL高電平下,SDA由低切高 -> 空閒狀態
3.3 位規範
SDA每發送一字節,需跟一個響應位(每發一字節數據,需發送9位),MSB傳輸。
上圖爲主從機響應示意圖,由主機產生
- SDA在SCL高電平,器件保持低電平
- 從機不能響應(從機正在處理其它事件),從機SDA保持高電平(主機發送停止信號終止或重複起始信號開始新傳輸)
- 從機響應傳輸一段時間,不能再接收數據,主機必須終止傳輸(從機在第一個字節後沒有響應)
- 主機接收時,必須在從機不產生時鐘的最後一個字節不產生一個響應,向從機發送器通知數據結束,且從機釋放數據線,允許主機停止或重複
3.4 同步與仲裁(此概念重要)
3.4.1 同步
- 時鐘同步通過I2C接口到SCL;SCL變爲低電平->每個器件開始計數它們的低電平週期->此時器件會使SCL保持低電平狀態。
- 只要器件有一者仍處於低電平,SCL會一直保持下去,其它低電平週期短的器件進入高電平等待狀態。
- 所有器件釋放低電平後,時鐘線釋放變高電平,之後器件時鐘與SCL線狀態無差別。
- 器件開始計數高電平週期,首先完成高電平週期的器件會再次將SCL拉低。
- 總結:SCL低電平由低電平週期長的器件決定;SCL高電平週期由高電平週期短器件決定
- 此模式除用於仲裁,還可作爲握手使能接收器處理字節級或位級的快速數據傳輸。器件可以快速接收數據字節,但需要更多時間保存字節或準備下一字節,從機以握手過程在接收響應一個字節後使SCL保持低電平,迫使主機進入等待狀態,直到下一字節傳輸。在位級中,器件通過延長每個時鐘的低電平週期減慢總線時鐘,從而,任何主機的速度都可以適配這個器件的內部操作速率。
3.4.2 仲裁
- SCL線爲低電平時,仲裁在SDA發生
仲裁可以很多位:比較地址位(尋址相同,比較數據位、響應位) - 丟失仲裁的主機可以產生時鐘脈衝直至丟失仲裁的該字節末尾
- 主機結合從機功能時,丟失仲裁,可能成爲贏得仲裁主機在尋址的器件,此時主機必須切換到從機模式
- I2C總線控制只由地址或主機碼以及競爭主機發送的數據決定,沒有中央主機,總線也沒有任何優先權
- 仲裁不可進行情況:重複起始條件和數據位;停止條件和數據位;重複起始條件和停止條件
4 協議時序規範(編程所需重點)
本章不考慮10位尋址,只考慮7位尋址
4.1 寫時序
→ 主機發送start信號:SCL(1) SDA(1->0)
→ 7bit設備地址
→ 1bit確定是讀/寫(1/0):0
→ 1bit響應(從->主) :SDA(0)
(→ 寫設備內部寄存器地址→ 響應)
注:這裏發送command,相當於判別是讀寄存器還是寫寄存器,該值完全由slave決定
→ 8bit數據(主->從)+1bit響應(從->主) //n次
→ 主機發送stop信號:SCL(1) SDA(0->1)
4.2 讀時序
→ 主機發送start信號:SCL(1) SDA(1->0)
→ 7bit設備地址
→ 1bit確定是讀/寫(1/0):1(寫)
→ 1bit響應(從->主) :SDA(0)
(→ 讀設備內部寄存器地址 → 響應)
→ 7bit設備地址+1bit 確定讀寫:讀 + 1bit ACK
→ 8bit數據(主->從)+1bit響應(主->從) //n次
→ 主機發送stop信號:SCL(1) SDA(0->1)
5 其它
Q1:SDA如何實現雙向傳輸?
內部電路必然存在雙引腳(發送/接收)
Q2:主設備(從)發送數據時,從設備(主)發送引腳,不影響數據發送?
內部存在三極管
表1 真值表
A | B | SDA |
---|---|---|
0 | 0 | 1(上拉電阻決定) |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
下面解釋上拉電阻作用(I2C由於開漏輸出與上拉電阻簡化了協議設計):
- I2C設備掛載時,應實現“線與”特性,這是實現仲裁與時鐘同步的關鍵。
- 由於內部構成原因,一個輸出級爲漏極/集電極開路(開漏輸出),只能輸出低電平和高阻態(電阻很大,近似開路),也因此導致總線只受低電平影響(設備只能輸出低電平使用總線),從而完成“線與”功能。
- 而如何實現總線高電平,這需要上拉電阻,當總線空閒時,所有設備輸出高阻態,無法將總線拉高,這就需要上拉電阻進行拉高,使總線呈現高電平。
例如:ACK信號爲低電平,這是由於內部電路決定(主設備不驅動三極管,從設備也不驅動時,三極管截止,SDA由上拉電阻拉成高電平,從設備接收數據後,發響應信號,驅動三極管,使SDA變爲低電平)
上拉電阻對I2C協議的影響:
- 上拉電阻大小不是隨便用的!涉及到通信速率與功耗的取捨。協議層對電平的變化時間有嚴格的要求和限制,而電平的變化受總線電氣特性的影響。
- 對總線而言,上拉電阻越大,信號上升時間越長,通信速率越低,反之亦然。但阻值過小,總線低電平時電阻的大電流會增加電路功耗。