當(dāng)前位置:首頁 > 公眾號精選 > 大魚機(jī)器人
[導(dǎo)讀]本文來梳理一下 I2C總線的一些要點(diǎn)。這個題目有點(diǎn)大,本文對于 I2C 其實(shí)很多地方也沒整清楚,只為了與前文形成系列,如果大家有補(bǔ)充歡迎留言。

[導(dǎo)讀] 前文總結(jié)了單片機(jī)串口個人認(rèn)為值得注意的一些要點(diǎn),本文來梳理一下 I2C 總線的一些要點(diǎn)。 這個題目有點(diǎn)大,本文對于 I2C 其實(shí)很多地方也沒整清楚,只為了與前文形成系列,如果大家有補(bǔ)充歡迎留言。 說了些閑話,進(jìn)入正題吧。

I2C 之前世今生

(Inter-Integrated Circuit),是一種同步、多主、多從、分組交換、單端、串行計算機(jī)總線,由飛利浦半導(dǎo)體(現(xiàn)在的 NXP 半導(dǎo)體)在 1982 年發(fā)明。它廣泛用于在短距離、板內(nèi)通信中將低速外設(shè)集成電路附加到處理器和微控制器上。 也可以寫成 I2C 或 IIC。

自 2006 年 10 月 10 日起,實(shí)施 I2C 協(xié)議不需要任何許可費(fèi)用。但是,獲得恩智浦分配的 I2C 從設(shè)備地址則需要付費(fèi)。一些競爭者如西門子(后來的英飛凌技術(shù),現(xiàn)在的英特爾移動通信)、NEC、德州儀器 TI、意法半導(dǎo)體(以前的 SGS-Thomson)、摩托羅拉(后來的飛思卡爾,現(xiàn)在與 NXP 合并)、Nordic 半導(dǎo)體和 Intersil,自 20 世紀(jì) 90 年代中期以來已經(jīng)陸續(xù)發(fā)布了很多兼容的 I2C 標(biāo)準(zhǔn)的芯片。

說到總線,其種類很多,但其目的基本一致,就是一個用于傳遞信息的公共干線。如芯片內(nèi)部地址總線、數(shù)據(jù)總線其對象可能為CPU核與各外設(shè)(RAM/ROM/外設(shè)控制器電路等);芯片級總線I2C,SPI等,設(shè)備級總線如RS422/RS485/HART/CAN/Ethernet/Fieldbus......

速度模式

自 Version 4 之后 I2C 支持下面幾種模式:

  • 雙向總線
    • standard-mode(Sm): ≤100 Kbit/S
    • Fast-Mode(Fm):≤400 Kbit/S
    • Fast-mode Plus(Fm+):≤1Mbit/S
    • High-speed mode (Hs-mode): ≤ 3.4 Mbit/s
  • 單向總線:
    • Ultra Fast-mode (UFm): ≤ 5 Mbit/s

I2C優(yōu)勢

I2C 標(biāo)準(zhǔn)能帶來些啥好處呢?

  • 簡單的 2 線串行 I2C 總線最小化互連,節(jié)省 PCB 布板走線空間;
  • 完全集成的 I2C 總線協(xié)議消除了地址解碼器。
  • I2C 總線的多主控能力允許終端用戶設(shè)備通過外部連接到裝配線進(jìn)行快速測試和校準(zhǔn)。
  • 標(biāo)準(zhǔn)支持廣泛,大量無鉛封裝 I2C 總線兼容集成芯片進(jìn)一步降低了空間需求。

其他子集

系統(tǒng)管理總線(SMBus),由 Intel 在 1995 年定義,是 I2C 的一個子集,定義了更嚴(yán)格的用法。SMBus 的一個目的是促進(jìn)健壯性和互操作性。因此,現(xiàn)代 I2C 系統(tǒng)合并了來自 SMBus 的一些策略和規(guī)則,有時同時支持 I2C 和 SMBus,只需要通過命令或輸出引腳使用最小限度的重新配置。

TWI(雙線接口)或 TWSI(雙線串行接口),本質(zhì)上是在 Atmel 和其他供應(yīng)商的各種系統(tǒng)芯片處理器上實(shí)現(xiàn)的同一總線。

I2C 拓?fù)浣Y(jié)構(gòu)

從概念上,I2C 總線有兩根線 SDA/SCL 就可以連一堆芯片,實(shí)現(xiàn)很多的應(yīng)用。連接拓?fù)錁O簡!

比如這樣一個系統(tǒng):

  • LCD 顯示
  • ADC 采樣
  • EEPROM/FRAM 非易失存儲
  • 溫度采集
  • .....

接下來看看各模式下,連接拓?fù)鋱D:

標(biāo)準(zhǔn)速度/快速模式

高速模式拓?fù)?/strong>:

混速模式拓?fù)?/strong>

工作原理

如果使用 IO 口模擬 I2C 總線,或者使用 FPGA 實(shí)現(xiàn) I2C 接口,深刻理解 I2C 時序波形無疑是重點(diǎn)中的重點(diǎn)!即使使用內(nèi)置的 I2C 控制器外設(shè)實(shí)現(xiàn)一個 I2C 總線編程,在調(diào)試底層時或者踩坑過程中,深入理解時序波形原理,也是非常必要的!

時序圖

I2C 的時序圖如下:

  • START 事件:可以聯(lián)想一下 UART 的起始位,這個用于通知 I2C 通信的發(fā)起。用一句話描述就是在 SCL 常高時,采集到 SDA 高到低跳變,這就是啟動事件。

  • 數(shù)據(jù)有效性SDA 線上的數(shù)據(jù)必須在時鐘的高周期保持穩(wěn)定。數(shù)據(jù)線的高或低狀態(tài)只能在 SCL 線上的時鐘信號低時改變。每個傳輸?shù)臄?shù)據(jù)位產(chǎn)生一個時鐘脈沖。

  • ACK:確認(rèn)信號 ACK 的定義如下:發(fā)送器在 ACK 時鐘脈沖期間釋放 SDA 線,因此接收器可以將 SDA 線拉低,并在此時鐘脈沖的高電平期間保持穩(wěn)定的低電平(見上圖)。須嚴(yán)格遵循電氣的建立保持時間,使用時需要用示波器去嚴(yán)格測試信號是否能滿足這些參數(shù)。

  • NACK:當(dāng)在第九個時鐘脈沖期間 SDA 保持高電平時,這被定義為“NACK”信號。之后主機(jī)可以產(chǎn)生停止條件以中止傳輸,或產(chǎn)生重復(fù)的開始條件以開始新的傳輸。導(dǎo)致 NACK 產(chǎn)生的條件有五個:

  1. 總線上沒有報文中所包含地址的接收器,因此沒有設(shè)備響應(yīng)應(yīng)答。
  2. 接收器無法執(zhí)行接收或發(fā)送操作,比如它正在執(zhí)行某些實(shí)時功能,并且尚未準(zhǔn)備好與主機(jī)進(jìn)行通信。
  3. 在傳輸過程中,接收器收到應(yīng)用協(xié)議不理解的數(shù)據(jù)或命令。
  4. 在傳輸期間,接收器無法再接收更多有效數(shù)據(jù)字節(jié)。比如程序或者芯片內(nèi)置緩沖區(qū)已經(jīng)滿了
  5. 主接收器用 NACK 通知從發(fā)送器結(jié)束傳輸。這是何意呢?比如主設(shè)備已經(jīng)接受到足夠多的數(shù)據(jù),不希望從設(shè)備發(fā)送更多的數(shù)據(jù)時,就可以 NACK 從設(shè)備,這樣從設(shè)備就會停止發(fā)送

時鐘同步與仲裁

  • 時鐘同步:兩個主機(jī)可以同時開始在空閑總線上進(jìn)行傳輸,并且必須有一種方法來確定控制總線并完成其傳輸?shù)姆椒?。這是通過時鐘同步和仲裁完成的。在單主機(jī)系統(tǒng)中,不需要時鐘同步和仲裁。

    時鐘同步是通過 I2C 接口中 SCL 線的線與實(shí)現(xiàn)的。啥意思呢?

    這里的幾句話需要劃重點(diǎn)去理解,這就是 I2C 總線的核心之核心工作原理:線與!

    • 當(dāng) SCL 從高到低的過渡時,總線上的主機(jī)開始計數(shù)其低電平時間,且一旦主機(jī)時鐘變?yōu)榈?,它就會?SCL 保持在該狀態(tài),直到變?yōu)楦郀顟B(tài)為止。
    • 但是,如果另一個主機(jī)時鐘仍在其低周期內(nèi),則此時鐘從低到高的轉(zhuǎn)變不會改變 SCL 線的狀態(tài)。所以, SCL 線由主機(jī)以最長的低電平周期保持為低電平。 低電平周期較短的主機(jī)在此期間進(jìn)入高電平等待狀態(tài)
    • 上面的話不好理解?看看 線與的本質(zhì)是 ,啥叫與呢?比如 C=A&B,只要其中一個變量 A/B 為低,那么 C 就必然為 0,比如下圖中,即便 CLK1(為其中一個主機(jī))為高了,但奈何另一主機(jī)的 CLK2 任然為低啊?所以 SCL 線上測出來就是低。
    • 當(dāng)所有相關(guān)的主機(jī)都計數(shù)完低電平周期后,時鐘線被釋放并變?yōu)楦唠娖?。這樣,主時鐘和 SCL 線的狀態(tài)之間就沒有區(qū)別,所有主時鐘都開始計數(shù)其高電平周期。第一個完成其高電平周期的主機(jī)將 SCL 線再次拉低。
  • 仲裁:仲裁與同步類似,僅在系統(tǒng)中使用多個主機(jī)時才會涉及到,從站不參與仲裁過程。首先要理解一下仲裁是干啥的?所謂仲裁就是在多主機(jī)模式下,哪一個主機(jī)能獲取介質(zhì)的訪問權(quán)限,獲得權(quán)限的主機(jī)才可以傳輸 I2C 通信報文。只有在總線空閑時,主機(jī)才可以開始傳輸。兩個主機(jī)可以在 START 的最小保持時間內(nèi)產(chǎn)生 START 條件這種情況會導(dǎo)致總線上出現(xiàn)有效的 START 條件。然后需要仲裁以確定哪個主機(jī)將完成其傳輸。

    仲裁是一位一位地進(jìn)行。節(jié)點(diǎn)發(fā)送 1 個位后,回讀比較總線上所呈現(xiàn)的數(shù)據(jù)與自己發(fā)送的是否一致。是,繼續(xù)發(fā)送;否則,退出競爭。SDA 線的仲裁可以保證 I2C 總線系統(tǒng)在多個主節(jié)點(diǎn)同時企圖控制總線時通信正常進(jìn)行并且數(shù)據(jù)不丟失??偩€系統(tǒng)通過仲裁只允許一個主節(jié)點(diǎn)可以繼續(xù)占據(jù)總線

  • 上圖顯示了兩個主機(jī)的仲裁程序。實(shí)際使用中連接到總線的主機(jī)數(shù)量可能會更多。當(dāng)主機(jī)產(chǎn)生的 DATA1 的內(nèi)部數(shù)據(jù)電平與 SDA 線上的實(shí)際電平之間存在差異時,DATA1 輸出將關(guān)閉。從而主機(jī) 1 退出競爭,沒有獲得總線的控制權(quán)。

  • 時鐘延長:時鐘延長通過將 SCL 線保持為低電平來暫停事務(wù)。直到再次釋放高電平,事務(wù)才能繼續(xù)。時鐘延長是可選的,實(shí)際上,大多數(shù)從設(shè)備不包括 SCL 驅(qū)動能力,因此它們無法延長時鐘。

    為啥要設(shè)計這樣一個機(jī)制呢?個人理解是為了增強(qiáng)系統(tǒng)的健壯性而設(shè)計的:

    • 在字節(jié)傳輸級別,設(shè)備可能能夠以快速速率接收數(shù)據(jù)字節(jié),但需要更多時間來存儲接收到的字節(jié)或準(zhǔn)備另一個要發(fā)送的字節(jié)。此時,從機(jī)可以在接收和確認(rèn)字節(jié)后將 SCL 線保持為 LOW,以強(qiáng)制主機(jī)進(jìn)入等待狀態(tài),直到從機(jī)為握手過程中的下一個字節(jié)傳輸做好準(zhǔn)備。

    • 在位級別上,諸如微控制器之類的設(shè)備可以通過延長每個時鐘的 LOW 周期來減慢總線時鐘。任何主機(jī)的速度都將根據(jù)該設(shè)備的內(nèi)部工作速率進(jìn)行調(diào)整。

地址及 R/W 位:

地址及 R/W:

  • 7 位地址:分讀寫兩種情況

  • 10 位地址:分讀寫兩種情況

  • 保留地址

設(shè)備地址 讀寫位 描述
0000 000 0 廣播地址
0000 000 1 啟動字節(jié)
0000 001 X CBUS 地址
0000 010 X 預(yù)留給不同的總線格式
0000 011 X 預(yù)留未來擴(kuò)展使用
0000 1XX 1 Hs-mode 主代碼
1111 1XX 1 設(shè)備 ID
1111 0XX X 10 位從地址

通用廣播地址

通用廣播地址用于同時尋址連接到 I2C 總線的所有設(shè)備。但是,如果設(shè)備不需要處理廣播數(shù)據(jù),則可以通過不發(fā)出 ACK 來忽略該地址。如果某設(shè)備需要來自通用廣播地址的數(shù)據(jù),它將發(fā)送 ACK 給該地址并充當(dāng)從接收器。主機(jī)實(shí)際上不知道有一個或多個設(shè)備響應(yīng)時確認(rèn)了廣播數(shù)據(jù)(不確定有多少個 ACK)。每個能夠處理此數(shù)據(jù)的從機(jī)接收器都會確認(rèn)第二個字節(jié)和隨后的字節(jié)。無法處理這些字節(jié)的從機(jī)將不應(yīng)答從而忽略。同樣,如果一個或多個從機(jī)應(yīng)答,則主機(jī)不會看到未確認(rèn)的消息。通用廣播地址的含義總是在第二個字節(jié)中指定,如下圖:

1.當(dāng) B 為 0 時,第 2 字節(jié)定義如下:

  • 0000 0110(06h):設(shè)備將復(fù)位以及設(shè)置地址的可編程部分。接收到這個 2 字節(jié)命令后,所有支持響應(yīng)通用廣播地址的設(shè)備將復(fù)位,并將其地址的可編程部分改寫保存。 須采取預(yù)防措施以確保設(shè)備在施加電源電壓后不會拉低 SDA 或 SCL 線,因?yàn)檫@些低電平會阻塞總線。
  • 0000 0100 (04h):收到該命令后設(shè)備將通過硬件設(shè)置地址的可編程部分。(Write programmable part of slave address by hardware).
  • 0000 0000 (00h): 不允許將此代碼用作第二個字節(jié).

對于 06h/04h 這兩個命令,有些不太好理解。復(fù)位比較好理解。對于設(shè)置設(shè)備地址的可編程部分可能很多沒有遇到過的朋友則不太好理解。這里來一個實(shí)際芯片的例子,以 Microchip 的 MCP3423/MCP3424 為例進(jìn)行描述一下,MCP3423/MCP3424 是一顆多通道 ADC 芯片,其芯片引腳如下:

當(dāng)接收到通用廣播訪問且第 2 字節(jié)為 06h 命令后,芯片做兩件事情:

  • 芯片復(fù)位如上電復(fù)位的行為一樣
  • 同時鎖住 Adr1/Adr0 的電平作為地址,這兩位地址為芯片地址的可編程部分。

當(dāng)然對于不同的芯片,具體如何實(shí)現(xiàn)通用廣播地址的處理則各有不同,只需要認(rèn)真閱讀芯片的手冊就能獲取相應(yīng)信息。這里僅僅就通用廣播地址舉個栗子,方便理解。老實(shí)說這個功能好像不太常見,具體有什么用?我反正沒這么用過,感覺這功能有點(diǎn)蛋疼(直接用電阻配置好不更省事?)。如果有好的應(yīng)用實(shí)例場景,歡迎留言交流。

2.當(dāng) B 為“ 1”時,則該 2 字節(jié)序列為“硬件通用呼叫”。該報文由 I2C 主設(shè)備(例如鍵盤掃描器)發(fā)送,可以對其進(jìn)行編程以發(fā)送所需的從地址。由于 I2C 主設(shè)備事先不知道該消息必須傳輸?shù)侥膫€從設(shè)備,故利用通用廣播地址及通用呼叫命令并將自身的地址放在高 7 位,從而標(biāo)識總線上發(fā)送通用硬件呼叫的設(shè)備 ID。該地址由連接到總線的智能設(shè)備識別(比如該智能設(shè)備是一個單片機(jī)系統(tǒng)),然后該智能設(shè)備從硬件主機(jī)接收信息。如果硬件主機(jī)也可以充當(dāng)從機(jī),則從機(jī)地址與主機(jī)地址相同。

所以標(biāo)準(zhǔn)中定義這個功能,可以做些自適應(yīng)應(yīng)用,只需要制定出相應(yīng)協(xié)議就可以完成比較靈活的多主通信應(yīng)用協(xié)議。

軟復(fù)位

如上面描述,當(dāng)通用廣播地址后面跟 06h 字節(jié),就可以使從設(shè)備軟復(fù)位。但這個功能并非所有芯片都支持,具體使用的時候需要仔細(xì)閱讀芯片手冊是否支持該功能。

須采取預(yù)防措施以確保設(shè)備在施加電源電壓后不會拉低 SDA 或 SCL 線,因?yàn)檫@些低電平會阻塞總線。

起始 START 字節(jié)

單片機(jī)/DSP 可以用兩種方法連接到 I2C 總線:

  • 有的單片機(jī)/DSP 具有片上 I2C 硬件外設(shè),這就可以直接使用。
  • 如果沒有或者被其他功能占用,則可以使用 GPIO 去模擬 I2C 總線時序。用這個方式去實(shí)現(xiàn),則比較消耗 CPU 時間,

比如在一個多單片機(jī)用 I2C 總線連一起的系統(tǒng),其中一個單片機(jī) I2C 是用 IO 口模擬的,則快速的硬件設(shè)備與依賴軟件輪詢的相對較慢的單片機(jī)之間存在速度差異。這個不難想象,因?yàn)橐揽枯喸儎t不是硬實(shí)時,同時單片機(jī)肯定還有其他事物需要處理,那么檢測 START 條件信號就有可能丟失,導(dǎo)致系統(tǒng)不健壯。那么 I2C 標(biāo)準(zhǔn)已然考慮這種需求了。

這就是起始字節(jié)需要解決的需求,前面介紹的就是起始字節(jié)設(shè)計的背景。那么起始字節(jié)究竟是怎樣的呢?

  • START 事件(英文叫 condition,我這樣叫成一個事件有一點(diǎn)軟件原語抽象的意思)
  • START 字節(jié) 0000 0001
  • ACK
  • 重復(fù) START 事件

在需要訪問總線的主機(jī)發(fā)送了 START 事件之后,發(fā)送 START 字節(jié)(0000 0001)。另一個單片機(jī)/DSP 可以以低采樣率對 SDA 線進(jìn)行采樣,直到檢測到 START 字節(jié)中的七個零之一為止。在 SDA 線上檢測到此 LOW 電平后,微控制器可以切換到更高的采樣率,以找到重復(fù)的 START 事件,然后將其用于同步。

總線復(fù)位

在異常情況下,如果時鐘 SCL 被拉為 LOW 了,則有哪些辦法可以對總線復(fù)位呢?

  • 則優(yōu)選的做法是如 I2C 設(shè)備具有硬件復(fù)位輸入,則使用硬件復(fù)位信號來復(fù)位總線。
  • 如果 I2C 設(shè)備沒有硬件復(fù)位輸入信號,如果硬件設(shè)計可以考慮用 MOSFET 控制設(shè)備電源,重新通電以激活強(qiáng)制性的內(nèi)部上電復(fù)位(POR)電路。
  • 還有一種做法是主機(jī) 發(fā)送 9 個時鐘 SCL 脈沖。使總線保持低電平的設(shè)備應(yīng)在這九個時鐘內(nèi)的某個時間釋放它。這個具體怎么做呢? 主設(shè)備初始化 I2C 總線時,可以冗余加 9 個 SCL 脈沖以復(fù)位 I2C 總線,或者檢測到 SCL 長時間被拉低后,可以以控制 IO 高低翻轉(zhuǎn)的方式控制 SCL 產(chǎn)生 9 個脈沖
//可能需要先關(guān)閉I2C控制器,如果是使用I2C控制器外設(shè)實(shí)現(xiàn)的//I2C_SCL根據(jù)不同硬件進(jìn)行移植,delay#define I2C_SCL P10void soft_rst_i2c(void){ I2C_SCL = 1; for(int i=0;i<9;i++) { I2C_SCL = 0; delay(xx); I2C_SCL = 1; delay(xx); }}

前面兩種方法是更健壯的方案,如果硬件不支持,可以考慮后一種方法,但后一種方法的前提是拉死 SCL 的設(shè)備需要支持這種功能,如果兩端都是自定義開發(fā)的則比較靈活了。

總線鎖死,是 I2C 總線系統(tǒng)常踩的坑,有哪些原因會導(dǎo)致鎖死呢?程序不健壯,I2C 的波形不滿足 I2C 規(guī)格書要求,或者在外加干擾情況下導(dǎo)致波形被干擾。有經(jīng)驗(yàn)的同學(xué)可能會遇到設(shè)備平時工作的好好的,但是做 EMC 測試,常常設(shè)備會莫名死機(jī),如果你的設(shè)備有 I2C 總線,請記得檢查 I2C 是否被 EMC 干擾干死了!

設(shè)備 ID

設(shè)備 ID 字段是一個可選的 3 字節(jié)只讀(24 位)字,提供以下信息:

  • 12 位用于表示制造商名稱,每個制造商唯一(例如,NXP)
  • 9 位由制造商分配的芯片標(biāo)識(例如,PCA9698)
  • 3 位表示芯片版本,由制造商分配(例如 RevX)

這個對于設(shè)計軟件有什么可以利用的信息呢?比如一個系統(tǒng)可兼容不同廠家的基于 I2C 協(xié)議的傳感器,利用這個字段就可以做設(shè)備信息管理。至于怎么讀取,不同芯片或有不同。

接口電路簡介

前面拓?fù)鋱D中采用 open-drain 開漏結(jié)構(gòu)。I2C 有的還用集電極開路輸出結(jié)構(gòu),究其原因是內(nèi)部是三極管的集電極開路。如下

Ultra Fast-mode

在 Rev 4 中還出現(xiàn)了 Ultra Fast-mode,該模式使用 push–pull 推挽定義 I2C 內(nèi)部硬件接口電路(我把它叫推拉),這個又長什么樣呢?

這種推挽接口是用在 Ultra Fast-mode(UFm)模式,為啥不繼續(xù)采用集電極開路門/漏極開路門呢?因?yàn)檫@兩種硬件已然無法滿足如此高速的通訊波形要求了,推挽輸出可以實(shí)現(xiàn)更為快速波形前沿特性以驅(qū)動總線電容負(fù)載。

對于 Ultra Fast-mode 模式其他如時序波形,報文定義基本一致,這里不做贅述了。需要提醒的是設(shè)備 ID 在該模式下不支持!

容性負(fù)載

為什么要特別討論一下總線的容性負(fù)載特征呢?想象中的理想通信波形:



由于容性負(fù)載以及充放電常數(shù)特性,實(shí)際中卻可能是這個鳥樣:


如果實(shí)際總線中電阻選取過大,或者容性負(fù)載過大(設(shè)備節(jié)點(diǎn)過大或者布線不合理),也即RC常數(shù)過大,甚至可能是這個德行:

那么參數(shù)選取合適時,波形則可能是這樣的:



所以就其本質(zhì)而言,就是由于驅(qū)動接口電路的RC參數(shù)影響了波形的時序參數(shù):


實(shí)際應(yīng)用中,一方面電阻需要選取足夠大以降低不必要的電流消耗,另一方面電阻又需要選擇足夠小以滿足對應(yīng)傳輸速度的波形時序要求。故需要在這一對矛盾體中尋求一個折中平衡!實(shí)際項目中先用示波器測測I2C波形非常必要,代碼對了總線可未必如愿工作。做底層開發(fā),盡量先硬后軟~~

I2C 總線標(biāo)準(zhǔn)從電氣特性界定了容性負(fù)載特征:

  • Fast-mode:連接到總線的外部上拉設(shè)備必須經(jīng)過調(diào)整,以適應(yīng)快速模式 I2C 總線較短的最大允許上升時間。對于 200 pF 以內(nèi)的等效總線負(fù)載,每條總線的上拉設(shè)備可以是一個電阻。對于 200 pF 至 400 pF 之間的總線負(fù)載,上拉設(shè)備可以是電流源(最大 3 mA)或開關(guān)電阻電路。

  • Fast-mode Plus (Fm+):該模式下設(shè)備中的驅(qū)動接口電路驅(qū)動能力比較強(qiáng)大,可以滿足 Fast-mode Plus 時序規(guī)范,并具有與標(biāo)準(zhǔn)模式部件相同的 400 pF 負(fù)載。為了與標(biāo)準(zhǔn)模式向后兼容,它們還可以承受標(biāo)準(zhǔn)模式設(shè)備的 1μs 上升時間。在僅存在 Fast-mode Plus 部件的應(yīng)用中,強(qiáng)驅(qū)動接口和對緩慢的上升和下降時間的容忍度允許使用較大的總線電容,只要軟件設(shè)置好或硬件 IC 實(shí)現(xiàn)好,F(xiàn)ast-mode Plus 的最小 LOW 時間和最小 HIGH 時間即可滿足所有要求,并且下降時間和上升時間不超過標(biāo)準(zhǔn)模式的 300ns 上升沿時間和 1μs 下降沿時間規(guī)格。可以將總線速度與負(fù)載電容進(jìn)行折衷,總線電容可增加大約十倍。
  • Hs-mode: 高速模式(Hs-mode)器件在 I2C 總線傳輸速度方面實(shí)現(xiàn)了飛躍。高速模式設(shè)備可以實(shí)現(xiàn)高達(dá) 3.4Mbit/s 的比特率傳輸速度,但仍然向下兼容,與快速模式增強(qiáng)版、快速模式或標(biāo)準(zhǔn)模式(F/S)設(shè)備完全兼容以進(jìn)行雙向通信總線系統(tǒng)。除了在 Hs 模式傳輸期間不執(zhí)行仲裁和時鐘同步外,與 F/S 模式系統(tǒng)保持相同的串行總線協(xié)議和數(shù)據(jù)格式。那么如此高速是如何做到的呢?這里將個人認(rèn)為與應(yīng)用相關(guān)的要點(diǎn)翻譯總結(jié)下:
    • Hs 模式主設(shè)備具有用于 SDAH 信號的 漏極開路輸出緩沖器,以及 SCLH 輸出上的漏極開路下拉電路和電流源上拉電路的組合。該電流源電路縮短了 SCLH 信號的上升時間。任何時候僅在 Hs 模式下,僅啟用一個主機(jī)的電流源。
    • 在多主機(jī)系統(tǒng)的 Hs 模式傳輸期間,不執(zhí)行仲裁以及時鐘同步以提高位處理能力。仲裁過程始終在先前的 F/S 模式下的主代碼傳輸之后完成。
    • Hs 模式主設(shè)備生成串行時鐘信號,其 占空比為 50%以減輕建立和保持時間的時序要求。這個項目中可利用示波器檢查波形。
  • 具體設(shè)計時,可參考規(guī)格書電氣特性參數(shù)規(guī)定以及所選芯片的手冊。

編程策略

  • 硬件 I2C 控制器:要實(shí)現(xiàn) I2C 總線,如果使用單片機(jī)/DSP/SOC 內(nèi)置了 I2C 控制器,就其本質(zhì)就是抽象了 I2C 總線的各種事件以寄存器進(jìn)行控制,最為常見的方式就是將總線事件抽象為異步中斷事件。以 STM32 為例:

編程時,比較好的方式就是處理相應(yīng)的中斷事件。利用內(nèi)置 I2C 控制器是優(yōu)選方案。

  • IO 模擬,如果系統(tǒng)中不存在 I2C 控制器,可利用 IO 口進(jìn)行模擬,對于實(shí)現(xiàn)多設(shè)備以及高速模式系統(tǒng)則不推薦這樣做。但在一些 PCB 尺寸受限或者成本受限、單片機(jī)引腳很少的系統(tǒng)中還是比較有實(shí)用價值的。其編程只需要對照 I2C 時序進(jìn)行操作即可,難度較小。

在實(shí)際項目中,需要特別注意 I2C 的上升沿、下降沿波形時間參數(shù)是否滿足設(shè)計速率要求,可通過配置寄存器以及調(diào)整驅(qū)動上拉電阻進(jìn)行調(diào)整。對于高速模式則可能需要用電流源進(jìn)行驅(qū)動。另外需要注意的是,I2C 總線鎖死情況處理。

總結(jié)一下

I2C 總線是一個比較復(fù)雜的芯片間總線系統(tǒng),你或許會用。但是如果不注意標(biāo)準(zhǔn)的很多細(xì)節(jié),你可能無法用好!尤其總線上掛很多設(shè)備時,系統(tǒng)極可能不健壯!本文主要參考 I2C version 標(biāo)準(zhǔn),I2C 總線看似簡單卻極為復(fù)雜,本文總結(jié)了規(guī)格書中一些要點(diǎn),也并不全面。在復(fù)雜應(yīng)用場景中,還需要多多踩坑、填坑并加以總結(jié)。前文談到了對于技術(shù)要點(diǎn)盡量總結(jié)、概括以及提煉,這里想提醒的是一些技術(shù)要點(diǎn)的標(biāo)準(zhǔn)往往是最為嚴(yán)謹(jǐn)、也最為全面的總結(jié)。具體使用時,可多多研讀。

-END-

      
            

猜你喜歡

“I2C”通信的那些坑,新手必看!
IIC與SPI,這兩種通訊方式該怎么選?
30+的華為,也在乘風(fēng)破浪

?最 后
?

若覺得文章不錯,轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機(jī)、等等!
在公眾號內(nèi)回復(fù)「 更多資源 」,即可免費(fèi)獲取,期待你的關(guān)注~
長按識別圖中二維碼關(guān)注

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉