日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I2C 总线详解-转

發布時間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I2C 总线详解-转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總線網站:https://www.i2c-bus.org/

官方協議文檔:https://www.i2c-bus.org/specification/

?

?

轉自:

1,I2C總線之(一)---概述???? https://www.cnblogs.com/BitArt/archive/2013/05/27/3101037.html

2,I2C總線之(二)---時序?? https://www.cnblogs.com/BitArt/archive/2013/05/28/3103917.html

3,? I2C總線之(三)---以C語言理解IIC? https://www.cnblogs.com/BitArt/archive/2013/06/01/3112042.html

?

?

  • 概述:

    I2C?是Inter-Integrated Circuit的縮寫,發音為"eye-squared cee" or "eye-two-cee"?, 它是一種兩線接口。

    I2C 只是用兩條雙向的線,一條 Serial Data Line (SDA) ,另一條Serial Clock (SCL)。

    SCL:上升沿將數據輸入到每個EEPROM器件中;下降沿驅動EEPROM器件輸出數據。(邊沿觸發)

    SDA:雙向數據線,為OD門,與其它任意數量的OD與OC門成"線與"關系。

  • 輸出級

    每一個I2C總線器件內部的SDA、SCL引腳電路結構都是一樣的,引腳的輸出驅動與輸入緩沖連在一起。其中輸出為漏極開路的場效應管,輸入緩沖為一只高輸入阻抗的同相器,這種電路具有兩個特點:

    1)由于SDA、SCL為漏極開路結構(OD),因此它們必須接有上拉電阻,阻值的大小常為 1k8, 4k7 and 10k ,但1k8 時性能最好;當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線"與"關系。

    2)引腳在輸出信號的同時還將引腳上的電平進行檢測,檢測是否與剛才輸出一致,為"時鐘同步"和"總線仲裁"提供了硬件基礎。

  • 主設備與從設備

    系統中的所有外圍器件都具有一個7位的"從器件專用地址碼",其中高4位為器件類型,由生產廠家制定,低3位為器件引腳定義地址,由使用者定義。主控器件通過地址碼建立多機通信的機制,因此I2C總線省去了外圍器件的片選線,這樣無論總線上掛接多少個器件,其系統仍然為簡約的二線結構。終端掛載在總線上,有主端和從端之分,主端必須是帶有CPU的邏輯模塊,在同一總線上同一時刻使能有一個主端,可以有多個從端,從端的數量受地址空間和總線的最大電容 400pF的限制?! ?/p>

      • 主端主要用來驅動SCL line;
      • 從設備對主設備產生響應;

    ?

        二者都可以傳輸數據,但是從設備不能發起傳輸,且傳輸是受到主設備控制的。

    ?

    ?

      4.速率:

      普通模式:100kHz;

      快速模式:400kHz;

      高速模式:3.4MHz;

      沒有任何必要使用高速SCL,將SCL保持在100k或以下,然后忘了它吧。

    ?

    I2C總線之(二)---時序

    一、協議 1.空閑狀態 I2C總線總線的SDA和SCL兩條信號線同時處于高電平時,規定為總線的空閑狀態。此時各個器件的輸出級場效應管均處在截止狀態,即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。 2.起始位與停止位的定義:
    • 起始信號:當SCL為高期間,SDA由高到低的跳變;啟動信號是一種電平跳變時序信號,而不是一個電平信號。
    • 停止信號:當SCL為高期間,SDA由低到高的跳變;停止信號也是一種電平跳變時序信號,而不是一個電平信號。

    3.ACK

      發送器每發送一個字節,就在時鐘脈沖9期間釋放數據線,由接收器反饋一個應答信號。 應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。 對于反饋有效應答位ACK的要求是,接收器在第9個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩定的低電平。 如果接收器是主控器,則在它收到最后一個字節后,發送一個NACK信號,以通知被控發送器結束數據發送,并釋放SDA線,以便主控接收器發送一個停止信號P。

    ? ?如下圖邏輯分析儀的采樣結果:釋放總線后,如果沒有應答信號,sda應該一直持續為高電平,但是如圖中藍色虛線部分所示,它被拉低為低電平,證明收到了應答信號。這里面給我們的兩個信息是:1)接收器在SCL的上升沿到來之前的低電平期間拉低SDA;2)應答信號一直保持到SCL的下降沿結束;正如前文紅色標識所指出的那樣。

    ?

    4.數據的有效性:

    ?

    I2C總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。 我的理解:雖然只要求在高電平期間保持穩定,但是要有一個提前量,也就是數據在SCL的上升沿到來之前就需準備好,因為在前面I2C總線之(一)---概述一文中已經指出,數據是在SCL的上升沿打入到器件(EEPROM)中的。

    ? ?

    5.數據的傳送:

    ?

      在I2C總線上傳送的每一位數據都有一個時鐘脈沖相對應(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位數據。數據位的傳輸是邊沿觸發。

    ?二、工作過程

      總線上的所有通信都是由主控器引發的。在一次通信中,主控器與被控器總是在扮演著兩種不同的角色。

    1.主設備向從設備發送數據

      主設備發送起始位,這會通知總線上的所有設備傳輸開始了,接下來主機發送設備地址,與這一地址匹配的slave將繼續這一傳輸過程,而其它slave將會忽略接下來的傳輸并等待下一次傳輸的開始。主設備尋址到從設備后,發送它所要讀取或寫入的從設備的內部寄存器地址; 之后,發送數據。數據發送完畢后,發送停止位:

    寫入過程如下:

      發送起始位

    • 發送從設備的地址和讀/寫選擇位;釋放總線,等到EEPROM拉低總線進行應答;如果EEPROM接收成功,則進行應答;若沒有握手成功或者發送的數據錯誤時EEPROM不產生應答,此時要求重發或者終止。
    • 發送想要寫入的內部寄存器地址;EEPROM對其發出應答;
    • 發送數據
    • 發送停止位.
    • EEPROM收到停止信號后,進入到一個內部的寫入周期,大概需要10ms,此間任何操作都不會被EEPROM響應;(因此以這種方式的兩次寫入之間要插入一個延時,否則會導致失敗,博主曾在這里小坑了一下)

    ? ?

      詳細:

      需要說明的是:①主控器通過發送地址碼與對應的被控器建立了通信關系,而掛接在總線上的其它被控器雖然同時也收到了地址碼,但因為與其自身的地址不相符合,因此提前退出與主控器的通信;

    ?

    2.主控器讀取數據的過程:

      讀的過程比較復雜,在從slave讀出數據前,你必須先要告訴它哪個內部寄存器是你想要讀取的,因此必須先對其進行寫入(dummy write):

    • 發送起始位;
    • 發送slave地址+write bit set;
    • 發送內部寄存器地址;
    • 重新發送起始位,即restart;
    • 重新發送slave地址+read bit set;
    • 讀取數據 主機接收器在接收到最后一個字節后,也不會發出ACK信號。于是,從機發送器釋放SDA線,以允許主機發出P信號結束傳輸。
    • 發送停止位? ?
    詳細:

    ?

    I2C總線之(三)---以C語言理解IIC

    為了加深對I2C總線的理解,用C語言模擬IIC總線,邊看源代碼邊讀波形:

    如下圖所示的寫操作的時序圖:

    ?

    讀時序的理解同理。對于時序不理解的朋友請參考“I2C總線之(二)---時序”

    完整的程序如下:

    #include<reg51.h> #define uchar unsigned char #define uint unsigned int #define write_ADD 0xa0 #define read_ADD 0xa1 uchar a; sbit SDA=P2^0; sbit SCL=P2^1; void SomeNop(); //短延時 void init(); //初始化 void check_ACK(void); void I2CStart(void); void I2cStop(void); void write_byte(uchar dat);//寫字節 void delay(uint z); uchar read_byte(); //讀字節 void write(uchar addr,uchar dat); //指定地址寫 uchar read(uchar addr); //指定地址讀 bit flag; //應答標志位 void main() {init();write_add(5,0xaa); //向地址5寫入0xaadelay(10); //延時,否則被坑呀!!!P1=read_add(5); //讀取地址5的值while(1); }//*************************************************************************** void delay()//簡單延時函數 { ;; } //*************************************************************************** void start() //開始信號 SCL在高電平期間,SDA一個下降沿則表示啟動信號 { sda=1; //釋放SDA總線 delay(); scl=1; delay(); sda=0; delay(); } //*************************************************************************** void stop() //停止 SCL在高電平期間,SDA一個上升沿則表示停止信號 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } //*************************************************************************** void respons() //應答 SCL在高電平期間,SDA被從設備拉為低電平表示應答 { uchar i; scl=1; delay(); //至多等待250個CPU時鐘周期 while((sda==1)&&(i<250))i++; scl=0; delay(); } //*************************************************************************** void init()//總線初始化 將總線都拉高一釋放總線 發送啟動信號前,要先初始化總線。即總有檢測到總線空閑才開始發送啟動信號 { sda=1; delay(); scl=1; delay(); } //*************************************************************************** void write_byte(uchar date) //寫一個字節 { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1; scl=0;//拉低SCL,因為只有在時鐘信號為低電平期間按數據線上的高低電平狀態才允許變化;并在此時和上一個循環的scl=1一起形成一個上升沿 delay(); sda=CY; delay(); scl=1;//拉高SCL,此時SDA上的數據穩定 delay(); } scl=0;//拉低SCL,為下次數據傳輸做好準備 delay(); sda=1;//釋放SDA總線,接下來由從設備控制,比如從設備接收完數據后,在SCL為高時,拉低SDA作為應答信號 delay(); } //*************************************************************************** uchar read_byte()//讀一個字節 { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1;//上升沿時,IIC設備將數據放在sda線上,并在高電平期間數據已經穩定,可以接收啦 delay(); k=(k<<1)|sda; scl=0;//拉低SCL,使發送端可以把數據放在SDA上 delay(); } return k; } //*************************************************************************** void write_add(uchar address,uchar date)//任意地址寫一個字節 { start();//啟動 write_byte(0xa0);//發送從設備地址 respons();//等待從設備的響應 write_byte(address);//發出芯片內地址 respons();//等待從設備的響應 write_byte(date);//發送數據 respons();//等待從設備的響應 stop();//停止 } //*************************************************************************** uchar read_add(uchar address)//讀取一個字節 { uchar date; start();//啟動 write_byte(0xa0);//發送發送從設備地址 寫操作 respons();//等待從設備的響應 write_byte(address);//發送芯片內地址 respons();//等待從設備的響應 start();//啟動 write_byte(0xa1);//發送發送從設備地址 讀操作 respons();//等待從設備的響應 date=read_byte();//獲取數據 stop();//停止 return date;//返回數據 }

    ?

    參考:https://blog.csdn.net/XieWinter/article/details/91903678

    ?

    以下轉自:

    https://blog.csdn.net/XieWinter/article/details/91903678

    ?

    1. 引言

    I2C總線是事實上的世界標準,現在由超過50家公司制造的1000多種不同的IC實現。此外,多功能I2C總線用于各種控制架構,如系統管理總線(SMBus),電源管理總線(PMBus),智能平臺管理接口(IPMI),顯示數據通道(DDC)和高級電信計算架構(ATCA))。

    在消費者電子電訊和工業電子中看上去不相關的設計里經常有很多相似的地方例如幾乎每個系統都包括:

    為了使這些相似之處對系統設計者和器件廠商都得益而且使硬件效益最大電路最簡單Philips (現NXP)開發了一個簡單的雙向兩線總線實現有效的IC 之間控制這個總線就稱為Inter IC 或I2C 總線。所有符合I2C總線的器件組合了一個片上接口使器件之間直接通過I2C 總線通訊。

    I2C總線是由飛利浦在80年代早期設計開發的,允許在同一電路板上的組件之間輕松通信,一種簡單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的器件之間傳送信息。飛利浦半導體于2006年遷移至恩智浦。

    主器件用于啟動總線傳送數據,并產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認為是從器件.在總線上主和從、發和收的關系不是恒定的,而取決于此時數據傳送方向。如果主機要發送數據給從器件,則主機首先尋址從器件,然后主動發送數據至從器件,最后由主機終止數據傳送;如果主機要接收從器件的數據,首先由主器件尋址從器件.然后主機接收從器件發送的數據,最后由主機終止接收過程。在這種情況下.主機負責產生定時時鐘和終止數據傳送。

    總線網站:https://www.i2c-bus.org/

    官方協議文檔:https://www.i2c-bus.org/specification/

    CSDN文檔地址:https://download.csdn.net/download/xiewinter/11243770


    2. 特征

    ??? 只要求兩條總線線路:一條串行數據線(serial data line ,SDA),一條串行時鐘線(serial clock line , SCL)
    ??? 每個連接到總線的器件都可以通過唯一的地址和始終存在的簡單的主/從機關系進行軟件尋址; 主機可以作為主機發送器或主機接收器
    ??? 它是真正的多主總線,包括沖突檢測和仲裁,以防止兩個或多個主設備同時啟動數據傳輸時數據損壞。
    ??? 串行,8位,雙向數據傳輸在標準模式下最高可達100 kbit / s,在快速模式下最高可達400 kbit / s,在快速+模式下最高可達1 Mbit / s, 或高速模式下高達3.4 Mbit / s。
    ??? 串行,8位,單向數據傳輸在超快速模式下高達5 Mbit / s
    ??? 片上的濾波器,可以濾去總線數據線上的毛刺波保證數據完整
    ??? 可以連接到同一總線的IC數量僅受最大總線電容的限制。 在某些條件下可能允許更大的電容。詳見官方參考手冊。

    ?
    3. 規范

    I2C 總線是一個多主機的總線這就是說可以連接多于一個能控制總線的器件到總線。如果兩個或多個主機嘗試發送信息到總線在其他主機都產生0 的情況下首先產生一個1 的主機將丟失仲裁。仲裁時的時鐘信號是用線與連接到SCL 線的主機產生的時鐘的同步組合。

    在I2C總線上生成時鐘信號始終是主設備的責任; 在總線上傳輸數據時,每個主機都會生成自己的時鐘信號。 來自主設備的總線時鐘信號只有在被慢速從設備按下時鐘線或由仲裁發生時由另一個主設備拉伸時才能被改變。

    3.1 SDA 和 SCL 信號

    SDA和SCL都是雙向線路,通過電流源或上拉電阻連接到正電源電壓(見圖3)。 當總線空閑時,兩條線都是HIGH。 連接到總線的器件的輸出級必須具有漏極開路或開路集電極,以執行線與功能。 I2C總線上的數據可以在標準模式下以高達100 kbit / s的速率傳輸,在快速模式下最高可達400 kbit / s,在快速+模式下最高可達1 Mbit / s或以上 在高速模式下為3.4 Mbit / s。 總線電容限制了連接到總線的接口數量。

    對于單個主應用,如果總線上沒有可以延長時鐘的器件,則主機的SCL輸出可以是推挽式驅動器設計。

    ?3.2 SDA 和 SCL 邏輯電平

    由于可以連接到I2C總線的各種不同技術設備(CMOS,NMOS,雙極),邏輯“0”(低)和“1”(高)的電平不固定,取決于 相關的VDD電平。 輸入參考電平設置為VDD的30%和70%; VIL為0.3VDD,VIH為0.7VDD。 請參見圖38,時序圖。 一些傳統器件輸入電平固定為VIL = 1.5 V和VIH = 3.0 V,但所有新器件都需要30%/ 70%的規格。

    ?3.3 數據的有效性

    SDA 線上的數據必須在時鐘的高電平周期保持穩定數據線的高或低電平狀態只有在SCL 線的時鐘信號是低電平時才能改變。為傳輸的每個數據位生成一個時鐘脈沖。

    3.4 START and STOP 條件

    所有的傳輸都是所有事務都以START(S)開始,并由STOP(P)終止(見圖5)。

    SCL 線是高電平時,SDA 線從高電平向低電平切換,表示起始條件。

    當SCL 是高電平時,SDA 線由低電平向高電平切換,表示停止條件。

    ?起始和停止條件一般由主機產生總線在起始條件后被認為處于忙的狀態在停止條件的某段時間后總線被認為再次處于空閑狀態。

    如果產生重復起始Sr 條件而不產生停止條件總線會一直處于忙的狀態此時的起始條件S和重復起始Sr 條件在功能上是一樣的,因此在本文檔的剩余部分符號S 將作為一個通用的術語既表示起始條件又表示重復起始條件除非有特別聲明的Sr。

    如果連接到總線的設備包含必要的接口硬件,則可以輕松檢測START和STOP條件。 但是,沒有這種接口的微控制器必須在每個時鐘周期至少兩次采樣SDA線來檢測是否發生電平轉換。
    3.5 字節格式

    發送到SDA 線上的每個字節必須為8 位。每次傳輸可以發送的字節數量不受限制。每個字節后必須跟一個響應位。首先傳輸的是數據的最高位MSB (見圖6 )。如果從機要完成一些其他功能后(例如一個內部中斷服務程序)才能接收或發送下一個完整的數據字節,可以使時鐘線SCL 保持低電平迫使主機進入等待狀態。當從機準備好接收下一個數據字節并釋放時鐘線SCL 后數據傳輸繼續

    3.6 Acknowledge (ACK) and Not Acknowledge (NACK)

    響應發生在每個字節之后。 應答位允許接收器向發送器發信號通知該字節已成功接收,并且可以發送另一個字節。 主機產生所有時鐘脈沖,包括應答第9個時鐘脈沖。

    ACK 信號:在響應的時鐘脈沖期間,接收器必須將SDA 線拉低,使它在這個時鐘脈沖的高電平期間保持穩定的低電平(見圖4) 。當然必須考慮建立和保持時間。

    NACK信號:當在第9個時鐘脈沖期間SDA保持高電平時,這被定義為非應答信號。主設備可以生成STOP條件以中止傳輸,或者生成重復的START條件以開始新的傳輸。 導致生成NACK的條件有五個:

    ??? 1.總線上沒有帶有發送地址的接收器,因此沒有設備響應確認。
    ??? 2.接收器無法接收或發送,因為它正在執行某些實時功能,并且尚未準備好開始與主站通信。
    ??? 3.在傳輸過程中,接收器獲取它不理解的數據或命令。
    ??? 4.在傳輸過程中,接收器無法再接收數據字節。
    ??? 5.主接收器必須發信號通知從發送器的傳輸結束。

    3.7 時鐘同步

    兩個主設備可以同時開始在空閑總線上進行傳輸,并且必須有一種方法來決定哪個控制總線并完成其傳輸。 這是通過時鐘同步和仲裁完成的。 在單主系統中,不需要時鐘同步和仲裁。

    時鐘同步通過線與連接I2C 接口到SCL 線來執行。這就是說SCL 線的高到低切換會使器件開始數它們的低電平周期,而且一旦器件的時鐘變低電平,它會使SCL線保持這種狀態直到到達時鐘的高電平。但是,如果另一個時鐘仍處于低電平周期,這個時鐘的低到高切換不會改變SCL線的狀態。因此,SCL線被有最長低電平周期的器件保持低電平,此時,低電平周期短的器件會進入高電平的等待狀態。

    ?當所有有關的器件數完了它們的低電平周期后,時鐘線被釋放并變成高電平。之后器件時鐘和SCL線的狀態沒有差別。而且所有器件會開始數它們的高電平周期。首先完成高電平周期的器件會再次將SCL線拉低。

    這樣,產生的同步SCL時鐘的低電平周期由低電平時鐘周期最長的器件決定,而高電平周期由高電平時鐘周期最短的器件決定。
    3.8 仲裁

    仲裁與同步一樣,只有在系統中使用多個主設備時才需要協議的一部分。主機只能在總線空閑的時侯啟動傳輸。兩個或多個主機可能在起始條件的最小持續時間(tHD;STA)內產生一個起始條件,結果在總線上產生一個規定的起始條件。

    當SCL 線是高電平時,仲裁在SDA 線發生;這樣,在其他主機發送低電平時,發送高電平的主機將斷開它的數據輸出級,因為總線上的電平與它自己的電平不相同。

    仲裁是逐位進行的,在每個位期間,當SCL為高電平時,每個主器件都會檢查SDA電平是否與它發送的電平相匹配。 此過程可能需要很多位。 只要傳輸完全相同,兩個主設備實際上可以無錯誤地完成整個事務。 主設備第一次嘗試發送HIGH,但檢測到SDA電平為低電平,主機知道它已經丟失仲裁并關閉其SDA輸出驅動器。

    因為,I2C 總線的地址和數據信息由贏得仲裁的主機決定,在仲裁過程中不會丟失信息。丟失仲裁的主機,可以產生時鐘脈沖直到丟失仲裁的該字節末尾。

    如果主機也結合了從機功能,而且在尋址階段丟失仲裁,它很可能就是贏得仲裁的主機在尋址的器件。因此,丟失仲裁的主機必須立即切換到它的從機模式。

    由于I2C總線的控制僅取決于競爭主機發送的地址和數據,因此沒有中央主機,也沒有總線上的任何優先級順序。

    如果在一個主設備發送重復START或STOP條件而另一個主設備仍在發送數據時仲裁過程仍在進行中,則存在未定義的條件。 換句話說,仲裁在不能下面情況之間進行:

    ?重復起始條件和數據位:主設備1發送重復的START條件,主設備2發送數據位。

    ?停止條件和數據位:主設備1發送STOP條件,主設備2發送數據位。

    ?重復起始條件和停止條件:主站1發送重復的START條件,主站2發送STOP條件。
    3.9 Clock stretching

    時鐘延長通過將SCL線保持為低電平來暫停事務。 在該行再次釋放HIGH之前,該事務不能繼續。 時鐘延長是可選的,事實上,大多數從設備不包括SCL驅動程序,因此它們無法延長時鐘。

    在字節級,設備可能能夠以快速速率接收數據字節,但需要更多時間來存儲接收到的字節或準備另一個要傳輸的字節。 然后,從器件可以在接收和確認一個字節后將SCL線保持為低電平,以強制主器件進入等待狀態,直到從器件準備好在一種握手過程中進行下一個字節傳輸。

    在位級,諸如具有或不具有用于I2C總線的有限硬件的微控制器的設備可以通過延長每個時鐘LOW周期來減慢總線時鐘。 任何主站的速度都適合該設備的內部運行速率。
    3.9 從機地址和R/W位

    數據傳輸遵循圖9中所示的格式。在START條件(S)之后,發送從地址。 該地址長7位,后跟第8位,即數據方向位(R / W) - “0”表示傳輸(WRITE),“1”表示數據請求(READ)(參見圖)10)。數據傳輸總是由主機產生的STOP條件(P)終止。 但是,如果主設備仍希望在總線上進行通信,則它可以生成重復的START條件(Sr)并在不首先生成STOP條件的情況下尋址另一個從設備。在這種傳輸中,可以進行不同讀/寫格式的各種組合。

    ?

    可能的數據傳輸格式是:

    ??? 主發送器發送到從接收器。 傳輸方向沒有改變(見圖11)。 從接收器確認每個字節。
    ??? 主機在第一個字節后立即讀取從機(參見圖12)。 在第一次確認時,主發送器變為主接收器,從接收器變為從發送器。 第一次確認仍由從機生成。 主設備生成后續確認。 STOP條件由主機產生,它在STOP條件之前發送一個非應答(A)。
    ??? 組合格式(見圖13)。 在傳輸改變方向時候,START條件和從地址都重復,但R / W位反轉。 如果主接收器發送重復START條件,它會在重復START條件之前發送一個非應答(A)

    注意:

    ??? 復合格式可以用于例如控制一個串行存儲器。在第一個數據字節期間,要寫內部存儲器的位置,在重復起始條件和從機地址后,數據可被傳輸。
    ??? 自動增加或減少之前訪問的存儲器位置等所有決定都由器件的設計者決定
    ??? 每個字節都跟著一個響應位,在序列中用A 或A 模塊表示
    ??? 兼容I2C 總線的器件在接收到起始或重復起始條件時必須復位它們的總線邏輯,甚至在這些起始條件沒有根據正確的格式放置,它們也都期望發送從機地址。
    ??? 起始條件后面立即跟著一個停止條件報文為空是一個不合法的格式
    ??? 連接到總線的每個設備都可以通過唯一的地址尋址。 通常存在簡單的主/從關系,但是可以具有多個可以同時接收和響應的相同從屬,例如在組廣播中。

    ?

    3.10 10位地址

    10位尋址擴展了可能的地址數量。 具有7位和10位地址的器件可以連接到同一個I2C總線,7位和10位尋址都可以用于所有總線速度模式。 目前,10位尋址沒有被廣泛使用。

    10位從地址由START條件(S)或重復START條件(Sr)之后的前兩個字節構成。

    第一個字節的前七位是組合1111 0XX,其中最后兩位(XX)是10位地址的兩個最高有效位(MSB); 第一個字節的第八位是決定消息方向的R / W位。

    盡管保留地址位1111XXX有八種可能的組合,但只有四種組合1111 0XX用于10位尋址。 其余四種組合1111 1XX保留用于未來的I2C總線增強。

    之前針對7位尋址描述的讀/寫格式的所有組合都可以通過10位尋址實現。 這里有兩個詳細說明:

    ??? 主機發送器傳輸10位從地址發送到從接收器。
    ??? 主接收器使用10位從地址讀取從發送器。

    ?
    3.11 保留地址

    3.12 廣播呼叫地址

    廣播呼叫地址是用來尋址連接到I2C 總線上的每個器件。但是,如果器件在廣播呼叫結構中不需要任何數據,它可以通過不發出響應來忽略這個地址。如果器件要求從廣播呼叫地址得到數據,它會響應這個地址并作為從機接收器運轉。第二個和接下來的字節會被能處理這些數據的每個從機接收器響應。廣播呼叫地址的含意通常在第二個字節說明(圖16)

    ?這里要考慮兩種情況

    ? 當最低位B 是0

    ? 當最低位B 是1

    當位B 是0 時,第二個字節的定義如下

    ??? 0000 0110 (06h): 通過硬件寫入和復位從機地址的可編程部分。接收到這個兩字節序列時所有打算響應這個廣播呼叫地址的器件將復位并接受它們地址的可編程部分。要采取預防措施確保器件不會在加上電源電壓后將SDA 或SCL 線拉低因為這些低電平會阻塞總線。
    ??? 0000 0100 (04h): 通過硬件寫從機地址的可編程部分。所有通過硬件定義地址可編程部分和響應廣播呼叫地址的器件會在接收這兩個字節序列時鎖存可編程的部分。器件不會復位。
    ??? 0000 0000 (00h): 這個代碼不允許在第二個字節使用

    3.13 軟件復位

    在廣播呼叫(0000 0000)之后,發送0000 0110(06h)作為第二個字節會導致軟件復位。 此功能是可選的,并非所有設備都響應此命令。 在接收到這個2字節序列時,所有設計用于響應廣播呼叫地址的設備都會復位并接收其地址的可編程部分。 必須采取預防措施以確保器件在施加電源電壓后不會下拉SDA或SCL線路,因為這些低電平會阻塞總線。
    3.14 起始字節

    微控制器可以通過兩種方式連接到I2C總線。 具有片上硬件I2C總線接口的微控制器可以編程為僅被來自總線的請求中斷。 當設備沒有這樣的接口時,它必須通過軟件持續監控總線。 顯然,微控制器監控或輪詢總線的次數越多,執行其預期功能所花費的時間就越少。

    因此,快速硬件設備和依賴軟件輪詢的相對較慢的微控制器之間存在速度差異。

    在這種情況下,數據傳輸之前可以有一個比正常情況長得多的啟動程序(參見圖19)。 啟動程序包括:

    ? A START condition (S)

    ? A START byte (0000 0001)

    ? An acknowledge clock pulse (ACK)

    ? A repeated START condition (Sr).

    ?

    在要求總線訪問的主機發送起始條件S 后,發送起始字節(00000001), 因此另一個微控制器可以采樣以低采樣速率采樣SDA 線,直到在啟動字節檢測到7 個0 。在SDA 線檢測到這個低電平后,微控制器切換到一個更高的采樣速率尋找用于同步的重復起始條件Sr。

    接收到重復起始條件Sr 后硬件接收器會復位,從而忽略了起始字節。
    3.15 總線清除

    在極少數情況下,時鐘(SCL)被置為低電平,如果您的I2C器件具有硬件復位輸入,則優先過程是使用HW復位信號復位總線。 如果I2C器件沒有硬件復位輸入,則重啟器件電源以激活強制內部上電復位(POR)電路。

    如果數據線(SDA)保持低電平,主機應發送9個時鐘脈沖。 保持總線為低電平的器件應該在這九個時鐘內的某個時間釋放它。 如果沒有,則使用硬件復位或循環電源清除總線。
    4. 超快速模式I2C總線協議


    5. I2C總線通信協議的其他用途

    I2C總線用作多個系統架構的通信協議。 除基本I2C規范外,這些體系結構還添加了命令集和特定于應用程序的擴展。 通常,由于協議和物理接口相同,因此可以在這些架構中的任何一個中使用簡單的I2C總線設備,例如I / O擴展器。
    5.1 CBUS 兼容性

    CBUS接收器可以連接到標準模式I2C總線。 但是,必須連接稱為DLEN的第三條總線,并省略應答位。 通常,I2C傳輸是8位字節的序列; 兼容CBUS設備具有不同的格式。

    在混合總線結構中,I2C總線設備不得響應CBUS消息。 因此,保留了沒有I2C總線兼容設備響應的特殊CBUS地址(0000 001X)。 在傳輸CBUS地址之后,可以激活DLEN線路并發送CBUS格式傳輸。 在STOP條件之后,所有設備都準備好接受數據。

    主發送器可以在發送CBUS地址后發送CBUS格式。 傳輸以STOP條件結束,由所有設備識別。

    備注:如果CBUS配置已知,并且未預見到與CBUS兼容設備的擴展,則允許設計人員根據所用設備的特定要求調整保持時間。

    5.2 SMBus? - 系統管理總線

    SMBus使用I2C硬件和I2C硬件尋址,但增加了用于構建特殊系統的二級軟件。 特別是,其規范包括可以進行動態地址分配的地址解析協議。

    硬件和軟件的動態重新配置允許總線設備“熱插拔”并立即使用,無需重新啟動系統。 設備會自動識別并分配唯一的地址。 這種優勢導致即插即用的用戶界面。 在這兩種協議中,系統主機和系統中可以具有主設備或從設備的名稱和功能的所有其他設備之間存在非常有用的區別。

    SMBus現在在大多數PC中用作系統管理總線。 它由英特爾和其他公司于1995年開發,它修改了一些I2C電氣和軟件特性,以便與便攜式設備快速降低的電源預算更好地兼容。 SMBus還具有“高功率”版本2.0,包括4 mA吸收電流,除非上拉電阻的大小符合I2C總線電平,否則不能由I2C芯片驅動。

    未完待續。。。
    6. 總線速度

    最初,I2C總線限制為100 kbit / s操作。 隨著時間的推移,規范已經增加了幾個,因此現在有五種運行速度類別。 標準模式,快速模式(Fm),快速模式加(Fm +)和高速模式(Hs模式)設備向下兼容 - 任何設備都可以在降低總線速度。

    超快速模式設備與以前的版本不兼容,因為總線是單向的。

    雙向總線:

    ?- 標準模式(Sm),比特率高達100 kbit / s

    ?- 快速模式(Fm),比特率高達400 kbit / s

    ?- 快速模式加(Fm +),比特率高達1 Mbit / s

    ?- 高速模式(Hs模式),比特率高達3.4 Mbit / s。

    單向總線:

    ?- 超快速模式(UFm),比特率高達5 Mbit / s

    原文鏈接:https://blog.csdn.net/XieWinter/article/details/91903678

    總結

    以上是生活随笔為你收集整理的I2C 总线详解-转的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。