4、I2C Synchronization And Arbitration
本文講解三個(gè)重要的 I2C 概念:時(shí)鐘延展、同步、仲裁
Data and ACK/NACK
正常情況
主接收機(jī)必須向從機(jī)發(fā)送傳輸結(jié)束的信號(hào)。
異常情況
- 發(fā)送到總線上的地址,卻沒有匹配的從機(jī)從機(jī)處于 busy 狀態(tài)。在傳輸過程中,從機(jī)獲取其不理解的數(shù)據(jù)或命令。在傳輸過程中,從機(jī)無法再接收任何數(shù)據(jù)字節(jié)。
主機(jī)可以生成停止條件以中止傳輸,或生成重復(fù)啟動(dòng)條件以啟動(dòng)新傳輸。
Clock stretching 時(shí)鐘延展
- 時(shí)鐘延展:通過將 SCL 線保持在低電平來暫停傳輸。在 SCL 再次拉高之前,傳輸無法進(jìn)行。從機(jī)通過將 SCL 線拉低,強(qiáng)制主機(jī)進(jìn)入等待狀態(tài)。時(shí)鐘延展功能是可選的,不是必選的時(shí)鐘延展導(dǎo)致需要更多時(shí)間來存儲(chǔ)接收到的字節(jié)或準(zhǔn)備另一個(gè)要傳輸?shù)淖止?jié)通過延長每個(gè)時(shí)鐘低電平周期來降低總線時(shí)鐘。任何主機(jī)的速度都與該設(shè)備的內(nèi)部運(yùn)行速度相適應(yīng)。在 Hs 模式下,此握手功能只能在字節(jié)級(jí)別使用
I2C 主設(shè)備始終控制著時(shí)鐘線 SCL,不論是往設(shè)備寫還是從設(shè)備讀。一般情況下,如果操作對(duì)象是 EEPROM 或者其他簡單設(shè)備而言,無所謂,但是,如果從設(shè)備是處理器,在接到主機(jī)命令后要去處理一些運(yùn)算然后得出結(jié)果返回給主機(jī)。這個(gè)時(shí)候可能造成來不及處理。怎么辦?這時(shí),從設(shè)備會(huì)主動(dòng)控制時(shí)鐘線把它拉低!直到數(shù)據(jù)準(zhǔn)備好之后再釋放時(shí)鐘線,把控制權(quán)交還給 MASTER。這也是 I2C 通信系統(tǒng)中,從機(jī)唯一能控制總線的時(shí)候!
關(guān)鍵是很多 I2C 主機(jī)不支持 clock stretching 功能,所以,無法和帶有 clock stretching 功能的從機(jī)通信!所以,各位在選擇主機(jī)器件之前,必須要注意這一點(diǎn),不然整個(gè)設(shè)計(jì)方案可能報(bào)廢,影響很大。
Synchronization And Arbitration
在多主的通信系統(tǒng)中??偩€上有多個(gè)節(jié)點(diǎn),它們都有自己的尋址地址,可以作為從節(jié)點(diǎn)被別的節(jié)點(diǎn)訪問,同時(shí)它們都可以作為主節(jié)點(diǎn)向其他的節(jié)點(diǎn)發(fā)送控制字節(jié)和傳送數(shù)據(jù)。
但是如果有兩個(gè)或兩個(gè)以上的節(jié)點(diǎn)都向總線上發(fā)送啟動(dòng)信號(hào)并開始傳送數(shù)據(jù),這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是 I2C 總線上的仲裁。
I2C 總線上的仲裁分兩部分:SCL 線的同步和 SDA 線的仲裁,這兩部分沒有先后關(guān)系,同時(shí)進(jìn)行。
SCL Synchronization
SCL 同步是由于總線具有線“與”的邏輯功能,即只要有一個(gè)節(jié)點(diǎn)發(fā)送低電平時(shí),總線上就表現(xiàn)為低電平。當(dāng)所有的節(jié)點(diǎn)都發(fā)送高電平時(shí),總線才能表現(xiàn)為高電平。正是由于線“與”邏輯功能的原理,當(dāng)多個(gè)節(jié)點(diǎn)同時(shí)發(fā)送時(shí)鐘信號(hào)時(shí),在總線上表現(xiàn)的是統(tǒng)一的時(shí)鐘信號(hào)。這就是 SCL 的同步原理。
同步過程如下圖:
SDA Arbitration
SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節(jié)點(diǎn)在發(fā)送1位數(shù)據(jù)后,比較總線上所呈現(xiàn)的數(shù)據(jù)與自己發(fā)送的是否一致。是,繼續(xù)發(fā)送;否則,退出競爭。
SDA 線的仲裁可以保證 I2C 總線系統(tǒng)在多個(gè)主節(jié)點(diǎn)同時(shí)企圖控制總線時(shí)通信正常進(jìn)行并且數(shù)據(jù)不丟失??偩€系統(tǒng)通過仲裁只允許一個(gè)主節(jié)點(diǎn)可以繼續(xù)占據(jù)總線。
- 仲裁在 SDA 上進(jìn)行,此時(shí) SCL 為高電平。A 主機(jī)傳輸高電平,B 主機(jī)傳輸?shù)碗娖?,A 失去仲裁。丟失仲裁的主機(jī)將生成時(shí)鐘脈沖,直到丟失仲裁的字節(jié)結(jié)束。
仲裁過程:
DATA1 和 DATA2 分別是主節(jié)點(diǎn)向總線所發(fā)送的數(shù)據(jù)信號(hào),SDA 為總線上所呈現(xiàn)的數(shù)據(jù)信號(hào),SCL 是總線上所呈現(xiàn)的時(shí)鐘信號(hào)。
當(dāng)主節(jié)點(diǎn) 1、2 同時(shí)發(fā)送起始信號(hào)時(shí),兩個(gè)主節(jié)點(diǎn)都發(fā)送了高電平信號(hào)。這時(shí)總線上呈現(xiàn)的信號(hào)為高電平,兩個(gè)主節(jié)點(diǎn)都檢測到總線上的信號(hào)與自己發(fā)送的信號(hào)相同,繼續(xù)發(fā)送數(shù)據(jù)。
第2個(gè)時(shí)鐘周期,2個(gè)主節(jié)點(diǎn)都發(fā)送低電平信號(hào),在總線上呈現(xiàn)的信號(hào)為低電平,仍繼續(xù)發(fā)送數(shù)據(jù)。
在第3個(gè)時(shí)鐘周期,主節(jié)點(diǎn)1發(fā)送高電平信號(hào),而主節(jié)點(diǎn)2發(fā)送低電平信號(hào)。根據(jù)總線的線“與”的邏輯功能,總線上的信號(hào)為低電平,這時(shí)主節(jié)點(diǎn)1檢測到總線上的數(shù)據(jù)和自己所發(fā)送的數(shù)據(jù)不一樣,就斷開數(shù)據(jù)的輸出級(jí),轉(zhuǎn)為從機(jī)接收狀態(tài)。這樣主節(jié)點(diǎn)2就贏得了總線,而且數(shù)據(jù)沒有丟失,即總線的數(shù)據(jù)與主節(jié)點(diǎn)2所發(fā)送的數(shù)據(jù)一樣,而主節(jié)點(diǎn)1在轉(zhuǎn)為從節(jié)點(diǎn)后繼續(xù)接收數(shù)據(jù),同樣也沒有丟掉 SDA 線上的數(shù)據(jù)。因此在仲裁過程中數(shù)據(jù)沒有丟失。
再次提醒:SDA仲裁和SCL時(shí)鐘同步處理過程沒有先后關(guān)系,而是同時(shí)進(jìn)行的。