精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

IIC協議超詳細解釋

jf_7CID84f3 ? 來源:傳感器與檢測技術 ? 作者:傳感器與檢測技術 ? 2022-10-26 15:48 ? 次閱讀

以下內容,將解釋以下幾個問題
1.IIC協議是什么?
2.IIC協議用來干什么?
3.IIC協議的通信過程?

1.IIC協議是什么?

IIC,即I2C,全稱 Inter-Integrated Circuit,字面上的意思是集成電路之間,它其實是I2C Bus簡稱,所以中文應該叫 集成電路總線 ,它是一種串行通信總線,使用多主從架構,由飛利浦公司在1980年代為了讓主板、嵌入式系統手機用以連接低速周邊設備而發展。(百度百科)

2.IIC協議用來干什么?

簡單地說,IIC就是一種通信協議,是為了能讓主板,或嵌入式系統等與其他外設模塊進行通信而進行開發的。玩過stm32開發板的同學都知道,對于一塊stm32核心開發板而言,要想使用其他的外設模塊,就肯定要經過接線,寫代碼,燒錄運行的這個過程。

其實這個過程,就是一個stm32與外設模塊通信的過程。接線,就是搭建通信的線路。寫代碼,就是制定通信的傳輸協議。燒錄運行,就是正式的通信過程。只不過有的模塊通信過程很簡單,大家感覺不出來。

外設和芯片間的通信可以形象地比喻成兩個人講話:

你說的別人得能聽懂:雙方約定信號的協議

你的語速別人得能接受:雙方滿足時序要求

但是隨著科技的發展,模塊越來越多,總不可能,每個模塊都要制定一種通信協議,這樣不現實。所以,總要有一些代表性的協議能夠適應大部分的模塊的通信。IIC這是這樣一種協議,一個IIC總線上,可以掛載多個外接設備。

常用的串行通信協議有:

UART串口通信

②IIC協議

③SPI協議

USB協議(很難)

常用的并行通信協議有:

①8080

②6800

3 .IIC協議的通信過程( 此處重點 )

接線:要搭建IIC的通信線路,出除去電源之外,還需要兩條線,分別是SDA和SCLK

SDA:數據信號線,用于傳輸數據

SCLK:時鐘信號線,用于產生時鐘頻率,控制時序,實現協議過程

由此可以看出,由于是單總線進行數據傳輸,所以IIC協議是半雙工的。

搭建好線路之后,就要進行具體的通信了。

要通信,總得先發個開始信號吧。就像你要和別人說話,總要先喊他一聲一樣。如下圖所示,協議規定,當SCLK時鐘信號一直處于高電平狀態時,SDA線由高電平跳變到低電平這個動作,表示起始信號。注意此時就算SDA數據線的電平跳變完,SCLK線依然是高電平哦。當連接在IIC總線上的外設模塊檢測到這個信號時,就知道數據要開始傳輸了。對于結束信號同理,協議規定,當SCLK時鐘信號一直處于高電平狀態時,SDA線由低電平跳變到高電平這個動作,表示結束信號。

b330b250-359f-11ed-ba43-dac502259ad0.png

在明白如何開始之后,就要開始進行數據的傳輸了。

協議規定,在數據的傳輸過程中,SCLK為高電平時,外設模塊開始采集SDA數據線上的數據,此時要求SDA數據線上的電平狀態必須穩定(不然鬼知道這一位數據是0還是1),當SCLK為低電平時才允許SDA線上的數據跳變成另外一種狀態。

以下以傳輸1個bit的數據為例,如下圖所示:

現在,我想傳輸1bit數據,該位數據為1,從上文知道,我們在發完開始信號之后,此時SDA數據線的電平狀態為低電平,SCLK信號依然是高電平。難道這個時候外設就要開始讀取數據了嗎?

這顯然不是的,從發完開始信號到真正的數據傳輸之間,會有一段緩沖時間,讓我們去準備數據,在準備數據階段,先將SCLK信號拉低一段時間,在這期間將SDA數據線拉高一段時間(即數據1),然后再將SCLK信號拉高,此時這個時鐘信號的高電平被外設檢測到的話,外設就知道要讀取數據了,從而SDA上的數據就會被外設讀到了。依次類推,傳輸下一位數據。

b375ff2c-359f-11ed-ba43-dac502259ad0.png

一般,傳輸完1個字節(即8bit,高位先入)的數據,才算做一次完整的數據傳輸,因為對存儲單元而言,最小的單位便是字節。那如何確定,每次都完好地傳輸了一個字節呢?

這種情況就需要外設來做出回應了,就像打電話一樣,如果對方不在,或不想聽,說再多也沒用啊。那么外設如何做出回應呢?

協議規定,主機每傳完一個字節的數據即外設每收到一個字節的數據,外設就要在第9個時鐘脈沖到來的時候,將SDA數據線拉低進行應答(ACK),且必須是穩定的低電平,表示已經收到了一個字節的數據,拉高表示不進行應答(NACK;注意這里是外設將SDA數據線拉低,不是主機了哦。如下圖所示:

b39abaec-359f-11ed-ba43-dac502259ad0.png

所以在主機傳完一個字節的數據之后,就應該釋放總線(協議規定,當SDA和SCLK同時為高時,表示空閑狀態)然后把SDA數據線連接的IO口從輸出模式轉換成輸入模式,這樣才能拿到SDA數據線上的應答信號。這樣,一個字節的數據就從主機到外設傳輸完畢了。

既然IIC是雙向通信的,那主機肯定也是需要從外設讀取數據的,那這個讀取的過程又是怎么實現的呢?畢竟外設對于我們而言是不能直接操作的,我們能操作的只有stm32。我們知道,一個IIC總線上,可以掛載多個設備,那么stm32如何確定是哪個外設正在跟我進行通信呢。對于此,那些生產外設模塊的廠商們就約定,要是這個設備使用IIC協議進行通信,那么就要給這個設備指定一個器件地址,以供芯片訪問。這個器件地址會在你購買其模塊的時候在使用手冊上注明。所以,要跟哪個模塊通信,就一定要通過查閱其使用手冊,找到它的器件地址。

所以,在上文所述的最開始的一個字節的數據傳輸過程中,這一個數據往往是器件地址。這樣,對應的外設才知道,是要跟我進行通信。讀取數據,也是同理,要想從外設中讀取到數據,主機要明確三點:從哪個外設中的哪個地方讀取數據,讀取到的數據要存到哪里。

所以主機,在開始讀數據之前,主機必須要先給外設發器件地址,數據所在的地址,外設才會知道你要從該地址讀取數據,從而把數據通過SDA線傳出來。至于具體的每個字節的傳輸過程,和上面所講的從主機到外設的過程差不多,只不過反了一個反向而已,并且主機的等待應答變成了主動應答。

/*  設置SDA總線為輸出模式  參數值:NULL  返回值:NULL*/
void IIC_setSDAMode_Out(){  GPIO_InitTypeDef GPIO_IIC;    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);    GPIO_IIC.GPIO_Mode  = GPIO_Mode_OUT;        //輸出  GPIO_IIC.GPIO_OType = GPIO_OType_PP;        //推挽  GPIO_IIC.GPIO_Pin   = GPIO_Pin_15;                //引腳  GPIO_IIC.GPIO_PuPd  = GPIO_PuPd_UP;           //上拉  GPIO_IIC.GPIO_Speed = GPIO_Speed_25MHz;        //輸出  GPIO_Init(GPIOE, &GPIO_IIC);}

/*  設置SDA總線為輸入模式  參數值:NULL  返回值:NULL*/
void IIC_setSDAMode_In(){
  GPIO_InitTypeDef GPIO_IIC;  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);    GPIO_IIC.GPIO_Mode  = GPIO_Mode_IN;           //輸出  GPIO_IIC.GPIO_Pin   = GPIO_Pin_15;                 //引腳  GPIO_IIC.GPIO_PuPd  = GPIO_PuPd_UP;            //上拉  GPIO_Init(GPIOE, &GPIO_IIC);
}
/*  IIC開始信號  參數值:NULL  返回值:NULL*/
void IIC_Start(){    IIC_setSDAMode_Out();        IIC_SDA_OUT(1);                             //總線釋放狀態    IIC_SCL_OUT(1);    delay_us(5);      IIC_SDA_OUT(0);                             //SDA跳變為低電平    delay_us(5);      IIC_SCL_OUT(0);            delay_us(5);


}
/*  IIC停止信號  參數值:NULL  返回值:NULL*/
void IIC_Stop(){    IIC_setSDAMode_Out();        IIC_SDA_OUT(0);              IIC_SCL_OUT(0);    delay_us(5);      IIC_SCL_OUT(1);                              //SDA跳變為高電平    delay_us(5);      IIC_SDA_OUT(1);            delay_us(5);
}
/*  主機寫入數據到外設中  參數值:         data  要寫入的一個字節  返回值:NULL*/
void IIC_writeByte(u8 data){    IIC_setSDAMode_Out();    IIC_SCL_OUT(0);                                 //只有時鐘線拉低,SDA上的數據才允許寫入  delay_us(5);    //將數據一位一位的發出去  for(int i =0;i<8;i++)  {      if(data&(0x1<<(7-i)))               //高位先入      {          IIC_SDA_OUT(1);      }      else      {          IIC_SDA_OUT(0);      }             IIC_SCL_OUT(1);                 //讓外設讀取數據       delay_us(5);           IIC_SCL_OUT(0);                 //重新拉低,準備寫入下一位數據       delay_us(5);  }}


/*  主機從外設中讀取一個字節的數據  參數值:NULL  返回值:NULL*/
u8 IIC_readByte(){
    u8 data = 0;  IIC_setSDAMode_In();
  IIC_SCL_OUT(0);                  //先拉低,為讀取數據做準備  delay_us(5);
  for(int i=0;i<8;i++)  {        IIC_SCL_OUT(1);         // SCL為高期間才可以讀取數據      delay_us(5);        if(IIC_SDA_IN)    {        data|=(0x01<<(7-i));          }else{      data &= ~(0x1<<(7-i));    }      IIC_SCL_OUT(0);    delay_us(5);  }  return data;

}


/*  主機等待應答  參數值:NULL  返回值:ack     0  應答   1 不應答*/

u8 IIC_waitAck(){    u8 ack =0;  IIC_setSDAMode_In();
  IIC_SCL_OUT(0);             //準備時序  delay_us(5);    IIC_SCL_OUT(1);  delay_us(5);  
  if(IIC_SDA_IN)  {        ack =1;  }  else  {        ack =0;    }      IIC_SCL_OUT(0);              //拉低,表示應答完成  delay_us(5);      return  ack;

}
/*  主機主動應答  參數值:        ack  0 應答 1 不應答  返回值:NULL*/

void IIC_Ack(u8 ack){  IIC_setSDAMode_Out();  IIC_SCL_OUT(0);  delay_us(5);    if(ack)  {    IIC_SDA_OUT(1);  }  else  {      IIC_SCL_OUT(0);  }      IIC_SCL_OUT(1);  delay_us(5);    IIC_SCL_OUT(0);  delay_us(5);    }

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 通信協議
    +關注

    關注

    28

    文章

    858

    瀏覽量

    40268
  • 總線
    +關注

    關注

    10

    文章

    2868

    瀏覽量

    87991
  • IIC
    IIC
    +關注

    關注

    11

    文章

    300

    瀏覽量

    38277

原文標題:IIC協議超詳細解釋(適合小白入門)

文章出處:【微信號:傳感器與檢測技術,微信公眾號:傳感器與檢測技術】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FPGA實現IIC協議的設計

    今天給大家帶來的是IIC通信,IIC協議應用非常廣泛,例如與MPU6050進行通信,配置OV5640攝像頭、驅動OLED屏幕等等,都需要使用到IIC
    的頭像 發表于 03-04 10:49 ?1181次閱讀
    FPGA實現<b class='flag-5'>IIC</b><b class='flag-5'>協議</b>的設計

    什么是IIC和SPI總線協議?

    通信協議非常適合近距離低速芯片間通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市場需求制定了這兩種標準通信協議
    發表于 10-21 07:25

    STM32的IIC協議簡介

    文章目錄(一)IIC協議簡介(二)物理層和協議層簡介(三)IIC物理層:3.1、物理層的特點(四)IIC
    發表于 01-05 06:13

    如何使用代碼實現的IIC協議

    1. 綜述  由上篇博客可知道IIC協議如何用代碼實現,本篇博客就不涉及協議內容,只講解如何使用?! ”敬蔚膶嶒瀭鞲袨椋篋S3231(時鐘模塊),對于時鐘模塊的具體信息我也就不多介紹,大家可以自行度
    發表于 02-21 06:36

    iic總線的詳細說明

    iic總線的詳細說明,協議說明,教程,學習
    發表于 11-16 19:05 ?0次下載

    IIC總線協議

    IIC總線協議,感興趣的小伙伴們可以看看。
    發表于 07-26 16:29 ?58次下載

    IIC總線協議中文版

    IIC協議的介紹,中文版,易懂,可以在里面了解到IIC是何物,如何使用以及定義
    發表于 08-09 15:08 ?0次下載

    IIC和SPI總線協議的區別

    通信協議非常適合近距離低速芯片間通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市場需求制定了這兩種標準通信協議。
    的頭像 發表于 04-24 12:41 ?6389次閱讀
    <b class='flag-5'>IIC</b>和SPI總線<b class='flag-5'>協議</b>的區別

    51單片機中IIC協議詳細資料說明

    本文檔的主要內容詳細介紹的是51單片機中IIC協議詳細資料說明。
    發表于 06-26 17:43 ?7次下載
    51單片機中<b class='flag-5'>IIC</b><b class='flag-5'>協議</b>的<b class='flag-5'>詳細</b>資料說明

    常用通信協議——IIC協議實戰項目(一)(STM32+MPU6050+AT24C02)

    IIC協議對MPU6050、AT24C02進行數據的循環讀取。我們將分三章對本項目進行詳細闡述。本章主要是實現功能1:1、使用STM32單片機用IIC
    發表于 12-06 15:51 ?9次下載
    常用通信<b class='flag-5'>協議</b>——<b class='flag-5'>IIC</b><b class='flag-5'>協議</b>實戰項目(一)(STM32+MPU6050+AT24C02)

    常用通信協議——IIC協議實戰項目(二)(STM32+MPU6050+AT24C02)

    IIC協議對MPU6050、AT24C02進行數據的循環讀取。我們將分三章對本項目進行詳細闡述。本章主要是實現功能:1、使用STM32單片機用IIC
    發表于 12-06 16:06 ?10次下載
    常用通信<b class='flag-5'>協議</b>——<b class='flag-5'>IIC</b><b class='flag-5'>協議</b>實戰項目(二)(STM32+MPU6050+AT24C02)

    IIC協議詳細解釋(適合小白入門)

    以下內容,將解釋以下幾個問題1.IIC協議是什么?2.IIC協議用來干什么?3.IIC
    發表于 12-07 14:21 ?5次下載
    <b class='flag-5'>IIC</b><b class='flag-5'>協議</b><b class='flag-5'>超</b><b class='flag-5'>詳細</b><b class='flag-5'>解釋</b>(適合小白入門)

    振弦采集模塊的通訊協議IIC

    振弦采集模塊的通訊協議IICIIC 通訊協議本身即是基于設備地址和寄存器的物理層通訊協議, VMXXX 使用
    的頭像 發表于 11-17 10:02 ?808次閱讀
    振弦采集模塊的通訊<b class='flag-5'>協議</b>( <b class='flag-5'>IIC</b>)

    什么是IIC協議

    IIC協議最早1982年由飛利浦公司設計開發,是一種兩線制(SDA + SCL)的串行通行方式,提供了主從機之間通行的一種方案,在今天也是被廣泛的應用在很多的產品設備上。
    的頭像 發表于 02-10 10:53 ?4533次閱讀
    什么是<b class='flag-5'>IIC</b><b class='flag-5'>協議</b>

    IIC通訊協議的電路設計

    前面我們概述過一些常見的通訊協議,本文著重講講關于IIC協議
    的頭像 發表于 04-19 11:00 ?1997次閱讀
    <b class='flag-5'>IIC</b>通訊<b class='flag-5'>協議</b>的電路設計