0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C總線能掛多少設(shè)備?I2C spec知識(shí)總結(jié)

sanyue7758 ? 來(lái)源:嵌入式Linux系統(tǒng)開(kāi)發(fā) ? 2023-03-27 09:19 ? 次閱讀

1、I2C Introduction

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 的未來(lái)

MIPI 協(xié)會(huì)在 2014 年左右定稿了 I3C (improved Inter Integrated Circuit)規(guī)范,I3C 在 I2C 的規(guī)格上建立了功能超集,支持高傳輸速率模式。

當(dāng)前不論是 Soc 廠商,還是 device 廠商,都已經(jīng)開(kāi)始或正在向 I3C 過(guò)度。

I3C spec 有 2016 版本、2018 版本,最新的是 2021 版本(446頁(yè))。

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 的讀寫(xiě)均由 master 端發(fā)起。

I2C 通信的每一個(gè) byte(8bits)都需要 slaver 端的回應(yīng) ACK/NACK 作為回應(yīng)。

多 master 端需要引入仲裁機(jī)制。

slaver 端通過(guò)設(shè)備地址區(qū)分,有 7bits 和 10 bits 等地址,還有一種 8bits 地址,實(shí)際上是 7bits + 讀寫(xiě)位?!酒渲?位地址 = 種類型號(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ī)定,總線上的電容不可以超過(guò) 400pF。管腳都是有輸入電容的,PCB上也會(huì)有寄生電容,所以會(huì)有一個(gè)限制。實(shí)際設(shè)計(jì)中經(jīng)驗(yàn)值大概是不超過(guò) 8 個(gè)器件。

總線之所以規(guī)定電容大小,是因?yàn)?I2C 使用的 GPIO 一般為開(kāi)漏結(jié)構(gòu),要求外部有電阻上拉,電阻和總線電容產(chǎn)生了一個(gè) RC 延時(shí)效應(yīng),電容越大信號(hào)的邊沿就越緩,有可能帶來(lái)信號(hào)質(zhì)量風(fēng)險(xiǎn)(方波變?nèi)遣ǎ鬏斔俣仍娇?,信?hào)的窗口就越小,上升沿下降沿時(shí)間要求更短更陡峭,所以 RC 乘積必須更小。(可以理解為輸出高電平就是給電容充電,電容越大,充電越慢)

注意,要把 spec 規(guī)定的預(yù)留設(shè)備地址去除,保留地址如下:

3ef7d11c-cbe9-11ed-bfe3-dac502259ad0.png

note:寫(xiě)的是 two groups,而不僅僅是八個(gè),0000 XXX 和 1111 XXX 系列地址都是保留的。

note:注意 1111 1XXX 是 Hs-mode master code,1111 0XXX 是 10-bit slave addressing,博主后面會(huì)講。

6、定義術(shù)語(yǔ)

3f272782-cbe9-11ed-bfe3-dac502259ad0.png

2、I2C Architecture

3f404eba-cbe9-11ed-bfe3-dac502259ad0.png3f5da884-cbe9-11ed-bfe3-dac502259ad0.png

I2C 采用的 GPIO 一般為開(kāi)漏模式,支持線與功能,但是開(kāi)漏模式無(wú)法輸出高電平,所以需要外部上拉。Vdd 可以采用 5V、3.3V、1.8V 等,電源電壓不同,上拉電阻阻值也不同。

一般認(rèn)為 I2C 總線上,低于 0.3Vdd 為低電平,高于 0.7Vdd 為高電平。

I2C 協(xié)議中每個(gè)掛到總線上的設(shè)備都有獨(dú)一無(wú)二的靜態(tài)設(shè)備地址。

空閑時(shí),I2C 總線上兩根線都是高電平,因?yàn)橛猩侠娮琛?/p>

1、推挽結(jié)構(gòu)和開(kāi)漏結(jié)構(gòu)

1、推挽結(jié)構(gòu):使用兩個(gè)三極管或 MOSFET,以推挽方式存在于電路中。電路工作時(shí),兩只對(duì)稱的開(kāi)關(guān)管每次只有一個(gè)導(dǎo)通,所以導(dǎo)通損耗小、效率高。既可以向負(fù)載灌電流,也可以從負(fù)載抽取電流。推拉式輸出級(jí)既提高電路的負(fù)載能力,又提高開(kāi)關(guān)速度。

3f7b8354-cbe9-11ed-bfe3-dac502259ad0.png

圖中上面是 NPN 型三極管,下面是 PNP 型三極管。分別有以下兩種情況:

輸出高電平:向負(fù)載灌電流。

3f8f44de-cbe9-11ed-bfe3-dac502259ad0.png

輸出低電平:從負(fù)載拉電流。

3fa1c71c-cbe9-11ed-bfe3-dac502259ad0.png

2、開(kāi)漏結(jié)構(gòu)(OD):對(duì)比推挽結(jié)構(gòu),開(kāi)漏結(jié)構(gòu)只有一個(gè)三極管或者M(jìn)OS管。

之所以叫開(kāi)漏,是因?yàn)?MOS 管分為三極:源極、柵極、漏極。漏極開(kāi)路輸出,所以叫開(kāi)漏;如果是三極管:基極、集電極、發(fā)射極,集電極開(kāi)路,所以叫開(kāi)集輸出(OC)。

開(kāi)集輸出,NPN 三極管:

3fb080a4-cbe9-11ed-bfe3-dac502259ad0.png

Vin 高電平,三極管導(dǎo)通,對(duì)外輸出低電平,外部被直接拉到低。

Vin 低電平,集電極(C)開(kāi)路,輸出電平狀態(tài)由外部決定。

3fbfcc80-cbe9-11ed-bfe3-dac502259ad0.png

以上分析均采用三極管,MOS 管類似。

因此,推挽結(jié)構(gòu)可以輸出高低電平。開(kāi)漏輸出只能輸出低電平,高電平由外部電路決定。

2、線與功能

線與:所有 GPIO 輸出高就是高,只要有一個(gè)輸出低,整條線上面的都是低,這就是“與”的意思。

1、推挽結(jié)構(gòu)下,兩個(gè) GPIO 口連接到一根線上,假如左邊的 PMOS 導(dǎo)通,右邊的 NMOS 導(dǎo)通,Vdd 就會(huì)通過(guò)兩個(gè) MOS 管直接接地,由于 MOS 管導(dǎo)通電阻不大,會(huì)導(dǎo)致電流很大,直接損壞這兩個(gè) GPIO口,因此,推挽輸出不支持線與。

3fd0a91a-cbe9-11ed-bfe3-dac502259ad0.png

note:實(shí)際上并不一定是上面 NMOS 下面 PMOS,只要上下兩個(gè)管子采用不同類型,即可保證同一時(shí)刻只有一個(gè)管子導(dǎo)通,即可分別輸出高低電平。

2、開(kāi)漏結(jié)構(gòu):假如很多 GPIO 是開(kāi)漏結(jié)構(gòu),接到了一根線,如下圖。開(kāi)漏結(jié)構(gòu)輸出的高電平靠外部上拉,假如有一個(gè) GPIO 接地,那么電流會(huì)通過(guò)上拉電阻流進(jìn)地,因?yàn)橛猩侠娮璧拇嬖冢噪娏鞑淮?,不?huì)損壞 GPIO 口。

3fe59bea-cbe9-11ed-bfe3-dac502259ad0.png

線與,是 I2C 協(xié)議的基礎(chǔ)!

小節(jié)

mode open-drain push-pull
speed slower fsater
power higher lower
slave clock stretching yes not supported

power 功耗上,開(kāi)漏因?yàn)樯侠娮璧拇嬖?,每次高低電平變換都會(huì)消耗能量,因此功耗高。

clock stretching 時(shí)鐘延展方面,開(kāi)漏支持時(shí)鐘延展,推挽結(jié)構(gòu)不支持時(shí)鐘延展。原因和上面的推挽不支持線與一樣的。有的人會(huì)有疑問(wèn),時(shí)鐘延展不是在 SCL 低電平時(shí),從設(shè)備去拉 SCL 線嗎?不應(yīng)該有問(wèn)題呀。但如果是推挽 GPIO,此時(shí)主控會(huì)嘗試?yán)?SCL ,才會(huì)發(fā)現(xiàn) SCL 被從設(shè)備拉低,這時(shí)候就會(huì)短路。

再次提醒,線與:當(dāng)總線上只要有一個(gè)設(shè)備輸出低電平,整條總線便處于低電平狀態(tài),這時(shí)候總線被稱為占用狀態(tài)。

400b53bc-cbe9-11ed-bfe3-dac502259ad0.png

3、上拉電阻計(jì)算

1、上拉電阻過(guò)小,電流大,端口低電平 level 增大,會(huì)發(fā)現(xiàn)總線上電平拉不到 0V。

2、上拉電阻過(guò)大,上升沿時(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é):

4024caa4-cbe9-11ed-bfe3-dac502259ad0.png

408a397a-cbe9-11ed-bfe3-dac502259ad0.png

查《I2C-bus specification and user manual.pdf》表10:

40ad4442-cbe9-11ed-bfe3-dac502259ad0.png

從上圖可以得到最大電阻和最小電阻計(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í)際上超過(guò) 200pF波形就很不好,我們以 200pF 來(lái)計(jì)算,實(shí)際大家使用時(shí)建議以 100pF 計(jì)算)

標(biāo)準(zhǔn)模式 :

40f5adc2-cbe9-11ed-bfe3-dac502259ad0.png

快速模式:

4107651c-cbe9-11ed-bfe3-dac502259ad0.png

高速模式:

4113cd0c-cbe9-11ed-bfe3-dac502259ad0.png

最小電阻(Vdd越大,上拉電阻就要越大):

411f92d6-cbe9-11ed-bfe3-dac502259ad0.png

注意,高速模式下,電源電壓一般采用 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)系圖

41330a1e-cbe9-11ed-bfe3-dac502259ad0.png

3、I2C Transfer

0、Definition of timing

想要深入探討 I2C 協(xié)議,必須深刻理解各種時(shí)間的定義,如下為 F/S-mode

4143b1ac-cbe9-11ed-bfe3-dac502259ad0.png

建立時(shí)間(Tsu):時(shí)鐘上升沿到來(lái)之前,輸入端數(shù)據(jù)已經(jīng)到來(lái)并穩(wěn)定持續(xù)的時(shí)間間隔。

保持時(shí)間(Thd):時(shí)鐘上升沿到來(lái)之后,輸入端數(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:

41599a44-cbe9-11ed-bfe3-dac502259ad0.png4172def0-cbe9-11ed-bfe3-dac502259ad0.png419c01ea-cbe9-11ed-bfe3-dac502259ad0.png41bfe010-cbe9-11ed-bfe3-dac502259ad0.png41e53ec8-cbe9-11ed-bfe3-dac502259ad0.png41ff025e-cbe9-11ed-bfe3-dac502259ad0.png

Master

提供時(shí)鐘 SCL

開(kāi)啟和停止數(shù)據(jù)傳輸

尋址其他設(shè)備

slave

被主設(shè)備尋址

1、數(shù)據(jù)有效性

在 SCL 高電平期間,SDA 必須穩(wěn)定,所以一般情況下,SCL 高電平寬度小,SDA 高電平寬度大,用示波器看也是這樣的。

4218cb58-cbe9-11ed-bfe3-dac502259ad0.png

2、起始條件和停止條件

起始條件:SCL 高電平時(shí),SDA 由高變低。

停止條件:SCL 高電平時(shí),SDA 由低變高。

note:因?yàn)?SCL 和 SDA 兩根線有上拉電阻,因此空閑時(shí)兩根線為高電平。因此,START 條件一定是某條線拉低,spec 規(guī)定是 SDA 線拉低為開(kāi)始條件。這也是開(kāi)始條件和停止條件不能互換的原因。(至于為什么不是 SCL 線拉低為開(kāi)始條件,大家看到后面會(huì)理解)

4226adf4-cbe9-11ed-bfe3-dac502259ad0.png

byte format

傳輸長(zhǎng)度必須是一個(gè)字節(jié)(8 bit)

每次傳輸?shù)淖止?jié)不受限制

數(shù)據(jù)必須以 MSB 開(kāi)頭進(jìn)行傳輸,也就是先傳輸最高位

從機(jī)可以將時(shí)鐘線 SCL 保持在低位,迫使主機(jī)進(jìn)入等待狀態(tài)。

423f3ebe-cbe9-11ed-bfe3-dac502259ad0.png425afa00-cbe9-11ed-bfe3-dac502259ad0.png

在 ACK 后,從設(shè)備可以拉低 SCL 線進(jìn)行時(shí)鐘延展(比如從設(shè)備需要準(zhǔn)備數(shù)據(jù)等)

note:SCL 高電平的時(shí)候,SDA 開(kāi)始采樣,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 是低電平,說(shuō)明回應(yīng)了 ACK。

NACK:在傳輸 8 bit 以后,在第九個(gè) bit ,SCL 高電平,如果 SDA 是高電平,說(shuō)明回應(yīng)了 NACK。

426abb66-cbe9-11ed-bfe3-dac502259ad0.png

spec 規(guī)定以下五種情況會(huì)出現(xiàn) NACK

主機(jī)發(fā)送到總線上的地址,卻沒(méi)有匹配的從機(jī),因此出現(xiàn) NACK

從機(jī)處于 busy 狀態(tài),出現(xiàn) NACK

在傳輸過(guò)程中,從機(jī)獲取其不理解的數(shù)據(jù)或命令。

在傳輸過(guò)程中,從機(jī)無(wú)法再接收任何數(shù)據(jù)字節(jié)。

主接收機(jī)必須向從發(fā)射機(jī)發(fā)送傳輸結(jié)束的信號(hào)的時(shí)候,會(huì)出現(xiàn) NACK。

4、write data

427f7e48-cbe9-11ed-bfe3-dac502259ad0.png

主機(jī)向從機(jī)寫(xiě)數(shù)據(jù),在通信結(jié)束的最后一個(gè)字節(jié),正常從機(jī)都會(huì)回應(yīng)一個(gè) ACK ,告訴主機(jī)最后一個(gè)字節(jié)寫(xiě)成功,這時(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

4293b20a-cbe9-11ed-bfe3-dac502259ad0.png

主機(jī)從從機(jī)讀數(shù)據(jù),在最后一個(gè)字節(jié)后,主機(jī)會(huì)給從機(jī)一個(gè) NACK ,告訴從機(jī)不再讀數(shù)據(jù)了,然后主機(jī)產(chǎn)生一個(gè) STOP 信號(hào)。這是唯一一個(gè)在正常傳輸過(guò)程中的 NACK

6、復(fù)合格式

42a8c2a8-cbe9-11ed-bfe3-dac502259ad0.png

在重復(fù)開(kāi)始信號(hào) Sr 前后,兩個(gè) slave address 可以不同。也就是說(shuō),一個(gè) I2C 主機(jī)可以不產(chǎn)生 STOP 信號(hào),直接產(chǎn)生一個(gè)重復(fù)開(kāi)始信號(hào)去訪問(wèn)另外一個(gè)從機(jī)。(如果 I2C 總線上有多個(gè)主機(jī),則不用再一次仲裁,節(jié)省時(shí)間)

另外,在 Linux 系統(tǒng)中,由于 i2c_msg 結(jié)構(gòu)體的規(guī)定,單筆 I2C 傳輸最大 64KB,超過(guò) 64KB 也要再來(lái)一次 STOP 信號(hào)或者 重復(fù)開(kāi)始信號(hào)。

7、I2C Transfer Regulation

以 START 條件開(kāi)始

以 STOP 條件結(jié)束

傳輸?shù)牡谝粋€(gè)字節(jié)為 7bit 從機(jī)地址 + 1bit 讀寫(xiě)位

每個(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è)備地址,直接開(kāi)始訪問(wèn)另外一個(gè)設(shè)備

8、10-bit addressing

10 位從機(jī)地址規(guī)定如下,其中 11110 為 10 位地址的指示信號(hào),A9-A0 表示 10bits 地址:

42bbaa26-cbe9-11ed-bfe3-dac502259ad0.png

主機(jī)向從機(jī)寫(xiě)數(shù)據(jù)(需要 2 bytes)

42ce914a-cbe9-11ed-bfe3-dac502259ad0.png

主機(jī)從從機(jī)讀數(shù)據(jù)(需要 3 bytes)

42eac374-cbe9-11ed-bfe3-dac502259ad0.png

9、示波器波形圖示例

主機(jī)向從機(jī)寫(xiě)數(shù)據(jù)

42fe2a18-cbe9-11ed-bfe3-dac502259ad0.png

上圖中,大家會(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 本來(lái)就可以變換數(shù)據(jù),所以不會(huì)對(duì) I2C 通信產(chǎn)生負(fù)面影響,該毛刺一般不用關(guān)注。

如果覺(jué)得波形不美觀,可以找芯片原廠,看能否調(diào)整 master 控線的 setup time 和 hold time ,來(lái)減小該毛刺的幅值。

主機(jī)從從機(jī)讀數(shù)據(jù)

430e21f2-cbe9-11ed-bfe3-dac502259ad0.png

10、補(bǔ)充

I2C 不支持從設(shè)備在 SCL 和 SDA 總線上發(fā)起一個(gè)中斷,通知主設(shè)備來(lái)讀數(shù)據(jù)。有中斷需求的從設(shè)備需要額外接一根中斷線,通知主控?cái)?shù)據(jù)已經(jīng)準(zhǔn)備好,讓主控發(fā)起讀數(shù)據(jù)的操作。

這無(wú)疑增加了系統(tǒng)復(fù)雜性,多占用了 pin 腳。I3C 則不存在這種問(wèn)題,I3C 允許從設(shè)備在 SCL 和SDA 上發(fā)起中斷,叫“帶內(nèi)中斷”,I3C 后面會(huì)講。

4、I2C Synchronization And Arbitration

三個(gè)概念:時(shí)鐘延展、同步、仲裁

1、Clock stretching 時(shí)鐘延展

時(shí)鐘延展:通過(guò)將 SCL 線保持在低電平來(lái)暫停傳輸。在 SCL 再次拉高之前,傳輸無(wú)法進(jìn)行。

從機(jī)通過(guò)將 SCL 線拉低,強(qiáng)制主機(jī)進(jìn)入等待狀態(tài)。

時(shí)鐘延展功能是可選的,非必須。

byte level

時(shí)鐘延展導(dǎo)致需要更多時(shí)間來(lái)存儲(chǔ)接收到的字節(jié)或準(zhǔn)備另一個(gè)要傳輸?shù)淖止?jié)

bit level

通過(guò)延長(zhǎng)每個(gè)時(shí)鐘低電平周期來(lái)降低總線時(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è)備寫(xiě)還是從設(shè)備讀。一般情況下,如果操作對(duì)象是 EEPROM 或者其他簡(jiǎn)單設(shè)備而言,無(wú)所謂,但是,如果從設(shè)備是處理器,在接到主機(jī)命令后要去處理一些運(yùn)算然后得出結(jié)果返回給主機(jī)。這個(gè)時(shí)候可能造成來(lái)不及處理。怎么辦?這時(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 功能,所以,無(wú)法和帶有 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)并開(kāi)始傳送數(shù)據(jù),這樣就形成了沖突。要解決這種沖突,就要進(jìn)行仲裁的判決,這就是 I2C 總線上的仲裁。

I2C 總線上的仲裁分兩部分:SCL 線的同步和 SDA 線的仲裁,這兩部分沒(méi)有先后關(guān)系,是在同時(shí)進(jìn)行。

SCL Synchronization

所有主機(jī)都在 SCL 線上輸出自己的時(shí)鐘,因此同步過(guò)程需要定義自己的時(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 的同步原理。

同步過(guò)程如下圖:

主機(jī) 1 產(chǎn)生 CLK1,主機(jī) 2 產(chǎn)生 CLK2,同時(shí)向 SCL 線上輸出自己的時(shí)鐘,由于 CLK2 的低電平更長(zhǎng),因此 SCL 線上出現(xiàn)的電平和 CLK2 保持一致。因此在第一個(gè)周期中,CLK1 后期進(jìn)入了高電平等待狀態(tài)。后面 SCL 上的電平以 CLK2 為準(zhǔn)。

433f8ef4-cbe9-11ed-bfe3-dac502259ad0.png

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)通過(guò)仲裁只允許一個(gè)主節(jié)點(diǎn)可以繼續(xù)占據(jù)總線。

仲裁在 SDA 上進(jìn)行,此時(shí) SCL 為高電平。

A 主機(jī)傳輸高電平,B 主機(jī)傳輸?shù)碗娖剑珹 失去仲裁。

丟失仲裁的主機(jī)將生成時(shí)鐘脈沖,直到丟失仲裁的字節(jié)結(jié)束。

仲裁過(guò)程:

43575886-cbe9-11ed-bfe3-dac502259ad0.png

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ù)不一樣,就斷開(kāi)數(shù)據(jù)的輸出級(jí),轉(zhuǎn)為從機(jī)接收狀態(tài)。這樣主節(jié)點(diǎn)2就贏得了總線,而且數(shù)據(jù)沒(méi)有丟失,即總線的數(shù)據(jù)與主節(jié)點(diǎn)2所發(fā)送的數(shù)據(jù)一樣,而主節(jié)點(diǎn)1在轉(zhuǎn)為從節(jié)點(diǎn)后繼續(xù)接收數(shù)據(jù),同樣也沒(méi)有丟掉 SDA 線上的數(shù)據(jù)。因此在仲裁過(guò)程中數(shù)據(jù)沒(méi)有丟失。

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è)開(kāi)漏輸出 buffer, SCLH 有一個(gè)電流源上拉電路,這個(gè)電流源電路縮短了 SCLH 信號(hào)的上升時(shí)間。任何時(shí)侯在 Hs 模式只有一個(gè)主機(jī)的電流源有效。

沒(méi)有仲裁和時(shí)鐘同步,以加速位處理能力。仲裁過(guò)程一般在前面用 F/S 模式傳輸主機(jī)碼后結(jié)束。

以高電平和低電平是 1:2 的比率產(chǎn)生一個(gè)串行時(shí)鐘信號(hào)。解除了建立和保持時(shí)間的時(shí)序要求。

高速數(shù)據(jù) SDAH 和高速串行時(shí)鐘 SCLH 線通過(guò)這個(gè)電橋與 F/S 模式器件的 SDA 和 SCL 線分隔開(kāi)來(lái)。減輕了SDAH 和 SCLH 線的電容負(fù)載,使上升和下降時(shí)間更快。

Slave device

Hs 模式從機(jī)器件與 F/S 從機(jī)器件的唯一差別是它們工作的速度。Hs 模式從機(jī)在 SCLH 和 SDAH輸出有開(kāi)漏輸出 buffer 。SCLH 管腳可選的下拉晶體管可以用于拉長(zhǎng) 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í)序。沒(méi)有必要與其他總線系統(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è)開(kāi)關(guān)電阻電路,如下圖:

只有 Hs 模式器件的系統(tǒng)的物理 I2C 總線配置

43712da6-cbe9-11ed-bfe3-dac502259ad0.png

(可選)串聯(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)致波形上升沿過(guò)緩,所以加了電流源可以使上升沿很快。

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

438c56d0-cbe9-11ed-bfe3-dac502259ad0.png

由上圖可以看出,在快速模式(FS mode)下發(fā)送一個(gè) Master code,然后切換到高速模式(HS mode),發(fā)送從設(shè)備地址。

在第一階段 FS mode 時(shí)候,發(fā)送主機(jī)碼(0x0000 1xxx),這時(shí)候會(huì)進(jìn)行仲裁。因此 Hs mode 階段沒(méi)有時(shí)鐘同步和仲裁。

在中間的 HS mode 傳輸結(jié)束后,如果是一個(gè) STOP 信號(hào),則立刻回到 F/S mode,如果是 Sr 重復(fù)開(kāi)始i信號(hào),則依舊留在 Hs mode(右下角有說(shuō)明)

43a1e702-cbe9-11ed-bfe3-dac502259ad0.png

上圖為 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é)出來(lái),意思是說(shuō),不管你是單片機(jī)平臺(tái),還是 FreeRTOS 平臺(tái),還是 Linux 平臺(tái),I2C spec 都是一樣的,所以總結(jié)為一文方便大家查看。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6093

    瀏覽量

    183379
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    40

    文章

    3519

    瀏覽量

    128802
  • I2C總線
    +關(guān)注

    關(guān)注

    8

    文章

    384

    瀏覽量

    60663
  • MIPI
    +關(guān)注

    關(guān)注

    10

    文章

    303

    瀏覽量

    48372
  • SCL
    SCL
    +關(guān)注

    關(guān)注

    1

    文章

    239

    瀏覽量

    16990

原文標(biāo)題:I2C spec 總結(jié)

文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    i2c總線ppt(I2C總線器件應(yīng)用)

    I2C總線器件應(yīng)用第一節(jié) I2C總線器件應(yīng)用概述I2C總線工作原理
    發(fā)表于 08-13 17:34 ?0次下載

    i2c總線的特點(diǎn)

    i2c總線的特點(diǎn):2 I2C 總線使設(shè)計(jì)人員和廠商都得益.. 3 2.1 設(shè)計(jì)人員的得益.. 4 2.2 廠商的得益. 5
    發(fā)表于 08-05 09:05 ?26次下載

    I2C總線規(guī)范與I2C器件C51讀寫(xiě)程序

    I2C總線規(guī)范與I2C器件C51讀寫(xiě)程序:本文簡(jiǎn)要介紹了I2C總線,并給出了
    發(fā)表于 08-22 17:51 ?93次下載

    什么是i2c總線

    什么是i2c總線  下載請(qǐng)點(diǎn)擊: i2c總線協(xié)議中文版 
    發(fā)表于 11-05 09:26 ?2877次閱讀

    I2C總線詳解

    I2C總線定義  I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司開(kāi)發(fā)的兩線式串行總線,用于連接微控
    發(fā)表于 06-30 11:09 ?3774次閱讀

    基于CPLD的I2C總線接口設(shè)計(jì)

    在電路設(shè)計(jì)中,I2C總線是比較常用的兩線式串行通信方式,大多數(shù)的CPU都擅長(zhǎng)于并口操作,不具備直接操作I2C總線接口的能力。為了使不具備I2C
    發(fā)表于 02-12 16:11 ?95次下載
    基于CPLD的<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>接口設(shè)計(jì)

    基于51的I2c總線

    I2c總線,基于51的I2c總線,程序?qū)W習(xí)??靵?lái)下載學(xué)習(xí)吧
    發(fā)表于 01-13 11:49 ?34次下載

    i2c

    單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;單片機(jī)i2c總線操作;
    發(fā)表于 05-17 11:09 ?35次下載

    I2C總線的基本通信總結(jié)

    在電子設(shè)計(jì)開(kāi)發(fā)中I2C大家已經(jīng)很熟悉了,每一種電子產(chǎn)品小到電子開(kāi)關(guān),大到衛(wèi)星通信都會(huì)利用的I2C總線。據(jù)統(tǒng)計(jì)I2C在電子產(chǎn)品中占據(jù)了93%的份額,幾乎任何一種電路都要使用。
    的頭像 發(fā)表于 08-26 14:08 ?1.8w次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的基本通信<b class='flag-5'>總結(jié)</b>

    硬件I2C與模擬I2C

    硬件I2C對(duì)應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動(dòng)電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬的I2C;一般也較為穩(wěn)定,但
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與模擬<b class='flag-5'>I2C</b>

    一文詳解I2C總結(jié)的基礎(chǔ)知識(shí)

    博主將 I2C spec 文章總結(jié)為一篇,目錄如下
    的頭像 發(fā)表于 06-27 15:25 ?5943次閱讀

    SPI可以像I2C多個(gè)設(shè)備嗎?

    最近看到有小伙伴在討論:SPI可以像I2C多個(gè)設(shè)備嗎?
    的頭像 發(fā)表于 05-14 10:10 ?3361次閱讀
    SPI可以像<b class='flag-5'>I2C</b><b class='flag-5'>掛</b>多個(gè)<b class='flag-5'>設(shè)備</b>嗎?

    I2C總線多少設(shè)備

    I2C 總線多少設(shè)備? 7-bit address :2 的 7 次方,
    的頭像 發(fā)表于 07-25 09:45 ?3676次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b><b class='flag-5'>能</b><b class='flag-5'>掛</b>多少<b class='flag-5'>設(shè)備</b>

    I2C串行總線協(xié)議是什么?I2C總線有哪些優(yōu)點(diǎn)?

    1982年發(fā)明并推廣,用于連接智能傳感器和存儲(chǔ)器器件,以及控制和監(jiān)控外設(shè)。該協(xié)議是一種主從式通信協(xié)議,允許多個(gè)從設(shè)備連接到同一總線上,并在總線上進(jìn)行數(shù)據(jù)交換。I2C
    的頭像 發(fā)表于 09-12 11:18 ?1321次閱讀

    I2C總線多少設(shè)備 I2C架構(gòu)

    I2C總線多少設(shè)備? 理論上: 7-bit address :2 的 7 次方,
    的頭像 發(fā)表于 09-28 14:20 ?2484次閱讀
    <b class='flag-5'>I2C</b><b class='flag-5'>總線</b><b class='flag-5'>能</b><b class='flag-5'>掛</b>多少<b class='flag-5'>設(shè)備</b> <b class='flag-5'>I2C</b>架構(gòu)