1、I2C 歷史
I2C:Inter-Integrated Circuit,集成電路總線。
I2C 是 Philips 公司在 1982 年為主機(jī)板、嵌入式系統(tǒng)(短距)設(shè)計(jì)的一種簡(jiǎn)單、雙向二線制同步串行總線。
Philips 半導(dǎo)體事業(yè)部就是現(xiàn)在的 NXP。
I2C 的專利在 2006 年 11 月 1 日已到期,大家可以免費(fèi)使用。
Intel 1995 年推出的 I2C 兼容總線(System Managerment Bus),即 SMBus 或 SMB
最新版本 I2C spec v.6 于 2014.04.04 推出。
2、I2C 的未來
MIPI 協(xié)會(huì)在 2014 年左右定稿了 I3C (improved Inter Integrated Circuit)規(guī)范,I3C 在 I2C 的規(guī)格上建立了功能超集,支持高傳輸速率模式。
當(dāng)前不論是 Soc 廠商,還是 device 廠商,都已經(jīng)開始或正在向 I3C 過度。
I3C spec 有 2016 版本、2018 版本,最新的是 2021 版本(446頁)。
3、I2C 的速度
I2C 讀法:“I方C”、“I-squared-C”、"I two C"
I2C 是一種低速、串行總線,有 SDA(串行數(shù)據(jù)線) 和 SCL(串行時(shí)鐘線) 兩條信號(hào)線,半雙工通信。
通信速度如下:
? Bidirectional bus:
Standard-mode (Sm), 100 kbit/s
Fast-mode (Fm), 400 kbit/s,用在 sensor、carema、touch 等。
Fast-mode Plus (Fm+),1 Mbit/s
High-speed mode (Hs-mode),3.4 Mbit/s,用在 NFC、buck&boost 等
? Unidirectional bus:
Ultra Fast-mode (UFm),5 Mbit/s
速度由 SCL 決定,不同模式對(duì)上升沿的要求不一樣,上升沿斜率受上拉電阻和等效電容影響。
4、I2C 是一種多主從架構(gòu)總線
I2C 的讀寫均由 master 端發(fā)起。
I2C 通信的每一個(gè) byte(8bits)都需要 slaver 端的回應(yīng) ACK/NACK 作為回應(yīng)。
多 master 端需要引入仲裁機(jī)制。
slaver 端通過設(shè)備地址區(qū)分,有 7bits 和 10 bits 等地址,還有一種 8bits 地址,實(shí)際上是 7bits + 讀寫位?!酒渲?位地址 = 種類型號(hào)(4bit)+ 尋址碼(3bit)】
5、I2C 總線能掛多少設(shè)備?
7-bit address :2 的 7 次方,能掛 128 個(gè)設(shè)備。
10-bit address :2 的 10 次方,能掛 1024 個(gè)設(shè)備。
但是 I2C 協(xié)議規(guī)定,總線上的電容不可以超過 400pF。管腳都是有輸入電容的,PCB上也會(huì)有寄生電容,所以會(huì)有一個(gè)限制。實(shí)際設(shè)計(jì)中經(jīng)驗(yàn)值大概是不超過 8 個(gè)器件。
總線之所以規(guī)定電容大小,是因?yàn)?I2C 使用的 GPIO 一般為開漏結(jié)構(gòu),要求外部有電阻上拉,電阻和總線電容產(chǎn)生了一個(gè) RC 延時(shí)效應(yīng),電容越大信號(hào)的邊沿就越緩,有可能帶來信號(hào)質(zhì)量風(fēng)險(xiǎn)(方波變?nèi)遣ǎ鬏斔俣仍娇?,信?hào)的窗口就越小,上升沿下降沿時(shí)間要求更短更陡峭,所以 RC 乘積必須更小。(可以理解為輸出高電平就是給電容充電,電容越大,充電越慢)
注意,要把 spec 規(guī)定的預(yù)留設(shè)備地址去除,保留地址如下:
note:寫的是 two groups,而不僅僅是八個(gè),0000 XXX 和 1111 XXX 系列地址都是保留的。
note:注意 1111 1XXX 是 Hs-mode master code,1111 0XXX 是 10-bit slave addressing,博主后面會(huì)講。
6、定義術(shù)語
2、I2C Architecture
I2C 采用的 GPIO 一般為開漏模式,支持線與功能,但是開漏模式無法輸出高電平,所以需要外部上拉。Vdd 可以采用 5V、3.3V、1.8V 等,電源電壓不同,上拉電阻阻值也不同。
一般認(rèn)為 I2C 總線上,低于 0.3Vdd 為低電平,高于 0.7Vdd 為高電平。
I2C 協(xié)議中每個(gè)掛到總線上的設(shè)備都有獨(dú)一無二的靜態(tài)設(shè)備地址。
空閑時(shí),I2C 總線上兩根線都是高電平,因?yàn)橛猩侠娮琛?/p>
1、推挽結(jié)構(gòu)和開漏結(jié)構(gòu)
1、推挽結(jié)構(gòu):使用兩個(gè)三極管或 MOSFET,以推挽方式存在于電路中。電路工作時(shí),兩只對(duì)稱的開關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小、效率高。既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流。推拉式輸出級(jí)既提高電路的負(fù)載能力,又提高開關(guān)速度。
圖中上面是 NPN 型三極管,下面是 PNP 型三極管。分別有以下兩種情況:
輸出高電平:向負(fù)載灌電流。
輸出低電平:從負(fù)載拉電流。
2、開漏結(jié)構(gòu)(OD):對(duì)比推挽結(jié)構(gòu),開漏結(jié)構(gòu)只有一個(gè)三極管或者M(jìn)OS管。
之所以叫開漏,是因?yàn)?MOS 管分為三極:源極、柵極、漏極。漏極開路輸出,所以叫開漏;如果是三極管:基極、集電極、發(fā)射極,集電極開路,所以叫開集輸出(OC)。
開集輸出,NPN 三極管:
Vin 高電平,三極管導(dǎo)通,對(duì)外輸出低電平,外部被直接拉到低。
Vin 低電平,集電極(C)開路,輸出電平狀態(tài)由外部決定。
以上分析均采用三極管,MOS 管類似。
因此,推挽結(jié)構(gòu)可以輸出高低電平。開漏輸出只能輸出低電平,高電平由外部電路決定。
2、線與功能
線與:所有 GPIO 輸出高就是高,只要有一個(gè)輸出低,整條線上面的都是低,這就是“與”的意思。
1、推挽結(jié)構(gòu)下,兩個(gè) GPIO 口連接到一根線上,假如左邊的 PMOS 導(dǎo)通,右邊的 NMOS 導(dǎo)通,Vdd 就會(huì)通過兩個(gè) MOS 管直接接地,由于 MOS 管導(dǎo)通電阻不大,會(huì)導(dǎo)致電流很大,直接損壞這兩個(gè) GPIO口,因此,推挽輸出不支持線與。
note:實(shí)際上并不一定是上面 NMOS 下面 PMOS,只要上下兩個(gè)管子采用不同類型,即可保證同一時(shí)刻只有一個(gè)管子導(dǎo)通,即可分別輸出高低電平。
2、開漏結(jié)構(gòu):假如很多 GPIO 是開漏結(jié)構(gòu),接到了一根線,如下圖。開漏結(jié)構(gòu)輸出的高電平靠外部上拉,假如有一個(gè) GPIO 接地,那么電流會(huì)通過上拉電阻流進(jìn)地,因?yàn)橛猩侠娮璧拇嬖?,所以電流不大,不?huì)損壞 GPIO 口。
線與,是 I2C 協(xié)議的基礎(chǔ)!
小節(jié)
mode | open-drain | push-pull |
---|---|---|
speed | slower | fsater |
power | higher | lower |
slave clock stretching | yes | not supported |
power 功耗上,開漏因?yàn)樯侠娮璧拇嬖?,每次高低電平變換都會(huì)消耗能量,因此功耗高。
clock stretching 時(shí)鐘延展方面,開漏支持時(shí)鐘延展,推挽結(jié)構(gòu)不支持時(shí)鐘延展。原因和上面的推挽不支持線與一樣的。有的人會(huì)有疑問,時(shí)鐘延展不是在 SCL 低電平時(shí),從設(shè)備去拉 SCL 線嗎?不應(yīng)該有問題呀。但如果是推挽 GPIO,此時(shí)主控會(huì)嘗試?yán)?SCL ,才會(huì)發(fā)現(xiàn) SCL 被從設(shè)備拉低,這時(shí)候就會(huì)短路。
再次提醒,線與:當(dāng)總線上只要有一個(gè)設(shè)備輸出低電平,整條總線便處于低電平狀態(tài),這時(shí)候總線被稱為占用狀態(tài)。
3、上拉電阻計(jì)算
1、上拉電阻過小,電流大,端口低電平 level 增大,會(huì)發(fā)現(xiàn)總線上電平拉不到 0V。
2、上拉電阻過大,上升沿時(shí)間增大,方波可能會(huì)變成三角波。
因此計(jì)算出一個(gè)精確的上拉電阻阻值是非常重要的。計(jì)算上拉電阻的阻值,有明確計(jì)算公式:
最大電阻和上升沿時(shí)間 tr 、總線電容 Cb 、標(biāo)準(zhǔn)上升沿時(shí)間 0.8473 有關(guān)。
最小電阻和電源 Vdd 電壓、GPIO 最大輸出電壓 Vol、 GPIO 最大電流 Vol 有關(guān)。
查《I2C-bus specification and user manual.pdf》7.1節(jié):
查《I2C-bus specification and user manual.pdf》表10:
從上圖可以得到最大電阻和最小電阻計(jì)算公式以及如下數(shù)據(jù):
1、標(biāo)準(zhǔn)模式:0~100KHz,上升沿時(shí)間要求 tr = 1us
2、快速模式:100~400KHz,上升沿時(shí)間要求 tr = 0.3us
3、高速模式:up to 3.4MHz,上升沿時(shí)間要求 tr = 0.12us
note:該上升沿時(shí)間 tr 是 0.3Vdd 到 0.7Vdd 的時(shí)間要求。
假設(shè):Vdd 是 1.8V,Cb 總線電容 200pF(雖然協(xié)議規(guī)定負(fù)載電容最大 400pF,實(shí)際上超過 200pF波形就很不好,我們以 200pF 來計(jì)算,實(shí)際大家使用時(shí)建議以 100pF 計(jì)算)
標(biāo)準(zhǔn)模式 :
快速模式:
高速模式:
最小電阻(Vdd越大,上拉電阻就要越大):
注意,高速模式下,電源電壓一般采用 1.8 V,不會(huì)采用 3.3V,因?yàn)槿绻?3.3V 計(jì)算你會(huì)發(fā)現(xiàn)最小電阻比最大電阻大。
采用合適的電源電壓和合適的上拉電阻,才會(huì)讓你的 I2C 傳輸信號(hào)最優(yōu)。
大家在不同速率采用的電阻一般有以下幾種:1.5K、2.2K、4.7K。
上拉電阻關(guān)系圖
3、I2C Transfer
0、Definition of timing
想要深入探討 I2C 協(xié)議,必須深刻理解各種時(shí)間的定義,如下為 F/S-mode
建立時(shí)間(Tsu):時(shí)鐘上升沿到來之前,輸入端數(shù)據(jù)已經(jīng)到來并穩(wěn)定持續(xù)的時(shí)間間隔。
保持時(shí)間(Thd):時(shí)鐘上升沿到來之后,輸入端數(shù)據(jù)繼續(xù)保持穩(wěn)定并持續(xù)的時(shí)間間隔。
標(biāo)識(shí)符 | 定義 |
---|---|
tf | 信號(hào)下降時(shí)間 |
tr | 信號(hào)上升時(shí)間 |
tLOW | 信號(hào)低電平時(shí)間 |
tHIGH | 信號(hào)高電平時(shí)間 |
tHD;DAT | 數(shù)據(jù)保持時(shí)間 |
tSU;DAT | 數(shù)據(jù)建立時(shí)間 |
tSP | 輸入濾波器必須抑制的毛刺脈寬 |
tBUF | 啟動(dòng)和停止條件的空閑時(shí)間 |
tHD;STA | 重復(fù)起始條件的保持時(shí)間 |
tSU;STA | 重復(fù)起始條件的建立時(shí)間 |
tSU;STO | 停止條件建立時(shí)間 |
Sr 重新啟動(dòng),S 啟動(dòng),P 停止。
如上參數(shù)在 spec 中有嚴(yán)格規(guī)定,可查表,一般 standard mode 和 Fast mode 在一起,Hs mode 單獨(dú)列,表4、表5、表6、表7:
Master
提供時(shí)鐘 SCL
開啟和停止數(shù)據(jù)傳輸
尋址其他設(shè)備
slave
被主設(shè)備尋址
1、數(shù)據(jù)有效性
在 SCL 高電平期間,SDA 必須穩(wěn)定,所以一般情況下,SCL 高電平寬度小,SDA 高電平寬度大,用示波器看也是這樣的。
2、起始條件和停止條件
起始條件:SCL 高電平時(shí),SDA 由高變低。
停止條件:SCL 高電平時(shí),SDA 由低變高。
note:因?yàn)?SCL 和 SDA 兩根線有上拉電阻,因此空閑時(shí)兩根線為高電平。因此,START 條件一定是某條線拉低,spec 規(guī)定是 SDA 線拉低為開始條件。這也是開始條件和停止條件不能互換的原因。(至于為什么不是 SCL 線拉低為開始條件,大家看到后面會(huì)理解)
byte format
傳輸長度必須是一個(gè)字節(jié)(8 bit)
每次傳輸?shù)淖止?jié)不受限制
數(shù)據(jù)必須以 MSB 開頭進(jìn)行傳輸,也就是先傳輸最高位
從機(jī)可以將時(shí)鐘線 SCL 保持在低位,迫使主機(jī)進(jìn)入等待狀態(tài)。
在 ACK 后,從設(shè)備可以拉低 SCL 線進(jìn)行時(shí)鐘延展(比如從設(shè)備需要準(zhǔn)備數(shù)據(jù)等)
note:SCL 高電平的時(shí)候,SDA 開始采樣,SDA 是高就是 1,是低就是 0。SCL 低電平期間,SDA 變換數(shù)據(jù)。不可以在 SCL 高電平期間變換數(shù)據(jù),否則會(huì)認(rèn)為是 起始和停止條件。
3、ACK or NACK
每次傳輸完一個(gè)字節(jié)以后,從設(shè)備要進(jìn)行一個(gè)回應(yīng),回應(yīng) ACK 或者 NACK。
ACK :在傳輸 8 bit 以后,在第九個(gè) bit ,SCL 高電平,如果 SDA 是低電平,說明回應(yīng)了 ACK。
NACK:在傳輸 8 bit 以后,在第九個(gè) bit ,SCL 高電平,如果 SDA 是高電平,說明回應(yīng)了 NACK。
spec 規(guī)定以下五種情況會(huì)出現(xiàn) NACK
主機(jī)發(fā)送到總線上的地址,卻沒有匹配的從機(jī),因此出現(xiàn) NACK
從機(jī)處于 busy 狀態(tài),出現(xiàn) NACK
在傳輸過程中,從機(jī)獲取其不理解的數(shù)據(jù)或命令。
在傳輸過程中,從機(jī)無法再接收任何數(shù)據(jù)字節(jié)。
主接收機(jī)必須向從發(fā)射機(jī)發(fā)送傳輸結(jié)束的信號(hào)的時(shí)候,會(huì)出現(xiàn) NACK。
4、write data
主機(jī)向從機(jī)寫數(shù)據(jù),在通信結(jié)束的最后一個(gè)字節(jié),正常從機(jī)都會(huì)回應(yīng)一個(gè) ACK ,告訴主機(jī)最后一個(gè)字節(jié)寫成功,這時(shí)候主機(jī)會(huì)產(chǎn)生 STOP 信號(hào)。
如果最后一個(gè)字節(jié)從機(jī)回應(yīng)一個(gè) NACK ,主機(jī)也會(huì)產(chǎn)生一個(gè) STOP 信號(hào),并且這時(shí)候主機(jī)會(huì)向上層上報(bào)一個(gè) ACK error 。
上層如何處理,是上層的事情,芯片設(shè)計(jì)時(shí) I2C 外設(shè)控制器一定會(huì)在這個(gè)時(shí)候產(chǎn)生一個(gè) ACK error。如果用的是 Linux 操作系統(tǒng),可以配置在上層忽略最后的這個(gè) ACK error 。
5、read data
主機(jī)從從機(jī)讀數(shù)據(jù),在最后一個(gè)字節(jié)后,主機(jī)會(huì)給從機(jī)一個(gè) NACK ,告訴從機(jī)不再讀數(shù)據(jù)了,然后主機(jī)產(chǎn)生一個(gè) STOP 信號(hào)。這是唯一一個(gè)在正常傳輸過程中的 NACK
6、復(fù)合格式
在重復(fù)開始信號(hào) Sr 前后,兩個(gè) slave address 可以不同。也就是說,一個(gè) I2C 主機(jī)可以不產(chǎn)生 STOP 信號(hào),直接產(chǎn)生一個(gè)重復(fù)開始信號(hào)去訪問另外一個(gè)從機(jī)。(如果 I2C 總線上有多個(gè)主機(jī),則不用再一次仲裁,節(jié)省時(shí)間)
另外,在 Linux 系統(tǒng)中,由于 i2c_msg 結(jié)構(gòu)體的規(guī)定,單筆 I2C 傳輸最大 64KB,超過 64KB 也要再來一次 STOP 信號(hào)或者 重復(fù)開始信號(hào)。
7、I2C Transfer Regulation
以 START 條件開始
以 STOP 條件結(jié)束
傳輸?shù)牡谝粋€(gè)字節(jié)為 7bit 從機(jī)地址 + 1bit 讀寫位
每個(gè)總線上的設(shè)備都會(huì)比較 STRAT 信號(hào)后面的 7bit 地址與自己的地址是否匹配
每個(gè) byte(8 bits) 后面都會(huì)有 ACK 或者 NACK
在 START 信號(hào)或者 repeated START 信號(hào)后,從機(jī)必須重置自己的總線邏輯
一個(gè) START 后面緊跟著一個(gè) STOP 信號(hào),是非法格式
主機(jī) master 可以不產(chǎn)生 STOP 信號(hào),而是直接產(chǎn)生一個(gè) repeated START 信號(hào)+另外一個(gè)設(shè)備地址,直接開始訪問另外一個(gè)設(shè)備
8、10-bit addressing
10 位從機(jī)地址規(guī)定如下,其中 11110 為 10 位地址的指示信號(hào),A9-A0 表示 10bits 地址:
主機(jī)向從機(jī)寫數(shù)據(jù)(需要 2 bytes)
主機(jī)從從機(jī)讀數(shù)據(jù)(需要 3 bytes)
9、示波器波形圖示例
主機(jī)向從機(jī)寫數(shù)據(jù)
上圖中,大家會(huì)在 SDA 線上發(fā)現(xiàn)有三個(gè)很細(xì)的毛刺,每次都是出現(xiàn)在從機(jī)回應(yīng)了 ACK 以后。這是由于從機(jī)拉低 SDA 線回應(yīng) ACK 后,釋放了 SDA 線,因?yàn)橛猩侠娮璧拇嬖?,SDA 線被拉高,然后主機(jī)又立刻接管了 SDA 線,把 SDA 線拉低。即該毛刺是由于 slave 和 master 換手有時(shí)差導(dǎo)致的。
因?yàn)樵撁淌浅霈F(xiàn)在 SCL 低電平期間,而 SCL 低電平期間,SDA 本來就可以變換數(shù)據(jù),所以不會(huì)對(duì) I2C 通信產(chǎn)生負(fù)面影響,該毛刺一般不用關(guān)注。
如果覺得波形不美觀,可以找芯片原廠,看能否調(diào)整 master 控線的 setup time 和 hold time ,來減小該毛刺的幅值。
主機(jī)從從機(jī)讀數(shù)據(jù)
10、補(bǔ)充
I2C 不支持從設(shè)備在 SCL 和 SDA 總線上發(fā)起一個(gè)中斷,通知主設(shè)備來讀數(shù)據(jù)。有中斷需求的從設(shè)備需要額外接一根中斷線,通知主控?cái)?shù)據(jù)已經(jīng)準(zhǔn)備好,讓主控發(fā)起讀數(shù)據(jù)的操作。
這無疑增加了系統(tǒng)復(fù)雜性,多占用了 pin 腳。I3C 則不存在這種問題,I3C 允許從設(shè)備在 SCL 和SDA 上發(fā)起中斷,叫“帶內(nèi)中斷”,I3C 后面會(huì)講。
4、I2C Synchronization And Arbitration
三個(gè)概念:時(shí)鐘延展、同步、仲裁
1、Clock stretching 時(shí)鐘延展
時(shí)鐘延展:通過將 SCL 線保持在低電平來暫停傳輸。在 SCL 再次拉高之前,傳輸無法進(jìn)行。
從機(jī)通過將 SCL 線拉低,強(qiáng)制主機(jī)進(jìn)入等待狀態(tài)。
時(shí)鐘延展功能是可選的,非必須。
byte level
時(shí)鐘延展導(dǎo)致需要更多時(shí)間來存儲(chǔ)接收到的字節(jié)或準(zhǔn)備另一個(gè)要傳輸?shù)淖止?jié)
bit level
通過延長每個(gè)時(shí)鐘低電平周期來降低總線時(shí)鐘。任何主機(jī)的速度都與該設(shè)備的內(nèi)部運(yùn)行速度相適應(yīng)。
在 Hs mode,只能使用 byte level,也就是只能在傳輸完一個(gè)字節(jié)(8bits)后拉低 SCL 進(jìn)行時(shí)鐘延展。在 Standard-mode 和 Fast-mode,既可以 byte level 也可以 bit level,bit level 意思是哪怕你之傳輸了 2 bits ,從機(jī)也可以拉低 SCL 線進(jìn)行時(shí)鐘延展,臨時(shí)暫停傳輸。
時(shí)鐘延展通俗解釋
I2C 主設(shè)備始終控制著時(shí)鐘線 SCL,不論是往設(shè)備寫還是從設(shè)備讀。一般情況下,如果操作對(duì)象是 EEPROM 或者其他簡(jiǎn)單設(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)廢,影響很大。
2、Synchronization And Arbitration
I2C 是多主從架構(gòu),也就是一條總線上可以同時(shí)掛多個(gè) I2C 主機(jī)和多個(gè) I2C 從機(jī)。
但是如果有兩個(gè)或兩個(gè)以上的主機(jī)同時(shí)向總線上發(fā)送啟動(dòng)信號(hào)并開始傳送數(shù)據(jù),這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是 I2C 總線上的仲裁。
I2C 總線上的仲裁分兩部分:SCL 線的同步和 SDA 線的仲裁,這兩部分沒有先后關(guān)系,是在同時(shí)進(jìn)行。
SCL Synchronization
所有主機(jī)都在 SCL 線上輸出自己的時(shí)鐘,因此同步過程需要定義自己的時(shí)鐘。
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 的同步原理。
同步過程如下圖:
主機(jī) 1 產(chǎn)生 CLK1,主機(jī) 2 產(chǎn)生 CLK2,同時(shí)向 SCL 線上輸出自己的時(shí)鐘,由于 CLK2 的低電平更長,因此 SCL 線上出現(xiàn)的電平和 CLK2 保持一致。因此在第一個(gè)周期中,CLK1 后期進(jìn)入了高電平等待狀態(tài)。后面 SCL 上的電平以 CLK2 為準(zhǔn)。
SDA Arbitration
SDA 線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節(jié)點(diǎn)在發(fā)送1位數(shù)據(jù)后,比較總線上所呈現(xiàn)的數(shù)據(jù)與自己發(fā)送的是否一致。是,繼續(xù)發(fā)送;否則,退出競(jìng)爭(zhēng)。
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ù)碗娖剑珹 失去仲裁。
丟失仲裁的主機(jī)將生成時(shí)鐘脈沖,直到丟失仲裁的字節(jié)結(jié)束。
仲裁過程:
DATA1 和 DATA2 分別是兩個(gè)主機(jī)向總線所發(fā)送的數(shù)據(jù)信號(hào),SDA 為總線上所呈現(xiàn)的數(shù)據(jù)信號(hào),SCL 是總線上所呈現(xiàn)的時(shí)鐘信號(hào)。
主機(jī) 1、2 同時(shí)發(fā)送起始信號(hào),在 clock1 ,兩個(gè)主機(jī)都發(fā)送了高電平信號(hào)。這時(shí)總線上呈現(xiàn)的信號(hào)為高電平,兩個(gè)主節(jié)點(diǎn)都檢測(cè)到總線上的信號(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檢測(cè)到總線上的數(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ù)沒有丟失。
5、I2C Hs-mode
HS mode 為什么單獨(dú)講解?因?yàn)楦咚倌J胶推渌J接泻芏嗖灰粯拥牡胤健?/p>
速度高達(dá) 3.4MHz。
用的是 SDAH 和 SCLH 信號(hào)線,不是 SDA 和 SCL
Master device
SDAH/SCLH 有一個(gè)開漏輸出 buffer, SCLH 有一個(gè)電流源上拉電路,這個(gè)電流源電路縮短了 SCLH 信號(hào)的上升時(shí)間。任何時(shí)侯在 Hs 模式只有一個(gè)主機(jī)的電流源有效。
沒有仲裁和時(shí)鐘同步,以加速位處理能力。仲裁過程一般在前面用 F/S 模式傳輸主機(jī)碼后結(jié)束。
以高電平和低電平是 1:2 的比率產(chǎn)生一個(gè)串行時(shí)鐘信號(hào)。解除了建立和保持時(shí)間的時(shí)序要求。
高速數(shù)據(jù) SDAH 和高速串行時(shí)鐘 SCLH 線通過這個(gè)電橋與 F/S 模式器件的 SDA 和 SCL 線分隔開來。減輕了SDAH 和 SCLH 線的電容負(fù)載,使上升和下降時(shí)間更快。
Slave device
Hs 模式從機(jī)器件與 F/S 從機(jī)器件的唯一差別是它們工作的速度。Hs 模式從機(jī)在 SCLH 和 SDAH輸出有開漏輸出 buffer 。SCLH 管腳可選的下拉晶體管可以用于拉長 SCLH 信號(hào)的低電平,但只允許在 Hs 模式傳輸?shù)捻憫?yīng)位后進(jìn)行。
Hs 模式器件的輸出可以抑制毛刺,而且 SDAH 和 SCLH 輸出有一個(gè) Schmitt 觸發(fā)器
Hs 模式器件的輸出緩沖器對(duì) SDAH 和 SCLH 信號(hào)的下降沿有斜率控制功能
調(diào)整了串行數(shù)據(jù) SDA 和串行時(shí)鐘 SCL 信號(hào)的時(shí)序。沒有必要與其他總線系統(tǒng)如 CBUS 兼容,它們不能在增加的位速率下工作。
如果快速模式器件的電源電壓被關(guān)斷,SDA 和 SCL 的 I/O 管腳必須懸空,不能阻塞總線。
連接到總線的外部上拉器件必須調(diào)整以適應(yīng)快速模式 I2C 總線更短的最大允許上升時(shí)間。對(duì)于負(fù)載最大是 200pF 的總線,每條總線的上拉器件可以是一個(gè)電阻;對(duì)于負(fù)載在 200pF~400pF 之間的總線,上拉器件可以是一個(gè)電流源(最大值 3mA)或者是一個(gè)開關(guān)電阻電路,如下圖:
只有 Hs 模式器件的系統(tǒng)的物理 I2C 總線配置
(可選)串聯(lián)電阻器 Rs 保護(hù) I2C 總線設(shè)備的 I/O 免受總線上的高壓尖峰影響,并將振鈴和干擾降至最低。
右下角兩個(gè)設(shè)備,不光是從設(shè)備,也可以當(dāng)主設(shè)備。這種器件有一個(gè) MCS 電流源。如果總線上器件較多,會(huì)導(dǎo)致總線電容較大,拉升總線電壓相當(dāng)于給電容充電,這需要時(shí)間,這會(huì)導(dǎo)致波形上升沿過緩,所以加了電流源可以使上升沿很快。
1、data transfer format in Hs-mode
START condition (S)
8-bit master code (0000 1XXX)
Not-acknowledge bit (A)
2、在 Hs 模式下啟用電流源上拉電路
3、在下一次重復(fù)啟動(dòng)條件后,依舊在 Hs-mode
由上圖可以看出,在快速模式(FS mode)下發(fā)送一個(gè) Master code,然后切換到高速模式(HS mode),發(fā)送從設(shè)備地址。
在第一階段 FS mode 時(shí)候,發(fā)送主機(jī)碼(0x0000 1xxx),這時(shí)候會(huì)進(jìn)行仲裁。因此 Hs mode 階段沒有時(shí)鐘同步和仲裁。
在中間的 HS mode 傳輸結(jié)束后,如果是一個(gè) STOP 信號(hào),則立刻回到 F/S mode,如果是 Sr 重復(fù)開始i信號(hào),則依舊留在 Hs mode(右下角有說明)
上圖為 Hs mode 完整通信波形示意圖。先在快速模式下發(fā)送主機(jī)碼,不需要從機(jī)回復(fù)。然后切換到高速模式,會(huì)發(fā)送一個(gè) reSTART,然后進(jìn)行數(shù)據(jù)傳輸。
需要注意如下幾點(diǎn):
右上角 t1 到 tH 時(shí)間之內(nèi),可以進(jìn)行時(shí)鐘延展。
Hs mode 中,只能在 byte level 級(jí)別進(jìn)行時(shí)鐘延展,也就是一個(gè) byte 傳輸結(jié)束后進(jìn)行時(shí)鐘延展。
注意左下角的示意圖,如果是直上直下的這種波形,是主機(jī)電流源上拉。如果是緩坡上升沿,則是電阻上拉。
博主將 I2C spec 單獨(dú)總結(jié)出來,意思是說,不管你是單片機(jī)平臺(tái),還是 FreeRTOS 平臺(tái),還是 Linux 平臺(tái),I2C spec 都是一樣的,所以總結(jié)為一文方便大家查看。
審核編輯:劉清
-
示波器
+關(guān)注
關(guān)注
113文章
6240瀏覽量
184794 -
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3587瀏覽量
129435 -
I2C總線
+關(guān)注
關(guān)注
8文章
390瀏覽量
60916 -
MIPI
+關(guān)注
關(guān)注
11文章
310瀏覽量
48613 -
SCL
+關(guān)注
關(guān)注
1文章
239瀏覽量
17057
原文標(biāo)題:I2C spec 總結(jié)
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論