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

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

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

3天內不再提示

Arduino中進行I2C通信發送數據案例分析

電子設計 ? 來源:一板網 ? 作者:風箏 ? 2021-01-01 10:27 ? 次閱讀

在之前的文章中,我們介紹了Arduino之間的SPI通信。今天我們將學習另一種串行通信協議:I2C(內部集成電路)。比較I2C和SPI,I2C只有兩條線,而SPI使用四條,I2C可以有多個主機和從機,而SPI只能有一個主機和多個從機。因此,如果項目中有多個微控制器需要作為主機,那么就采用I2C。 I2C通信通常用于與陀螺儀、加速度計、氣壓傳感器LED顯示器等進行通信。

在本篇文章中,我們將使用I2C總線在兩個arduino開發板之間進行通信,并且使用電位計將值(0到127)相互發送。這些值將顯示在連接到每個Arduino的1602液晶顯示屏上。文章中,一個Arduino開發板作為主機,另一個開發板作為從機。現在讓我們從關于I2C通信的介紹開始吧。

什么是I2C通信協議?

術語IIC代表“Inter Integrated Circuits”。它通常表示為I2C或IIC,甚至在某些地方表示為2線接口協議(TWI),但它們代表的含義是一樣的。 I2C是同步通信協議,也就是說共享信息的設備必須共享公共時鐘信號。它只有兩根線來共享信息,其中一根用于時鐘信號,另一根用于發送和接收數據。

I2C通信如何工作?

I2C通信最初由Phillips引入。如前所述,它有兩根導線,這兩根導線將連接在兩個設備上。這里一個設備稱為主機,另一個設備稱為從機。通信應該并且將始終發生在一個主機和一個從機之間。 I2C通信的優點是可以將多個從機連接到一個主機。

o4YBAF_bFX-ANZ1IAACK-JXPhYc302.png

完整的通信通過這兩條導線進行,即串行時鐘(SCL)和串行數據(SDA)。

● 串行時鐘(SCL):與主設備共享主設備生成的時鐘信號

● 串行數據(SDA):在主機和從機之間發送數據。

在任何給定時間,只有主機才能啟動通信。由于總線中有多個從站,因此主站必須使用不同的地址來引用每個從站。當被尋址時,只有具有該特定地址的從機將應答該信息,而其他地址繼續退出。這樣我們就可以使用相同的總線與多個設備進行通信。

I2C的電壓電平未預定義。 I2C通信靈活,意味著由5v電源供電的器件,可以使用5v用于I2C,3.3v器件可以使用3v進行I2C通信。但是,如果兩個運行在不同電壓下的設備需要使用I2C進行通信呢? 5V I2C總線不能與3.3V器件連接。在這種情況下,電壓移位器用于匹配兩個I2C總線之間的電壓電平。

有一些條件可以構成傳輸。傳輸的初始化從SDA的下降沿開始,在下圖中定義為“START”條件,其中主機將SCL設為高電平,同時將SDA設置為低電平。如下圖所示,

pIYBAF_bFYyAJb6zAAAWiXiEpZY108.png

SDA的下降沿是START條件的硬件觸發。在此之后,同一總線上的所有設備都進入監聽模式。

同樣的,SDA的上升沿停止傳輸,在上圖中顯示為“STOP”條件,其中主機將SCL置為高電平并且還釋放SDA以變為高電平。因此,SDA的上升沿會阻止傳輸。

pIYBAF_bFZaAOoSVAAALYSRDWog203.png

R / W位表示后續字節的傳輸方向,如果為高電平表示從機將發送,如果為低則表示主機將發送。

每個位在每個時鐘周期發送,因此傳輸一個字節需要8個時鐘周期。在發送或接收每個字節之后,保持第九個時鐘周期用于ACK / NACK(確認/未確認)。該ACK位由從機或主機根據情況生成。對于ACK位,SDA在第9個時鐘周期由主機或從機設置為低電平。所以它被認為是低,否則NACK。

pIYBAF_bFbGAGwdnAABpfusEOfM752.png

在哪里使用I2C通信?

I2C通信僅用于短距離通信。它在某種程度上肯定是可靠的,因為它具有同步的時鐘脈沖以使其智能化。該協議主要用于與必須向主設備發送信息的傳感器或其他設備進行通信。當微控制器必須使用最少的導線與許多其他從模塊通信時非常方便。如果您正在尋找遠程通信,您應該嘗試RS232,如果您正在尋找更可靠的通信,您應該嘗試SPI協議。

Arduino中的I2C

下圖顯示了Arduino UNO中的I2C引腳。

I2C總線Arduino中的引腳

SDAA4

SCLA5

在開始使用兩個Arduino編程I2C之前,我們需要了解Arduino IDE中使用的Wire庫。

庫《Wire.h》包含在程序中,用于使用以下I2C通信函數。

1. Wire.begin(address):

用途:該庫用于與I2C設備進行通信。初始化Wire庫,并作為從機或主機加入I2C總線。

address:7位從機地址是可選的,如果未指定地址,類似[Wire.begin()],將作為主機加入總線。

2. Wire.read():

用途:該函數用于讀取從主機或從機接收的字節,該字節是在調用requestFrom()后從一個從機發送到主設備的字節,或從主設備發送到從機的字節。

3. Wire.write():

用途:該函數用于將數據寫入從機或主機。

從機到主機:當主站中使用Wire.RequestFrom()時,從機將數據寫入主機。

主機到從機:從主機到從機的傳輸,Wire.write()用在調用Wire.beginTransmission()和Wire.endTransmission()之間。

Wire.write()可以寫成:

? Wire.write(value)

value:要作為單個字節發送的值。

? Wire.write(string):

string:要作為一系列字節發送的字符串。

? Wire.write(data,length):

data:要作為字節發送的數據數組

length:要傳輸的字節數。

4. Wire.beginTransmission(address):

用途:該函數用于開始使用給定的從地址傳輸到I2C設備。隨后,使用write()函數構建用于傳輸的字節隊列,然后通過調用endTransmission()函數傳輸它們。

address:發送設備的7位地址。

5. Wire.endTransmission();

用途:此函數用于結束由beginTransmission()發起的從機的傳輸,并傳輸由Wire.write()排隊的字節。

6. Wire.onRequest();

用途:當主設備使用Wire.requestFrom()請求來自從設備的數據時,將調用此函數。這里我們可以包含Wire.write()函數來向主機發送數據。

7. Wire.onReceive();

用途:當從設備從主設備接收數據時,將調用此函數。這里我們可以包含Wire.read();用于讀取從主站發送的數據的函數。

8. Wire.requestFrom(addres,quantity);

用途:該函數在主設備中用于從從設備請求字節。函數Wire.read()用于讀取從設備發送的數據。

address:要從中請求字節的設備的7位地址

quantity:要請求的字節數

需要的組件

● Arduino Uno開發板

● 1602 LCD顯示模塊

● 10K電位器

● 面包板

● 連接導線

電路原理

pIYBAF_bFdCADV7NAAI_4gKk-ps581.png

工作過程

這里為了演示Arduino中的I2C通信,我們使用兩個Arduino UNO和兩個1602 LCD顯示器相互連接,并在兩個arduino開發板上使用兩個電位器來確定從主設備到從設備和從設備到主設備的發送值(0到127)通過改變電位器。

我們使用電位器將arduino引腳A0的輸入模擬值從(0到5V)轉換為模擬到數字值(0到1023)。然后,這些ADC值進一步轉換為(0到127),因為我們只能通過I2C通信發送7位數據。 I2C通信通過arduino的A4和A5引腳上的兩條線進行。

通過改變主機的電位器,從機Arduino開發板的LCD的值將發生變化,反之亦然。

Arduino中的I2C編程

本篇文章有兩個程序,一個用于主機Arduino,另一個用于從機Arduino。

主機Arduino編程介紹

1.首先,我們需要包含用于使用I2C通信功能的Wire庫和用于使用LCD功能的LCD庫。還需要為1602 LCD定義LCD引腳。

#include《Wire.h》

#include《LiquidCrystal.h》

LiquidCrystal lcd(2, 7, 8, 9, 10, 11);

2.在void setup()函數中,

我們以波特率9600啟動串行通信。

Serial.begin(9600);

接下來在引腳(A4,A5)上啟動I2C通信

Wire.begin(); //Begins I2C communication at pin (A4,A5)

接下來我們在1602模式下初始化LCD顯示模塊并顯示歡迎信息,然后在五秒后清除。

lcd.begin(16,2); //Initilize LCD display

lcd.setCursor(0,0); //Sets Cursor at first line of Display

lcd.print(“Circuit Digest”); //Prints CIRCUIT DIGEST in LCD

lcd.setCursor(0,1); //Sets Cursor at second line of Display

lcd.print(“I2C 2 ARDUINO”); //Prints I2C ARDUINO in LCD

delay(5000); //Delay for 5 seconds

lcd.clear(); //Clears LCD display

3.在void loop()函數中

首先,我們需要從Slave獲取數據,因此我們使用requestFrom()和從地址8,我們請求一個字節

Wire.requestFrom(8,1);

使用Wire.read()讀取接收的值

byte MasterReceive = Wire.read();

接下來,我們需要讀取連接到引腳A0的主機arduino電位器的模擬值

int potvalue = analogRead(A0);

我們將該值轉換為0到127的字節。

byte MasterSend = map(potvalue,0,1023,0,127);

接下來我們需要發送轉換后的值,使用8地址開始從機sarduino的傳輸

Wire.beginTransmission(8);

Wire.write(MasterSend);

Wire.endTransmission();

接下來,我們顯示來自從機arduino的接收值,延遲為500微秒,我們不斷接收并顯示這些值。

lcd.setCursor(0,0); //Sets Currsor at line one of LCD

lcd.print(“》》 Master 《《”); //Prints 》》 Master 《《 at LCD

lcd.setCursor(0,1); //Sets Cursor at line two of LCD

lcd.print(“SlaveVal:”); //Prints SlaveVal: in LCD

lcd.print(MasterReceive); //Prints MasterReceive in LCD received from Slave

Serial.println(“Master Received From Slave”); //Prints in Serial Monitor

Serial.println(MasterReceive);

delay(500);

lcd.clear();

從機Arduino編程介紹

1.與主機設備相同,首先我們需要包含用于使用I2C通信功能的Wire庫和用于使用LCD功能的LCD庫。還為1602 LCD定義LCD引腳。

#include《Wire.h》

#include《LiquidCrystal.h》

LiquidCrystal lcd(2, 7, 8, 9, 10, 11);

2. 在void setup()函數中,

我們以波特率9600啟動串行通信。

Serial.begin(9600);

接下來在引腳(A4,A5)上啟動I2C通信,從地址設定為8。這里指定從地址非常重要。

Wire.begin(8);

接下來,當從機從主機接收值并且主機請求從機的值時,我們需要調用該函數

Wire.onReceive(receiveEvent);

Wire.onRequest(requestEvent);

接下來我們在16X2模式下初始化LCD顯示模塊并顯示歡迎信息,然后在五秒后清除。

lcd.begin(16,2); //Initilize LCD display

lcd.setCursor(0,0); //Sets Cursor at first line of Display

lcd.print(“Circuit Digest”); //Prints CIRCUIT DIGEST in LCD

lcd.setCursor(0,1); //Sets Cursor at second line of Display

lcd.print(“I2C 2 ARDUINO”); //Prints I2C ARDUINO in LCD

delay(5000); //Delay for 5 seconds

lcd.clear(); //Clears LCD display

3.接下來,我們有兩個函數,一個用于請求事件,另一個用于接收事件

對于請求事件

當主機從從機請求值時,將執行該函數。此函數從從機電位器獲取輸入值并以7位轉換,然后將該值發送給主機。

void requestEvent()

{

int potvalue = analogRead(A0);

byte SlaveSend = map(potvalue,0,1023,0,127);

Wire.write(SlaveSend);

}

對于接收事件

當主機通過從機地址(8)向從機發送數據時,將執行該函數。此函數從主機讀取接收的值并存儲在byte類型的變量中。

void receiveEvent (int howMany)

{

SlaveReceived = Wire.read();

}

4. 在void loop()函數中:

我們在LCD顯示模塊中連續顯示主設備的接收值。

void loop(void)

{

lcd.setCursor(0,0); //Sets Currsor at line one of LCD

lcd.print(“》》 Slave 《《”); //Prints 》》 Slave 《《 at LCD

lcd.setCursor(0,1); //Sets Cursor at line two of LCD

lcd.print(“MasterVal:”); //Prints MasterVal: in LCD

lcd.print(SlaveReceived); //Prints SlaveReceived value in LCD received from Master

Serial.println(“Slave Received From Master:”); //Prints in Serial Monitor

Serial.println(SlaveReceived);

delay(500);

lcd.clear();

}

通過旋轉一側的電位器,您可以在另一側看到LCD上的變化值:

以上就是在Arduino中進行I2C通信的方式,這里我們不僅使用兩個Arduino開發板來演示通過I2C通信發送數據,而且還演示了接收數據。所以現在你可以將任何I2C傳感器連接到Arduino。
編輯:hfy

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

    關注

    34

    文章

    4437

    瀏覽量

    168069
  • 電位器
    +關注

    關注

    14

    文章

    1013

    瀏覽量

    66915
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1495

    瀏覽量

    124228
  • Arduino
    +關注

    關注

    188

    文章

    6477

    瀏覽量

    187546
收藏 人收藏

    評論

    相關推薦

    I2C總線的優缺點分析

    I2C總線作為一種廣泛使用的串行通信協議,以其簡單性和高效性在嵌入式系統中占據著重要地位。 I2C總線的優點 1. 簡單性和低成本 I2C總線只需要兩條線(
    的頭像 發表于 01-17 15:50 ?105次閱讀

    I2C總線數據包結構詳解

    I2C(Inter-Integrated Circuit)總線是一種用于連接微控制器和各種外圍設備的通信協議。它使用兩條線:串行數據線(SDA)和串行時鐘線(SCL),實現了設備之間的簡單、高效
    的頭像 發表于 01-17 15:46 ?120次閱讀

    如何選擇I2C總線拉電阻

    I2C總線是一種廣泛使用的串行通信協議,它允許多個設備通過兩條線(數據線SDA和時鐘線SCL)進行通信。為了確保
    的頭像 發表于 01-17 15:43 ?94次閱讀

    I2C總線與Arduino的接口示例

    在現代電子設計中,I2C總線因其簡單性和靈活性而廣受歡迎。它允許多個設備共享同一通信線路,從而節省空間和成本。Arduino,作為一個多功能的微控制器平臺,自然也支持I2C
    的頭像 發表于 01-17 15:34 ?138次閱讀

    I2C總線的工作模式介紹

    在現代電子系統中,I2C總線作為一種多主機、多從機的串行通信協議,扮演著至關重要的角色。它允許多個設備共享同一總線,進行數據傳輸,從而簡化了系統設計并降低了成本。 I2C總線的基本特性
    的頭像 發表于 01-17 15:32 ?124次閱讀

    I2C總線故障排除技巧

    I2C總線是一種廣泛使用的串行通信協議,它允許多個設備在兩條線上(數據線SDA和時鐘線SCL)進行通信。由于其簡單性和靈活性,
    的頭像 發表于 01-17 15:20 ?148次閱讀

    I2C總線與單片機的連接

    組成:數據線(SDA)和時鐘線(SCL)。SDA負責數據的傳輸,而SCL則用于同步數據傳輸。I2C協議支持多主機和多從機的通信,每個設備都有
    的頭像 發表于 01-17 15:18 ?136次閱讀

    I2C總線設備地址設置方法

    I2C總線是一種廣泛使用的串行通信協議,它允許多個設備在兩條線上(數據線SDA和時鐘線SCL)進行通信。每個設備都有一個唯一的地址,以確保
    的頭像 發表于 01-17 15:17 ?175次閱讀

    I2C總線應用實例分析

    I2C總線使用兩條線進行通信數據線(SDA)和時鐘線(SCL)。這種雙線制設計使得I2C總線能夠在多個設備之間共享,而不需要為每個設備單
    的頭像 發表于 01-17 15:09 ?149次閱讀

    I2C總線與SPI總線的比較

    于低速通信。它只需要兩根線:數據線(SDA)和時鐘線(SCL),這使得I2C非常適合于節省引腳的應用。 特點 多主機支持 :多個微控制器可以共享同一I2C總線。 多從機支持 :多個從設
    的頭像 發表于 01-17 15:08 ?146次閱讀

    RISC V的I2C操作

    。tsuData中,1代表10ns;Timeout中,1表示10nstLow和tHigh的1代表10ns10.1.3 軟件部分(Risc V)l? I2C通信主要包括以下幾個部分:1、主設備發送起始位(Start
    的頭像 發表于 11-01 11:06 ?272次閱讀

    簡單認識I2C通信協議

    I2C(Inter-Integrated Circuit)通信協議是由飛利浦公司(現為恩智浦半導體)開發的一種簡單、雙向二線制同步串行總線協議。自1982年發布以來,I2C協議因其高效、靈活和易于實現的特點,在電子設備間的
    的頭像 發表于 07-25 18:06 ?1615次閱讀

    SPI和I2C通信協議:應用與區別

    本文深入解析了SPI和I2C這兩種通信協議的特點、工作原理和應用場景。SPI適用于高速數據傳輸,常用于存儲器芯片和顯示器驅動等領域;I2C適用于低速控制和傳感器
    的頭像 發表于 04-22 16:45 ?1933次閱讀

    逼真動畫展示I2C、SPI、UART的通信過程

    到目前為止,I2C、SPI和UART等仍然是電子嵌入式設備中最常用的通信協議,本文,我們將剖析這三種協議,讓大家清楚、直觀的了解它們的功能、優點和局限性,并輔以GIF動圖展示。I2C協議I2C
    的頭像 發表于 04-12 08:27 ?1036次閱讀
    逼真動畫展示<b class='flag-5'>I2C</b>、SPI、UART的<b class='flag-5'>通信</b>過程

    什么是I2C協議 I2C總線的控制邏輯

    在實際使用過程中,I2C比較容易出現的一個問題就是死鎖 ,死鎖在I2C中主要表現為:I2C死鎖時表現為SCL為高,SDA一直為低。
    發表于 03-12 09:17 ?1145次閱讀
    什么是<b class='flag-5'>I2C</b>協議 <b class='flag-5'>I2C</b>總線的控制邏輯
    主站蜘蛛池模板: 俄罗斯aaaaa一级毛片| 爱情岛论坛免费在线观看| 99精品视频免费观看| 黑人干亚洲人| 我的奶头被客人吸的又肿又红| 国产人妻精品午夜福利免费不卡 | 91夫妻交友论坛| 狠狠干.in| 亚洲精品第一页中文字幕| 国产3级在线| 日韩专区亚洲国产精品| gv手机在线观看| 且试天下芒果免费观看| yellow2019在线观看视频| 青娱乐在线一区| 超碰免费视频公开97| 日久精品不卡一区二区| 国产不卡免费| 性欧美video| 狠狠综合久久综合88亚洲| 亚洲国产五月综合网| 寂寞护士中文字幕 mp4| 一边亲着一面膜下的免费过程 | 韩日午夜在线资源一区二区| 婷婷五月久久丁香国产综合| 干了快生了的孕妇| 熟女久久久久久久久久久| 国产精品久久久亚洲偷窥女厕| 美女被爽cao免费漫画| 99久久就热视频精品草| 漂亮的保姆3中文版完整版 | qvod12| 欧美高跟镣铐bdsm视频| 99精品AV无码一区二区| 欧美午夜精品A片一区二区HD| 亚洲你我色| 久久AV国产麻豆HD真实| 99精品99| 色偷偷超碰97人人澡人人| 好紧好湿太硬了我太爽了文字| 色尼玛亚洲|