在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

如何僅在兩個Aduino之間進行2路I2C通信

454398 ? 來源:網絡整理 ? 作者:網絡整理 ? 2019-11-25 15:16 ? 次閱讀

步驟1:您需要什么:

我們假設您具有以下部分:

兩個Arduino UNO

一些公對母電線

一些公對公電線

一個旋轉電位計

一個面包板

步驟2:I2C的工作方式

I2C是一種通信協議,使您可以在微控制器和某些傳感器等電路之間進行通信。它僅使用兩根線(如此高效!)。第一線是時鐘線,通常在文檔中寫為SCL。第二根線是數據線,通常寫為SDA。

I2C總線上的設備可以是“主機”或“從機”。僅主機控制時鐘線上的電壓,而主機和從機都可以操縱數據線上的電壓。通過仔細輪流,網絡上的所有設備都可以共享信息

為了將信息發送到正確的位置,每個從站都有一個唯一的地址號碼,就像每個電話都有一個唯一的號碼一樣。

當我看到I2C器件時,他們有文檔說:“該電路希望接收N字節表示ABC的數據,并發送回M字節表示DEF的數據。”如果您要購買的設備不包含此信息,則不要購買。

有關I2C通信內部工作的更多詳細信息,請查看以下鏈接:

http://www.robot-electronics.co.uk/i2c-tutorial

http://www.i2c-bus.org/結果

https://en.wikipedia.org/wiki/I%C2%B2C

步驟3:設置

上圖中的設備使用引腳A4和A5進行I2C通信。每種類型的arduino和Wire庫的I2C引腳說明如下:

https://www.arduino.cc/zh/Reference/Wire

主設置看起來像這樣:

#include

void setup() {

// note that begin() has no parameter.

Wire.begin();

}

從站設置看起來像這樣:

#include

void setup() {

// note that begin() has a parameter.

// Any number from 0.。..127 will work.

Wire.begin(1);

}

如果您要在該網絡上使用第二個從站,則需要除#1外的地址,因為該地址已被使用。這意味著只能通過仔細計劃來添加和刪除網絡上的設備。許多使用I2C的設備都將帶有一個帶撥碼開關(小光開關)的PCB,可以將其撥動以更改地址。便宜的型號將有裸露的接觸。要翻轉這些開關,必須觸摸裸觸點。

第4步:發送數據

與之交談的人,然后發送信息,然后說“我完成了。”

void loop() {

Wire.beginTransmission(1);

Wire.write(“hello, ”);

Wire.endTransmission();

}

從站僅需發送信息。每個人都假定從服務器正在與主機通信。

void loop() {

Wire.write(“world!”);

}

Wire.write()具有三個版本:一個用于單個數字,一個用于字符串,以及一個用于數據塊。您必須告訴Wire數據塊有多長時間。

步驟5:接收數據

主機可以使用

Wire.read()

從網絡獲取單個字節的數據,而不管是誰發送的。

Wire.read()是阻塞操作-您的Arduino在讀取一個字節之前不會做其他任何事情。如果沒有要讀取的字節,則可能要等待很長時間!為避免此問題,還有

Wire.available()

將返回等待讀取的字節數。

將兩者放在一起,

while(Wire.available()) {

char c = Wire.read();

// do something with c

// maybe count how much we received,

// do something when we get the whole message.

}

// do other stuff while we wait for the whole message.

第6步:請求/接收

您已經擁有運行I2C網絡所需的一切,但是我想讓您了解另外一項功能,這有點棘手,所以請忍受我。實際上,我會說這完全是不需要,但是我將其包括在內是為了徹底。也許表明有很多方法可以完成相同的工作,有些方法比其他方法更好。

您已經知道,在C代碼中,有諸如setup()和loop()之類的方法。您也可以創建自己的方法并按名稱調用它們。您是否知道可以將方法名稱作為參數發送給另一個方法?通常用于稱為回調的東西。在這種情況下,我們將告訴線庫(I2C)當從站從網絡接收數據時調用哪種方法。

// a master is calling and requesting something.

void requestEvent() {

// definitely send something back.

Wire.write(2); // one byte as an example.

}

// a master has sent something.

// Might not be requesting anything.

// Might not be all the data that was sent (yet)

void receiveEvent(int bytes) {

int i;

for(i=0;i char c = Wire.read();

// do something with c.

}

// maybe send something back

}

void setup() {

Wire.begin(1); // slave address = 1

Wire.onRequest(requestEvent);

Wire.onReceive(receiveEvent);

}

void loop() {

// do nothing!

}

此處的一些注意事項:

requestEvent()不會收到數字,說明主機期望多少字節。

據我所知,這些事件是中斷-無論loop()中發生了什么,它們都會盡快發生。如果時間和代碼正確,那么無論循環做什么,都可能會嚴重混亂。由于很難重新創建導致問題的條件,因此很難診斷出它為什么混亂。

因此,正如我所說的,盡管您可以使用這些工具,但我不建議您這樣做

第7步:雙向通信

現在讓我們將它們放在一起。

主代碼:

#include

#define TO_MASTER_SIZE 3

#define TO_SLAVE_SIZE 4

#define START_NODE 1 // The starting I2C address of slave nodes

#define END_NODE 2 // last node to probe +1

#define NODE_READ_DELAY 100 // Some delay between I2C node reads

byte messageToMaster[TO_MASTER_SIZE];

byte messageToSlave[TO_SLAVE_SIZE];

void setup() {

Serial.begin(9600);

Serial.println(“MASTER”);

Wire.begin(); // Activate I2C link

}

void loop() {

for (int address = START_NODE; address 《 END_NODE; address++) {

sendToSlave(address);

readFromSlave();

}

delay(NODE_READ_DELAY);

}

void sendToSlave(int address) {

// message is 0123

for(int i = 0; i 《 SEND_SIZE; i++) {

messageToSlave[i] = (byte)i;

}

Wire.beginTransmission(address);

Wire.write(messageToSlave, TO_SLAVE_SIZE);

Wire.endTransmission();

}

void readFromSlave() {

// if data size is available from nodes

if(Wire.available() == TO_MASTER_SIZE) {

for (int i = 0; i 《 TO_MASTER_SIZE; i++) {

messageToMaster[i] = Wire.read(); // get data

}

int fromAddress = messageToMaster[0];

int value = ((int)messageToMaster[1] 《《 8 ) | (int)messageToMaster[2];

Serial.print(“Slave ”);

Serial.print(fromAddress);

Serial.print(“ says ”);

Serial.print(value);

}

}

從站代碼:

#include

// Change this unique address for each I2C slave node

#define NODE_ADDRESS 1

// matches values on master side.

#define TO_MASER_SIZE 3

#define TO_SLAVE_SIZE 4

#define NODE_READ_DELAY 100

byte messageToMaster[TO_MASTER_SIZE];

byte nodeReceive[TO_SLAVE_SIZE];

void setup() {

Serial.begin(9600);

Serial.print(“SLAVE #”);

Serial.println(NODE_ADDRESS);

Wire.begin(NODE_ADDRESS); // Activate I2C network

}

void loop() {

delay(NODE_READ_DELAY);

if(Wire.avaialable() == TO_SLAVE_SIZE) {

readFromMaster();

sendToMaster();

}

}

void readFromMaster() {

for(int i = 0; i 《 TO_SLAVE_SIZE; i ++){

nodeReceive[i] = Wire.read();

}

Serial.print(“Master says ”);

for(int i = 0; i 《 TO_SLAVE_SIZE; i ++){

Serial.print(nodeReceive[i]);

}

Serial.println();

}

void sendToMaster() {

int x = analogRead(A0);

messageToMaster[0] = NODE_ADDRESS;

messageToMaster[1] = (x0》》8) & 0xff; // the top byte of x

messageToMaster[2] = (x0 ) & 0xff; // the bottom byte of x

Wire.write(messageToMaster,TO_MASTER_SIZE);

Serial.print(“Sensor value: ”);

Serial.println(x);

}

有趣的一點是,總線(網絡)上的任何人都可以收聽雙向通信。從理論上講,可以添加一個靜默設備,其唯一的工作就是監視網絡。

第8步:最終想法

單個I2C網絡可能有多個主機,但這是多余的棘手的問題–主機之間必須進行協商以避免彼此之間的交談,這會導致混亂。

責任編輯:wv

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

    關注

    0

    文章

    3

    瀏覽量

    3462
收藏 人收藏

    評論

    相關推薦

    adc12d1800兩個通道采樣,Q正常,I異常,為什么?

    項目中一片adc12d1800,兩個通道采樣,Q正常,I異常。 異常的具體現象為:采集噪聲測試,從chipscope上觀察,DI與DID不重合,多次復位,
    發表于 12-26 06:01

    TPA6130A2如果不需要I2C功能,是否可以將I2C兩個引腳懸空?

    如果不需要I2C功能,是否可以將I2C兩個引腳懸空。 2.如果將I2C兩個引腳懸空,該IC是否
    發表于 11-01 08:16

    ad如何設置兩個元器件的距離

    之間應保持的最小距離,以確保電路板的電氣性能和制造過程的可靠性。以下是如何在AD中設置兩個元器件之間距離的步驟: 一、進入規則設置界面 打開AD軟件 :首先,確保你已經打開了Altium Designer軟件,并加載了需要
    的頭像 發表于 09-02 15:31 ?7695次閱讀

    簡單認識I2C通信協議

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

    兩個ESP8266模塊之間如何進行TCP通信

    嗨,我有兩個ESP8266模塊,我希望它們之間進行TCP通信。 我已經編寫了固件,將一 ESP 配置為 AccessPoint,另一
    發表于 07-12 06:26

    使用UDP廣播在兩個ESP8266之間進行通信,發送會存在延遲是怎么回事?

    我正在使用 UDP 廣播在兩個ESP8266 (wemos) 之間進行通信。 作為測試,我只是從第一設備發送 10 個字節,第二
    發表于 07-11 06:27

    如何使用freeRTOS在兩個任務之間傳輸任務數據?

    /溫度。 我想創建一 CSV 文件來記錄一段時間內的數據。 我創建 I2C 任務的方法與示例中的 emFIlesystem 任務相同。 者都在運行,做著它們應該做的事情,但我覺得它們之間
    發表于 07-03 07:55

    兩個PLC之間如何交互信號

    在工業自動化系統中,PLC(Programmable Logic Controller,可編程邏輯控制器)是核心的控制設備。在許多復雜的應用場景中,需要兩個或多個PLC之間進行信號交互,以實現更高
    的頭像 發表于 06-14 16:57 ?4567次閱讀

    兩個銅片可以形成原電池嗎

    兩個銅片本身不能形成原電池,因為原電池的工作原理依賴于兩個不同電位的電極材料之間的氧化還原反應。
    的頭像 發表于 05-21 16:23 ?1028次閱讀

    I3C接口通信基礎

    I 2 CI3C之間顯著的變化是時鐘速度。I 2
    發表于 05-03 10:22 ?3881次閱讀
    <b class='flag-5'>I3C</b>接口<b class='flag-5'>通信</b>基礎

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

    串行通信協議,通常用于連接低速設備,如傳感器、存儲器和其他外設。它使用根線(SCL和SDA)來實現雙向通信,具有地址定向性和主從模式。優點:多設備支持:I2C
    的頭像 發表于 04-12 08:27 ?1014次閱讀
    逼真動畫展示<b class='flag-5'>I2C</b>、SPI、UART的<b class='flag-5'>通信</b>過程

    什么是I3C接口 I3C和SPI接口有什么區別

    I3C接口使用通信線,一根是數據線(SDL),另一根是時鐘線(SCL)。與I2C總線一樣,I3C接口也支持多主設備(Main Maste
    的頭像 發表于 03-05 16:50 ?2930次閱讀
    什么是<b class='flag-5'>I3C</b>接口 <b class='flag-5'>I3C</b>和SPI接口有什么區別

    當CY7C65215在兩個通道上配置為SPI和I2C時,能否在Linux系統中看到兩個設備?

    我的客戶想知道,當CY7C65215 在兩個通道上配置為 SPI 和 I2C 時,他能否在 Linux 系統中看到兩個設備。
    發表于 03-05 06:52

    arcgis中如何關聯兩個屬性表

    在ArcGIS中,關聯兩個屬性表是一重要的操作,可以通過此操作將兩個表中的數據關聯起來,以便進行分析和查詢。下面是詳細介紹如何在ArcGIS中實現屬性表的關聯。 首先,我們需要明確
    的頭像 發表于 02-25 11:01 ?4331次閱讀

    使用片ADU360進行I2C通信,當與從機進行通信時,從機無法進入I2C中斷是為什么?

    問題說明:使用片ADU360進行I2C通信,主機使用IO口模擬方式,從機使用內部外設 主機IO口模擬方式,確認是可行,當與從機進行
    發表于 01-15 06:47
    主站蜘蛛池模板: 69女poren16| 老汉色视频| 免费jlzzjlzz在线播放视频| 黄色工厂在线播放| 色婷婷狠狠| 能看的黄网| 日韩成人影院| 中文在线免费看影视| 噜噜吧噜噜色| 日本色高清| 天堂在线观看视频| 美女张开腿露出尿口让男人桶 | 卡一卡二卡三国色天香永不失联| 直接看黄的网站| 免费观看欧美成人1314w色| 久久丁香视频| 人操人| 午夜剧场官网| 在线色综合| www.色午夜| 丁香花小说| 国产国产人免费人成免费视频| 你懂的网站在线观看| 三级全黄a| 色伊人久久| 四虎精品免费永久在线| 五月婷婷综合激情| 亚洲乱亚洲乱妇41p国产成人| 成人综合婷婷国产精品久久免费 | 天天噜天天干| 午夜精品国产| 国产高清小视频| 国模吧双双大尺度炮交gogo| 欧美黄色片视频| 美女福利在线观看| 免费看啪啪网站| 国产yw855.c免费视频| 四虎黄色网| 一区二区亚洲视频| 免费男女| 日本系列 1页 亚洲系列|