色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是I2C協議?

汽車電子技術 ? 來源:嵌入式悅翔園 ? 作者:李斌 ? 2023-02-17 10:58 ? 次閱讀

1、什么是I2C協議

I2C協議是一個允許多個 “從機” 芯片和一個或更多的 “主機” 芯片進行通訊的協議。它就像串行外設接口(SPI)一樣,只能用于 短距離通信 。又像異步串行接口(如RS232UART), 只需要兩根信號線來交換信息。

實現I2C需要兩根信號線完成信息交換,SCL時鐘信號線,SDA數據輸入/輸出線。它屬于 同步通信 ,由于輸入輸出數據均使用一根線,因此通信方向為 半雙工

總結:短距離、一主多從、半雙工、兩根線、同步通訊圖片

2、名詞解釋

什么是半雙工呢?什么是同步通訊?什么是異步通訊?

2.1 什么是半雙工?

數據通信中,數據在線路上的傳送方式可以分為 單工通信半雙工通信全雙工通信三種。

單工通信: 是指消息只能單方向傳輸的工作方式。例如遙控、遙測(一部分),就是單工通信方式。單工通信信道是單向信道,發送端和接收端的身份是固定的,發送端只能發送信息,不能接收信息;接收端只能接收信息,不能發送信息,數據信號僅從一端傳送到另一端,即信息流是單方向的。

半雙工: 是指數據可以沿兩個方向傳送,但同一時刻一個信道只允許單方向傳送,因此又被稱為 雙向交替通信 。(信息在兩點之間能夠在兩個方向上進行發送,但不能同時發送的工作方式。)半雙工方式要求收發兩端都有發送裝置和接收裝置。由于這種方式要頻繁變換信道方向,故效率低,但可以節約傳輸線路。

全雙工: 是指在通信的任意時刻,線路上可以同時存在A到B和B到A的雙向信號傳輸。 在全雙工方式下,通信系統的每一端都設置了發送器和接收器 ,因此,能控制數據同時在兩個方向上傳送。全雙工方式無需進行方向的切換,因此,沒有切換操作所產生的時間延遲,這對那些不能有時間延誤的交互式應用(例如遠程監測和控制系統)十分有利。比如,電話機則是一種全雙工設備,其通話雙方可以同時進行對話。

圖片

2.2 什么是同步通訊

同步通信: 發送端在發送串行數據的同時,提供一個時鐘信號,并按照一定的約定(例如:在時鐘信號的上升沿的時候,將數據發送出去)發送數據,接收端根據發送端提供的時鐘信號,以及大家的約定,接收數據。如:I2C、SPI等有時鐘信號的協議,都屬于這種通信方式。

異步通信: 接收方并不知道數據什么時候會到達,收發雙方可以有各自自己的時鐘。發送方發送的時間間隔可以不均,接收方是在數據的起始位和停止位的幫助下實現信息同步的。這種傳輸通常是很小的分組,比如:一個字符為一組,數據組配備起始位和結束位。所以這種傳輸方式的效率是比較低的,因為額外加入了很多的輔助位作為負載,常用在低速的傳輸中。

同步通信與異步通信區別:

(1)同步通信要求接收端時鐘頻率和發送端時鐘頻率一致,發送端發送連續的比特流;異步通信時不要求接收端時鐘和發送端時鐘同步,發送端發送完一個字節后,可經過任意長的時間間隔再發送下一個字節。

(2)同步通信效率高,異步通信效率較低。

(3)同步通信較復雜,雙方時鐘的允許誤差較小;異步通信簡單,雙方時鐘可允許一定誤差。

(4)同步通信可用于點對多點;異步通信只適用于點對點。

3、I2C的功能特點

I2C最重要的功能包括:

  • 只需要兩條總線;
  • 沒有嚴格的波特率要求,例如使用RS232,主設備生成總線時鐘;
  • 所有組件之間都存在簡單的主/從關系,連接到總線的每個設備均可通過唯一地址進行軟件尋址;
  • I2C是真正的多主設備總線,可提供仲裁和沖突檢測;
  • 傳輸速度:
    • 標準模式:Standard Mode = 100 Kbps
    • 快速模式:Fast Mode = 400 Kbps
    • 高速模式:High speed mode = 3.4 Mbps
    • 超快速模式:Ultra fast mode = 5 Mbps
  • 最大主設備數:無限制;
  • 最大從機數:理論上是127;圖片

4、I2C的高阻態

漏極開路(Open Drain)即高阻狀態,適用于輸入/輸出,其可獨立輸入/輸出低電平和高阻狀態,若需要產生高電平,則需使用外部上拉電阻

高阻狀態:高阻狀態是三態門電路的一種狀態。邏輯門的輸出除有高、低電平兩種狀態外,還有第三種狀態——高阻狀態的門電路。電路分析時高阻態可做開路理解。

我們知道IIC的所有設備是接在一根總線上的,那么我們進行通信的時候往往只是幾個設備進行通信,那么這時候其余的空閑設備可能會受到總線干擾,或者干擾到總線,怎么辦呢?

為了避免總線信號的混亂,IIC的空閑狀態只能有外部上拉, 而此時空閑設備被拉到了高阻態,也就是相當于斷路, 整個IIC總線只有開啟了的設備才會正常進行通信,而不會干擾到其他設備。

5、數據傳輸協議

主設備和從設備進行數據傳輸時遵循以下協議格式。數據通過一條SDA數據線在主設備和從設備之間傳輸0和1的串行數據。串行數據序列的結構可以分為:圖片

5.1 開始位

當主設備決定開始通訊時,需要發送開始信號,并且執行以下過程:

  • 將SDA線由高電平切換成低電平;
  • 將SCL線由高電平切換成低電平;

主設備發送開始條件信號之后,所有從機即使處于睡眠模式也將變為活動狀態,并等待接收地址位。圖片

5.2 地址位

地址位支持7bit、10bit,主設備如果需要向從機發送/接收數據,首先要發送對應從機的地址,然后會匹配總線上掛載的從機的地址,故地址為主要用來辨識不同設備。

地址位由 主機發送 ,從設備負責接受并識別該地址是否位自己地址。

5.3 讀寫位

由于I2C是半雙工通訊,所以設備需要確定數據傳輸的方向,故引入了讀寫位。

  • 如果主設備需要將數據發送到從設備,則該位設置為 0;
  • 如果主設備需要往從設備接收數據,則將其設置為 1 ;

讀寫位由 主機發送 ;1表示讀操作,0表示寫操作。

5.4 應答位

I2C最大的一個特點就是有完善的應答機制,從機接收到主機的數據時,會回復一個應答信號來通知主機表示“我收到了”。

應答信號: 出現在1個字節傳輸完成之后,即第9個SCL時鐘周期內,此時主機需要釋放SDA總線,把總線控制權交給從機,由于上拉電阻的作用,此時總線為高電平,如果從機正確的收到了主機發來的數據,會把SDA拉低,表示應答響應。圖片非應答信號: 當第9個SCL時鐘周期時,SDA保持高電平,表示非應答信號。圖片非應答信號可能是主機產生也可能是從機產生,產生非應答信號的情況主要有以下幾種:

  • I2C總線上沒有主機所指定地址的從機設備;
  • 從機正在執行一些操作,處于忙狀態,還沒有準備好與主機通訊;
  • 主機發送的一些控制命令,從機不支持;
  • 主機接收從機數據時,主機產生非應答信號,通知從機數據傳輸結束,不要再發數據了;

5.5 數據位

I2C數據總線傳輸要保證在SCL為高電平時,SDA數據穩定,所以SDA上數據變化只能在SCL為低電平時圖片一次傳輸的數據總共有8位,由發送方設置,它需要將數據位傳輸到接收方。發送之后會緊跟一個ACK / NACK位,如果接收器成功接收到數據,則從機發送ACK。否則,從機發送NACK。

數據可以重復發送多個,直到接收到停止位為止。

5.6 停止位

當主設備決定結束通訊時,需要發送結束信號,需要執行以下動作:

  • 先將SDA線從低電壓電平切換到高電壓電平;
  • 再將SCL線從高電平拉到低電平;圖片

5.7 總結

寄存器的標準流程為:

  1. Master發起START
  2. Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
  3. Slave發送ACK
  4. Master發送reg addr(8bit),等待ACK
  5. Slave發送ACK
  6. Master發送data(8bit),即要寫入寄存器中的數據,等待ACK
  7. Slave發送ACK
  8. 第6步和第7步可以重復多次,即順序寫多個寄存器
  9. Master發起STOP

讀寄存器的標準流程為:

  1. Master發送I2C addr(7bit)和w操作1(1bit),等待ACK
  2. Slave發送ACK
  3. Master發送reg addr(8bit),等待ACK
  4. Slave發送ACK
  5. Master發起START
  6. Master發送I2C addr(7bit)和r操作1(1bit),等待ACK
  7. Slave發送ACK
  8. Slave發送data(8bit),即寄存器里的值
  9. Master發送ACK
  10. 第8步和第9步可以重復多次,即順序讀多個寄存器

6、仲裁機制

在多主的通信系統中。總線上有多個節點,它們都有自己的尋址地址,可以作為從節點被別的節點訪問,同時它們都可以作為主節點向其他的節點發送控制字節和傳送數據。

但是如果有兩個或兩個以上的節點都向總線上發送啟動信號并開始傳送數據,這樣就形成了沖突。要解決這種沖突,就要進行仲裁的判決,這就是I2C總線上的仲裁。

I2C總線上的仲裁分兩部分:SCL線的同步和SDA線的仲裁。

6.1 SCL線的同步

SCL同步是由于總線具有線 “與” 的邏輯功能(開漏輸出),即只要有一個節點發送低電平時,總線上就表現為低電平。當所有的節點都發送高電平時,總線才能表現為高電平。正是由于線“與”邏輯功能的原理,當多個節點同時發送時鐘信號時,在總線上表現的是統一的時鐘信號,這就是SCL的同步原理。

圖片

在這里插入圖片描述

6.2 SDA線的仲裁

總線仲裁是為了解決多設備同時競爭中線控制權的問題,通過一定的裸機來決定哪個設備能夠獲得最終的總線控制權。

SDA線的仲裁也是建立在總線具有線“與”邏輯功能的原理上的。節點在發送1位數據后,比較總線上所呈現的數據與自己發送的是否一致(類似于CAN總線的回讀機制)。

  • 是,繼續發送;
  • 否則,退出競爭;

I2C總線的控制邏輯:低電平優先

SDA線的仲裁可以保證I2C總線系統在多個主節點同時企圖控制總線時通信正常進行并且數據不丟失, 總線系統通過仲裁只允許一個主節點可以繼續占據總線

圖片圖片

上圖過程分析:

第一個周期:所有設備發送1,做與運算后的結果為1,與自己發送的數據相同,繼續發送;
第二個周期:所有設備發送1,做與運算后的結果為1,與自己發送的數據相同,繼續發送;
第三個周期:所有設備發送0,做與運算后的結果為0,與自己發送的數據相同,繼續發送;
第四個周期:AB設備發送1C設備發送0,做與運算后結果為0,與AB發送的數據不同,則AB退出競爭,節點C獲勝;

注:若AB兩個設備發送0C設備發送1,這最后與運算結果為0,與AB數據格式相同,與C數據格式不同,則C退出,AB繼續發送,直至AB中有一個退出。

SDA仲裁和SCL時鐘同步處理過程沒有先后關系,而是同時進行的。

7、I2C死鎖

在實際使用過程中,I2C比較容易出現的一個問題就是死鎖 ,死鎖在I2C中主要表現為:I2C死鎖時表現為SCL為高,SDA一直為低。

在I2C主設備進行讀寫操作的過程中,主設備在開始信號后控制SCL產生8個時鐘脈沖,然后拉低SCL信號為低電平,在這個時候,從設備輸出應答信號,將SDA信號拉為低電平。

如果這個時候主設備異常復位,SCL就會被釋放為高電平。此時,如果從設備沒有復位,就會繼續I2C的應答,將SDA一直拉為低電平,直到SCL變為低電平,才會結束應答信號。

而對于I2C主設備來說,復位后檢測SCL和SDA信號,如果發現SDA信號為低電平,則會認為I2C總線被占用,會一直等待SCL和SDA信號變為高電平。

這樣,I2C主設備等待從設備釋放SDA信號,而同時I2C從設備又在等待主設備將SCL信號拉低以釋放應答信號,兩者相互等待,I2C總線進人一種死鎖狀態。

同樣,當I2C進行讀操作,I2C從設備應答后輸出數據,如果在這個時刻I2C主設備異常復位而此時I2C從設備輸出的數據位正好為0,也會導致I2C總線進入死鎖狀態。

8、I2C的代碼實現

參考了STM32HAL庫中I2C驅動,主設備發送函數HAL_I2C_Master_Transmit()具體如下:

/**
  * @brief  Transmits in master mode an amount of data in blocking mode.
  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
  *                the configuration information for the specified I2C.
  * @param  DevAddress Target device address: The device 7 bits address value
  *         in datasheet must be shifted to the left before calling the interface
  * @param  pData Pointer to data buffer
  * @param  Size Amount of data to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, 
                                          uint16_t DevAddress, 
                                          uint8_t *pData, 
                                          uint16_t Size, 
                                          uint32_t Timeout){
  uint32_t tickstart = 0x00U;

  /* Init tickstart for timeout management*/
  tickstart = HAL_GetTick();

  if(hi2c->State == HAL_I2C_STATE_READY){
    /* Wait until BUSY flag is reset */
    if(I2C_WaitOnFlagUntilTimeout(hi2c, I2C_FLAG_BUSY, SET, I2C_TIMEOUT_BUSY_FLAG, tickstart) != HAL_OK){
      return HAL_BUSY;
    }

    /* Process Locked */
    __HAL_LOCK(hi2c);

    /* Check if the I2C is already enabled */
    if((hi2c->Instance->CR1 & I2C_CR1_PE) != I2C_CR1_PE){
      /* Enable I2C peripheral */
      __HAL_I2C_ENABLE(hi2c);
    }

    /* Disable Pos */
    hi2c->Instance->CR1 &= ~I2C_CR1_POS;

    hi2c->State     = HAL_I2C_STATE_BUSY_TX;
    hi2c->Mode      = HAL_I2C_MODE_MASTER;
    hi2c->ErrorCode = HAL_I2C_ERROR_NONE;

    /* Prepare transfer parameters */
    hi2c->pBuffPtr    = pData;
    hi2c->XferCount   = Size;
    hi2c->XferOptions = I2C_NO_OPTION_FRAME;
    hi2c->XferSize    = hi2c->XferCount;

    /* Send Slave Address */
    if(I2C_MasterRequestWrite(hi2c, DevAddress, Timeout, tickstart) != HAL_OK){
      if(hi2c->ErrorCode == HAL_I2C_ERROR_AF){
        /* Process Unlocked */
        __HAL_UNLOCK(hi2c);
        return HAL_ERROR;
      }else{
        /* Process Unlocked */
        __HAL_UNLOCK(hi2c);
        return HAL_TIMEOUT;
      }
    }

    /* Clear ADDR flag */
    __HAL_I2C_CLEAR_ADDRFLAG(hi2c);

    while(hi2c->XferSize > 0U){
      /* Wait until TXE flag is set */
      if(I2C_WaitOnTXEFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK){
        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF){
          /* Generate Stop */
          hi2c->Instance->CR1 |= I2C_CR1_STOP;
          return HAL_ERROR;
        }else{
          return HAL_TIMEOUT;
        }
      }
      /* Write data to DR */
      hi2c->Instance->DR = (*hi2c->pBuffPtr++);
      hi2c->XferCount--;
      hi2c->XferSize--;

      if((__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BTF) == SET) 
         && (hi2c->XferSize != 0U)){
        /* Write data to DR */
        hi2c->Instance->DR = (*hi2c->pBuffPtr++);
        hi2c->XferCount--;
        hi2c->XferSize--;
      }
      /* Wait until BTF flag is set */
      if(I2C_WaitOnBTFFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK){
          
        if(hi2c->ErrorCode == HAL_I2C_ERROR_AF){
          /* Generate Stop */
          hi2c->Instance->CR1 |= I2C_CR1_STOP;
          return HAL_ERROR;
        }else{
          return HAL_TIMEOUT;
        }
      }
    }

    /* Generate Stop */
    hi2c->Instance->CR1 |= I2C_CR1_STOP;

    hi2c->State = HAL_I2C_STATE_READY;
    hi2c->Mode = HAL_I2C_MODE_NONE;
    
    /* Process Unlocked */
    __HAL_UNLOCK(hi2c);

    return HAL_OK;
  }else{
    return HAL_BUSY;
  }
}

致謝

參考文獻如下:

  • IIC原理超詳細講解---值得一看
  • 一文看懂I2C協議
  • i2c總線協議簡介
  • I2C死鎖及解決方法
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    459

    文章

    51607

    瀏覽量

    429955
  • I2C協議
    +關注

    關注

    0

    文章

    26

    瀏覽量

    8590
  • 串行外設接口

    關注

    0

    文章

    15

    瀏覽量

    4049
收藏 人收藏

    評論

    相關推薦

    全面掌握面試必考題I2C協議 - 第5節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:01:51

    全面掌握面試必考題I2C協議 - 第6節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:02:42

    全面掌握面試必考題I2C協議 - 第7節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:03:32

    全面掌握面試必考題I2C協議 - 第10節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:06:03

    全面掌握面試必考題I2C協議 - 第11節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:06:53

    全面掌握面試必考題I2C協議 - 第12節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:07:43

    全面掌握面試必考題I2C協議 - 第13節

    I2C協議
    充八萬
    發布于 :2023年09月01日 19:08:34

    I2C最新協議標準

    I2C最新協議標準,詳細介紹了IIC信號要求,供大家參考,
    發表于 12-22 17:59 ?14次下載

    I2C協議標準(中文版)

    I2C協議標準(中文版)_twi_iic,很好的單片機學習資料。
    發表于 03-21 17:31 ?0次下載

    STM32學習之I2C協議(讀寫EEPROM)

    關于STM32學習分享第七章 I2C協議(讀寫EEPROM)文章目錄關于STM32學習分享前言二、代碼1.i2c.c2.i2c.h3.main.c總結前言開始!開始!單片機的I2C
    發表于 11-30 15:21 ?32次下載
    STM32學習之<b class='flag-5'>I2C</b><b class='flag-5'>協議</b>(讀寫EEPROM)

    什么是I2C協議

    I2C協議是一個允許多個 “從機” 芯片和一個或更多的 “主機” 芯片進行通訊的協議。它就像串行外設接口(SPI)一樣,只能用于短距離通信。又像異步串行接口(如RS232或UART), 只需要兩根信號線來交換信息。
    發表于 10-11 16:46 ?4646次閱讀

    關于I2C協議介紹

    你好,我是愛吃魚香ROS的小魚。本節主要介紹I2C協議,并將其主要特點拎出來和大家說說。
    的頭像 發表于 07-13 15:04 ?1635次閱讀
    關于<b class='flag-5'>I2C</b><b class='flag-5'>協議</b>介紹

    使用I2C協議點亮OLED

    你好,我是愛吃魚香ROS的小魚。本節我們就嘗試直接使用I2C協議來點亮OLED,因為主要測試I2C協議,所以對于復雜的顯示處理部分小魚就略過了,畢竟有方便的開源庫使用,我們也不用那么糾
    的頭像 發表于 07-15 16:47 ?2199次閱讀
    使用<b class='flag-5'>I2C</b><b class='flag-5'>協議</b>點亮OLED

    SPI自舉程序中使用的I2C協議

    電子發燒友網站提供《SPI自舉程序中使用的I2C協議.pdf》資料免費下載
    發表于 09-21 11:41 ?0次下載
    SPI自舉程序中使用的<b class='flag-5'>I2C</b><b class='flag-5'>協議</b>

    STM32自舉程序中使用的I2C協議

    電子發燒友網站提供《STM32自舉程序中使用的I2C協議.pdf》資料免費下載
    發表于 09-21 11:27 ?0次下載
    STM32自舉程序中使用的<b class='flag-5'>I2C</b><b class='flag-5'>協議</b>
    主站蜘蛛池模板: 少妇无码吹潮久久精品AV网站 | 国产在线高清视频 | 2020无码最新国产在线观看 | 乳液全集电影在线观看 | 嗯好舒服嗯好大好猛好爽 | 男人J放进女人屁股免费观看 | 99久久re6热精品首页 | 色多多污污在线播放免费 | 亚洲熟妇无码乱子AV电影 | 国精产品一区一区三区有限公司 | 国内九一激情白浆发布 | 国产成人一区免费观看 | 红豆视频免费资源观看 | 一攻多受h嗯啊巨肉bl巨污 | 国产日韩精品一区二区三区在线 | 亚洲一区日韩一区欧美一区a | 男女爽爽无遮挡午夜视频在线观看 | 老板揉搓秘书丰满大乳 | 无颜之月5集全免费看无删除 | 久久伊人免费 | 亚洲欧美强伦一区二区另类 | 一个人的HD高清在线观看 | 999久久久国产精品蜜臀AV | 国产专区青青草原亚洲 | 无码AV精品一区二区三区 | 寂寞夜晚看免费视频 | 麻豆传煤网站网址入口在线下载 | 无遮18禁在线永久免费观看挡 | 亚洲精品久久国产高清 | 亚洲精品美女久久久久99 | 果冻传媒在线完整免费播放 | 久久欧洲AV无码精品色午夜麻豆 | 果冻传媒2021在线观看 | 嫩草影院永久在线一二三四 | 18禁在线无遮挡羞羞漫画 | 午夜国产在线观看 | 美国特级成人毛片 | 色婷婷国产精品视频一区二区 | 18禁国产精品久久久久久麻豆 | 美女内射少妇一区二区四区 | 九色PORNY真实丨首页 |