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總結(jié)的基礎(chǔ)知識(shí)

xCb1_yikoulinux ? 來(lái)源:一口Linux ? 作者:一口Linux ? 2022-06-27 15:25 ? 次閱讀

博主將 I2C spec 文章總結(jié)為一篇,目錄如下

I2CIntroduction
I2CArchitecture
I2CTransfer
I2CSynchronizationAndArbitration
I2CHs-mode

1、I2C Introduction

1、I2C 歷史

  1. I2C:Inter-Integrated Circuit,集成電路總線。
  2. I2C 是 Philips 公司在 1982 年為主機(jī)板、嵌入式系統(tǒng)(短距)設(shè)計(jì)的一種簡(jiǎn)單、雙向二線制同步串行總線。
  3. Philips 半導(dǎo)體事業(yè)部就是現(xiàn)在的 NXP。
  4. I2C 的專利在 2006 年 11 月 1 日已到期,大家可以免費(fèi)使用。
  5. Intel 1995 年推出的 I2C 兼容總線(System Managerment Bus),即 SMBus 或 SMB
  6. 最新版本 I2C spec v.6 于 2014.04.04 推出。

2、I2C 的未來(lái)

  1. MIPI 協(xié)會(huì)在 2014 年左右定稿了 I3C (improved Inter Integrated Circuit)規(guī)范,I3C 在 I2C 的規(guī)格上建立了功能超集,支持高傳輸速率模式。
  2. 當(dāng)前不論是 Soc 廠商,還是 device 廠商,都已經(jīng)開(kāi)始或正在向 I3C 過(guò)度。
  3. I3C spec 有 2016 版本、2018 版本,最新的是 2021 版本(446頁(yè))。

3、I2C 的速度

  1. I2C 讀法:“I方C”、“I-squared-C”、"I two C"
  2. I2C 是一種低速、串行總線,有 SDA(串行數(shù)據(jù)線) 和 SCL(串行時(shí)鐘線) 兩條信號(hào)線,半雙工通信

通信速度如下:

? Bidirectional bus:

  1. Standard-mode (Sm), 100 kbit/s
  2. Fast-mode (Fm), 400 kbit/s,用在 sensor、carema、touch 等。
  3. Fast-mode Plus (Fm+),1 Mbit/s
  4. High-speed mode (Hs-mode),3.4 Mbit/s,用在 NFC、buck&boost 等

? Unidirectional bus:

  1. Ultra Fast-mode (UFm),5 Mbit/s

速度由 SCL 決定,不同模式對(duì)上升沿的要求不一樣,上升沿斜率受上拉電阻和等效電容影響。

4、I2C 是一種多主從架構(gòu)總線

  1. I2C 的讀寫(xiě)均由 master 端發(fā)起。
  2. I2C 通信的每一個(gè) byte(8bits)都需要 slaver 端的回應(yīng) ACK/NACK 作為回應(yīng)。
  3. 多 master 端需要引入仲裁機(jī)制。
  4. slaver 端通過(guò)設(shè)備地址區(qū)分,有 7bits 和 10 bits 等地址,還有一種 8bits 地址,實(shí)際上是 7bits + 讀寫(xiě)位。【其中7位地址 = 種類型號(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è)備地址去除,保留地址如下:

76cbc40a-f484-11ec-ba43-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ǔ)

76e098a8-f484-11ec-ba43-dac502259ad0.png

2、I2C Architecture

76f195fe-f484-11ec-ba43-dac502259ad0.png770b3f36-f484-11ec-ba43-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)速度。

771a1f9c-f484-11ec-ba43-dac502259ad0.png

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

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

77259a5c-f484-11ec-ba43-dac502259ad0.png

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

773696ae-f484-11ec-ba43-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 三極管:

77408a38-f484-11ec-ba43-dac502259ad0.png

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

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

774d13e8-f484-11ec-ba43-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口,因此,推挽輸出不支持線與。

77562226-f484-11ec-ba43-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 口。

7764af58-f484-11ec-ba43-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)。

777fe9f8-f484-11ec-ba43-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é):77963280-f484-11ec-ba43-dac502259ad0.png

77a57dc6-f484-11ec-ba43-dac502259ad0.png

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

77b14ce6-f484-11ec-ba43-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)模式 :

77c2c6f6-f484-11ec-ba43-dac502259ad0.png

快速模式:

77d08c46-f484-11ec-ba43-dac502259ad0.png

高速模式:

77dc7db2-f484-11ec-ba43-dac502259ad0.png

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

77ea9474-f484-11ec-ba43-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)系圖

77f9c728-f484-11ec-ba43-dac502259ad0.png

3、I2C Transfer

0、Definition of timing

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

78185df0-f484-11ec-ba43-dac502259ad0.png
  1. 建立時(shí)間(Tsu):時(shí)鐘上升沿到來(lái)之前,輸入端數(shù)據(jù)已經(jīng)到來(lái)并穩(wěn)定持續(xù)的時(shí)間間隔。
  2. 保持時(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:

78261dc8-f484-11ec-ba43-dac502259ad0.png7830a7fc-f484-11ec-ba43-dac502259ad0.png784403f6-f484-11ec-ba43-dac502259ad0.png7856d1c0-f484-11ec-ba43-dac502259ad0.png78660a3c-f484-11ec-ba43-dac502259ad0.png7884832c-f484-11ec-ba43-dac502259ad0.png

Master

  1. 提供時(shí)鐘 SCL
  2. 開(kāi)啟和停止數(shù)據(jù)傳輸
  3. 尋址其他設(shè)備

slave

  1. 被主設(shè)備尋址

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

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

789584ec-f484-11ec-ba43-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ì)理解)

78a4e540-f484-11ec-ba43-dac502259ad0.png

byte format

  1. 傳輸長(zhǎng)度必須是一個(gè)字節(jié)(8 bit)
  2. 每次傳輸?shù)淖止?jié)不受限制
  3. 數(shù)據(jù)必須以 MSB 開(kāi)頭進(jìn)行傳輸,也就是先傳輸最高位
  4. 從機(jī)可以將時(shí)鐘線 SCL 保持在低位,迫使主機(jī)進(jìn)入等待狀態(tài)。78b90926-f484-11ec-ba43-dac502259ad0.png78cd3eb4-f484-11ec-ba43-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。

78dd5042-f484-11ec-ba43-dac502259ad0.png

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

  1. 主機(jī)發(fā)送到總線上的地址,卻沒(méi)有匹配的從機(jī),因此出現(xiàn) NACK
  2. 從機(jī)處于 busy 狀態(tài),出現(xiàn) NACK
  3. 在傳輸過(guò)程中,從機(jī)獲取其不理解的數(shù)據(jù)或命令。
  4. 在傳輸過(guò)程中,從機(jī)無(wú)法再接收任何數(shù)據(jù)字節(jié)。
  5. 主接收機(jī)必須向從發(fā)射機(jī)發(fā)送傳輸結(jié)束的信號(hào)的時(shí)候,會(huì)出現(xiàn) NACK。

4、write data

78f35518-f484-11ec-ba43-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

7907e50a-f484-11ec-ba43-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ù)合格式

7914d4cc-f484-11ec-ba43-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

  1. 以 START 條件開(kāi)始
  2. 以 STOP 條件結(jié)束
  3. 傳輸?shù)牡谝粋€(gè)字節(jié)為 7bit 從機(jī)地址 + 1bit 讀寫(xiě)位
  4. 每個(gè)總線上的設(shè)備都會(huì)比較 STRAT 信號(hào)后面的 7bit 地址與自己的地址是否匹配
  5. 每個(gè) byte(8 bits) 后面都會(huì)有 ACK 或者 NACK
  6. 在 START 信號(hào)或者 repeated START 信號(hào)后,從機(jī)必須重置自己的總線邏輯
  7. 一個(gè) START 后面緊跟著一個(gè) STOP 信號(hào),是非法格式
  8. 主機(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 地址:

792b5e36-f484-11ec-ba43-dac502259ad0.png

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

7941c2e8-f484-11ec-ba43-dac502259ad0.png

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

794dd6e6-f484-11ec-ba43-dac502259ad0.png

9、示波器波形圖示例

  1. 主機(jī)向從機(jī)寫(xiě)數(shù)據(jù)
795b84f8-f484-11ec-ba43-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)減小該毛刺的幅值。

  1. 主機(jī)從從機(jī)讀數(shù)據(jù)
796ef326-f484-11ec-ba43-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í)鐘延展

  1. 時(shí)鐘延展:通過(guò)將 SCL 線保持在低電平來(lái)暫停傳輸。在 SCL 再次拉高之前,傳輸無(wú)法進(jìn)行。
  2. 從機(jī)通過(guò)將 SCL 線拉低,強(qiáng)制主機(jī)進(jìn)入等待狀態(tài)。
  3. 時(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)。

797e6bd0-f484-11ec-ba43-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ù)總線。

  1. 仲裁在 SDA 上進(jìn)行,此時(shí) SCL 為高電平。
  2. A 主機(jī)傳輸高電平,B 主機(jī)傳輸?shù)碗娖剑珹 失去仲裁。
  3. 丟失仲裁的主機(jī)將生成時(shí)鐘脈沖,直到丟失仲裁的字節(jié)結(jié)束。
仲裁過(guò)程:
79963c10-f484-11ec-ba43-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>

  1. 速度高達(dá) 3.4MHz。
  2. 用的是 SDAH 和 SCLH 信號(hào)線,不是 SDA 和 SCL

Master device

  1. SDAH/SCLH 有一個(gè)開(kāi)漏輸出 buffer, SCLH 有一個(gè)電流源上拉電路,這個(gè)電流源電路縮短了 SCLH 信號(hào)的上升時(shí)間。任何時(shí)侯在 Hs 模式只有一個(gè)主機(jī)的電流源有效。
  2. 沒(méi)有仲裁和時(shí)鐘同步,以加速位處理能力。仲裁過(guò)程一般在前面用 F/S 模式傳輸主機(jī)碼后結(jié)束。
  3. 以高電平和低電平是 1:2 的比率產(chǎn)生一個(gè)串行時(shí)鐘信號(hào)。解除了建立和保持時(shí)間的時(shí)序要求。
  4. 高速數(shù)據(jù) SDAH 和高速串行時(shí)鐘 SCLH 線通過(guò)這個(gè)電橋與 F/S 模式器件的 SDA 和 SCL 線分隔開(kāi)來(lái)。減輕了SDAH 和 SCLH 線的電容負(fù)載,使上升和下降時(shí)間更快。

Slave device

  1. Hs 模式從機(jī)器件與 F/S 從機(jī)器件的唯一差別是它們工作的速度。Hs 模式從機(jī)在 SCLH 和 SDAH輸出有開(kāi)漏輸出 buffer 。SCLH 管腳可選的下拉晶體管可以用于拉長(zhǎng) SCLH 信號(hào)的低電平,但只允許在 Hs 模式傳輸?shù)捻憫?yīng)位后進(jìn)行。
  2. Hs 模式器件的輸出可以抑制毛刺,而且 SDAH 和 SCLH 輸出有一個(gè) Schmitt 觸發(fā)器
  3. Hs 模式器件的輸出緩沖器對(duì) SDAH 和 SCLH 信號(hào)的下降沿有斜率控制功能
  4. 調(diào)整了串行數(shù)據(jù) SDA 和串行時(shí)鐘 SCL 信號(hào)的時(shí)序。沒(méi)有必要與其他總線系統(tǒng)如 CBUS 兼容,它們不能在增加的位速率下工作。
  5. 如果快速模式器件的電源電壓被關(guān)斷,SDA 和 SCL 的 I/O 管腳必須懸空,不能阻塞總線。
  6. 連接到總線的外部上拉器件必須調(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 總線配置

79ae8f5e-f484-11ec-ba43-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

  1. START condition (S)
  2. 8-bit master code (0000 1XXX)
  3. Not-acknowledge bit (A)

2、在 Hs 模式下啟用電流源上拉電路

3、在下一次重復(fù)啟動(dòng)條件后,依舊在 Hs-mode

79c94394-f484-11ec-ba43-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ō)明)

79d5ab70-f484-11ec-ba43-dac502259ad0.png

上圖為 Hs mode 完整通信波形示意圖。先在快速模式下發(fā)送主機(jī)碼,不需要從機(jī)回復(fù)。然后切換到高速模式,會(huì)發(fā)送一個(gè) reSTART,然后進(jìn)行數(shù)據(jù)傳輸。

需要注意如下幾點(diǎn):

  1. 右上角 t1 到 tH 時(shí)間之內(nèi),可以進(jìn)行時(shí)鐘延展。
  2. Hs mode 中,只能在 byte level 級(jí)別進(jìn)行時(shí)鐘延展,也就是一個(gè) byte 傳輸結(jié)束后進(jìn)行時(shí)鐘延展。
  3. 注意左下角的示意圖,如果是直上直下的這種波形,是主機(jī)電流源上拉。如果是緩坡上升沿,則是電阻上拉。

博主將 I2C spec 單獨(dú)總結(jié)出來(lái),意思是說(shuō),不管你是單片機(jī)平臺(tái),還是 FreeRTOS 平臺(tái),還是 Linux 平臺(tái),I2C spec 都是一樣的,所以總結(jié)為一文方便大家查看。

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

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

審核編輯:湯梓紅
聲明:本文內(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)注

    10

    文章

    2817

    瀏覽量

    87699
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1452

    瀏覽量

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

    關(guān)注

    8

    文章

    384

    瀏覽量

    60663

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詳解I2C接口

    I2C與SPI類似,I2C常用來(lái)為電路板層次的集成電路、傳感器等元件的連接提供短程接口。
    發(fā)表于 03-15 17:05 ?1.5w次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>詳解</b><b class='flag-5'>I2C</b>接口

    I2C通信開(kāi)發(fā)障礙以及總結(jié)

    本文主要講解的是I2C開(kāi)發(fā)過(guò)程中會(huì)遇到的坑以及I2C的個(gè)人總結(jié)經(jīng)驗(yàn),很實(shí)用,可以i幫助開(kāi)發(fā)人員更好的理解I2C調(diào)試。
    的頭像 發(fā)表于 04-17 16:35 ?1219次閱讀
    <b class='flag-5'>I2C</b>通信開(kāi)發(fā)障礙以及<b class='flag-5'>總結(jié)</b>

    I2C讀寫(xiě)時(shí)序分析和實(shí)現(xiàn)思路

    上篇推對(duì)I2C總線的特性進(jìn)行了介紹和描述。對(duì)于開(kāi)發(fā)者而言,最重要的是編碼I2C的讀寫(xiě)時(shí)序驅(qū)動(dòng)。本篇推主要總結(jié)和分享
    發(fā)表于 10-01 16:54 ?1357次閱讀
    <b class='flag-5'>I2C</b>讀寫(xiě)時(shí)序分析和實(shí)現(xiàn)思路

    I2C總線原理詳解

    I2C兩線式串行總線通訊協(xié)議,它是由飛利浦開(kāi)發(fā)的,主要用于連接微控制器及其外圍設(shè)備之間,它是由數(shù)據(jù)線SDA和信號(hào)線SCL構(gòu)成的,可發(fā)送和接收數(shù)據(jù)即在MUC和I2C設(shè)備之間,I2CI2C
    發(fā)表于 10-18 17:20 ?1939次閱讀
    <b class='flag-5'>I2C</b>總線原理<b class='flag-5'>詳解</b>

    I2C通信詳解

    救!《【STM32-I2C學(xué)習(xí)總結(jié)】STM32:硬件-IIC詳解 , 固件庫(kù)編程 , 手把手教你實(shí)現(xiàn)IIC》這里是我以前寫(xiě)的,硬件實(shí)現(xiàn)I2C
    發(fā)表于 02-28 11:24

    I2C Guid I2C指南

    I2C Guid  I2C指南 The I2C bus is used in a wide rangeof applications because it is simpleand
    發(fā)表于 04-23 13:55 ?36次下載

    I2C總線詳解

    I2C總線定義  I2C(Inter-Integrated Circuit)總線是種由PHILIPS公司開(kāi)發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。I2C總線產(chǎn)生于在80年代
    發(fā)表于 06-30 11:09 ?3774次閱讀

    i2c

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

    I2C資料總結(jié)

    I2C資料總結(jié)及實(shí)際問(wèn)題解析
    發(fā)表于 08-16 10:35 ?2次下載

    I2C總線的基礎(chǔ)知識(shí)

    如果用GPIO口模擬I2C總線,并實(shí)現(xiàn)雙向傳輸,則需個(gè)輸入輸出口(SDA),另外還需個(gè)輸出口(SCL)。
    發(fā)表于 07-16 17:52 ?1869次閱讀

    I2C基礎(chǔ)知識(shí)入門(mén)簡(jiǎn)單介紹

    會(huì)被忽略的問(wèn)題,于是結(jié)合自己以前的項(xiàng)目經(jīng)驗(yàn),簡(jiǎn)單再總結(jié)I2C,由于認(rèn)知偏差,寫(xiě)完之后,長(zhǎng)吁口氣,感覺(jué)自己好像懂了。 目錄 背景 硬件層 數(shù)據(jù)傳輸協(xié)議 實(shí)際上如何工作? 單個(gè)主設(shè)備
    的頭像 發(fā)表于 12-02 14:29 ?4550次閱讀

    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'>總結(jié)</b>

    看懂I2C協(xié)議

    文章目錄I2C是什么5種速率4種信號(hào)起始信號(hào)停止信號(hào)數(shù)據(jù)有效性應(yīng)答信號(hào)非應(yīng)答信號(hào)讀寫(xiě)時(shí)序7位和10位地址I2C保留字節(jié)FPGA實(shí)測(cè)I2C波形SPI和I2C的對(duì)比官方標(biāo)準(zhǔn)文檔下載1.
    發(fā)表于 12-05 19:21 ?15次下載
    <b class='flag-5'>一</b><b class='flag-5'>文</b>看懂<b class='flag-5'>I2C</b>協(xié)議

    硬件I2C與模擬I2C

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

    Linux I2C驅(qū)動(dòng)入門(mén)知識(shí)科普

    I2C 總線驅(qū)動(dòng), I2C總線驅(qū)動(dòng)就是SOC的 I2C控制器驅(qū)動(dòng),也叫做 I2C適配器驅(qū)動(dòng)。
    的頭像 發(fā)表于 12-29 13:59 ?1528次閱讀