chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何僅在兩個(gè)Aduino之間進(jìn)行2路I2C通信

454398 ? 來(lái)源:網(wǎng)絡(luò)整理 ? 作者:網(wǎng)絡(luò)整理 ? 2019-11-25 15:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

步驟1:您需要什么:

我們假設(shè)您具有以下部分:

兩個(gè)Arduino UNO

一些公對(duì)母電線(xiàn)

一些公對(duì)公電線(xiàn)

一個(gè)旋轉(zhuǎn)電位計(jì)

一個(gè)面包板

步驟2:I2C的工作方式

I2C是一種通信協(xié)議,使您可以在微控制器和某些傳感器等電路之間進(jìn)行通信。它僅使用兩根線(xiàn)(如此高效?。5谝痪€(xiàn)是時(shí)鐘線(xiàn),通常在文檔中寫(xiě)為SCL。第二根線(xiàn)是數(shù)據(jù)線(xiàn),通常寫(xiě)為SDA。

I2C總線(xiàn)上的設(shè)備可以是“主機(jī)”或“從機(jī)”。僅主機(jī)控制時(shí)鐘線(xiàn)上的電壓,而主機(jī)和從機(jī)都可以操縱數(shù)據(jù)線(xiàn)上的電壓。通過(guò)仔細(xì)輪流,網(wǎng)絡(luò)上的所有設(shè)備都可以共享信息。

為了將信息發(fā)送到正確的位置,每個(gè)從站都有一個(gè)唯一的地址號(hào)碼,就像每個(gè)電話(huà)都有一個(gè)唯一的號(hào)碼一樣。

當(dāng)我看到I2C器件時(shí),他們有文檔說(shuō):“該電路希望接收N字節(jié)表示ABC的數(shù)據(jù),并發(fā)送回M字節(jié)表示DEF的數(shù)據(jù)?!比绻?gòu)買(mǎi)的設(shè)備不包含此信息,則不要購(gòu)買(mǎi)。

有關(guān)I2C通信內(nèi)部工作的更多詳細(xì)信息,請(qǐng)查看以下鏈接:

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

http://www.i2c-bus.org/結(jié)果

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

步驟3:設(shè)置

上圖中的設(shè)備使用引腳A4和A5進(jìn)行I2C通信。每種類(lèi)型的arduino和Wire庫(kù)的I2C引腳說(shuō)明如下:

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

主設(shè)置看起來(lái)像這樣:

#include

void setup() {

// note that begin() has no parameter.

Wire.begin();

}

從站設(shè)置看起來(lái)像這樣:

#include

void setup() {

// note that begin() has a parameter.

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

Wire.begin(1);

}

如果您要在該網(wǎng)絡(luò)上使用第二個(gè)從站,則需要除#1外的地址,因?yàn)樵摰刂芬驯皇褂谩_@意味著只能通過(guò)仔細(xì)計(jì)劃來(lái)添加和刪除網(wǎng)絡(luò)上的設(shè)備。許多使用I2C的設(shè)備都將帶有一個(gè)帶撥碼開(kāi)關(guān)(小光開(kāi)關(guān))的PCB,可以將其撥動(dòng)以更改地址。便宜的型號(hào)將有裸露的接觸。要翻轉(zhuǎn)這些開(kāi)關(guān),必須觸摸裸觸點(diǎn)。

第4步:發(fā)送數(shù)據(jù)

與之交談的人,然后發(fā)送信息,然后說(shuō)“我完成了?!?/p>

void loop() {

Wire.beginTransmission(1);

Wire.write(“hello, ”);

Wire.endTransmission();

}

從站僅需發(fā)送信息。每個(gè)人都假定從服務(wù)器正在與主機(jī)通信。

void loop() {

Wire.write(“world!”);

}

Wire.write()具有三個(gè)版本:一個(gè)用于單個(gè)數(shù)字,一個(gè)用于字符串,以及一個(gè)用于數(shù)據(jù)塊。您必須告訴Wire數(shù)據(jù)塊有多長(zhǎng)時(shí)間。

步驟5:接收數(shù)據(jù)

主機(jī)可以使用

Wire.read()

從網(wǎng)絡(luò)獲取單個(gè)字節(jié)的數(shù)據(jù),而不管是誰(shuí)發(fā)送的。

Wire.read()是阻塞操作-您的Arduino在讀取一個(gè)字節(jié)之前不會(huì)做其他任何事情。如果沒(méi)有要讀取的字節(jié),則可能要等待很長(zhǎng)時(shí)間!為避免此問(wèn)題,還有

Wire.available()

將返回等待讀取的字節(jié)數(shù)。

將兩者放在一起,

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步:請(qǐng)求/接收

您已經(jīng)擁有運(yùn)行I2C網(wǎng)絡(luò)所需的一切,但是我想讓您了解另外一項(xiàng)功能,這有點(diǎn)棘手,所以請(qǐng)忍受我。實(shí)際上,我會(huì)說(shuō)這完全是不需要,但是我將其包括在內(nèi)是為了徹底。也許表明有很多方法可以完成相同的工作,有些方法比其他方法更好。

您已經(jīng)知道,在C代碼中,有諸如setup()和loop()之類(lèi)的方法。您也可以創(chuàng)建自己的方法并按名稱(chēng)調(diào)用它們。您是否知道可以將方法名稱(chēng)作為參數(shù)發(fā)送給另一個(gè)方法?通常用于稱(chēng)為回調(diào)的東西。在這種情況下,我們將告訴線(xiàn)庫(kù)(I2C)當(dāng)從站從網(wǎng)絡(luò)接收數(shù)據(jù)時(shí)調(diào)用哪種方法。

// 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!

}

此處的一些注意事項(xiàng):

requestEvent()不會(huì)收到數(shù)字,說(shuō)明主機(jī)期望多少字節(jié)。

據(jù)我所知,這些事件是中斷-無(wú)論loop()中發(fā)生了什么,它們都會(huì)盡快發(fā)生。如果時(shí)間和代碼正確,那么無(wú)論循環(huán)做什么,都可能會(huì)嚴(yán)重混亂。由于很難重新創(chuàng)建導(dǎo)致問(wèn)題的條件,因此很難診斷出它為什么混亂。

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

第7步:雙向通信

現(xiàn)在讓我們將它們放在一起。

主代碼:

#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);

}

有趣的一點(diǎn)是,總線(xiàn)(網(wǎng)絡(luò))上的任何人都可以收聽(tīng)雙向通信。從理論上講,可以添加一個(gè)靜默設(shè)備,其唯一的工作就是監(jiān)視網(wǎng)絡(luò)。

第8步:最終想法

單個(gè)I2C網(wǎng)絡(luò)可能有多個(gè)主機(jī),但這是多余的棘手的問(wèn)題–主機(jī)之間必須進(jìn)行協(xié)商以避免彼此之間的交談,這會(huì)導(dǎo)致混亂。

責(zé)任編輯:wv

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • aduino
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    3624
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    I2C通信異常問(wèn)題怎么解決?

    我們?cè)?b class='flag-5'>進(jìn)行I2C通信,發(fā)現(xiàn)當(dāng)寫(xiě)數(shù)據(jù)時(shí)SCL和SDA會(huì)有下降沿重合的情況,導(dǎo)致通信失敗,請(qǐng)幫忙分析下如何處理? I2C
    發(fā)表于 08-12 07:45

    I2C總線(xiàn)通信,為什么要進(jìn)行電氣隔離?

    I2C總線(xiàn)采用雙向二線(xiàn)制,支持多主機(jī)多從機(jī)通信,具備高可靠性、抗干擾能力強(qiáng),廣泛應(yīng)用于嵌入式系統(tǒng)中。
    的頭像 發(fā)表于 08-11 11:04 ?2111次閱讀
    <b class='flag-5'>I2C</b>總線(xiàn)<b class='flag-5'>通信</b>,為什么要<b class='flag-5'>進(jìn)行</b>電氣隔離?

    第十八章 I2C通信測(cè)試

    本章介紹了I2C協(xié)議,其物理層用SDA和SCL雙線(xiàn),支持多設(shè)備:協(xié)議層含起始/停止信號(hào)、應(yīng)答機(jī)制等。還講解W55MH32的I2C外設(shè)及初始化,并進(jìn)行通信測(cè)試代碼的分析。
    的頭像 發(fā)表于 06-19 17:07 ?865次閱讀
    第十八章 <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>測(cè)試

    【技術(shù)說(shuō)明】數(shù)字輸出壓力傳感器的I2C通信

    介紹I2C總線(xiàn)是一個(gè)簡(jiǎn)單的,串行8位面向計(jì)算機(jī)總線(xiàn)有效的I2C(集成電路間)控制。It提供了良好的支持不同電路板距離之間通信,例如與各種低
    的頭像 發(fā)表于 06-19 11:02 ?1431次閱讀
    【技術(shù)說(shuō)明】數(shù)字輸出壓力傳感器的<b class='flag-5'>I2C</b><b class='flag-5'>通信</b>

    當(dāng)CY7C65215在兩個(gè)通道上配置為 SPI 和 I2C 時(shí),能否在Linux系統(tǒng)中看到兩個(gè)設(shè)備?

    我的客戶(hù)想知道,當(dāng) CY7C65215 在兩個(gè)通道上配置為 SPI 和 I2C 時(shí),他能否在 Linux 系統(tǒng)中看到兩個(gè)設(shè)備。
    發(fā)表于 05-26 06:27

    DLPC350有兩個(gè)I2C接口,I2C0和I2C1,手冊(cè)上寫(xiě)的都是工作為從模式,請(qǐng)問(wèn)可以工作為主模式嗎?

    DLPC350有兩個(gè)I2C接口,I2C0和I2C1,手冊(cè)上寫(xiě)的都是工作為從模式,請(qǐng)問(wèn)可以工作為主模式嗎,我需要在DLPC350上掛一個(gè)e
    發(fā)表于 03-03 07:34

    I2C總線(xiàn)通信原理 如何設(shè)計(jì)I2C總線(xiàn)電路

    I2C總線(xiàn)通信原理 I2C(Inter-Integrated Circuit)總線(xiàn)是一種用于集成電路之間進(jìn)行
    的頭像 發(fā)表于 01-31 15:01 ?1608次閱讀

    基于I2C總線(xiàn)的智能家居應(yīng)用

    隨著科技的飛速發(fā)展,智能家居系統(tǒng)已經(jīng)成為現(xiàn)代生活的一個(gè)重要組成部分。I2C(Inter-Integrated Circuit)總線(xiàn)是一種串行通信協(xié)議,廣泛應(yīng)用于微控制器和各種傳感器之間
    的頭像 發(fā)表于 01-17 16:21 ?887次閱讀

    I2C總線(xiàn)的優(yōu)缺點(diǎn)分析

    設(shè)備之間通信,這大大減少了所需的引腳數(shù)量,降低了硬件成本。此外,由于其簡(jiǎn)單性,I2C總線(xiàn)也易于實(shí)現(xiàn)和維護(hù)。 2. 多主機(jī)和多從機(jī)支持 I2C
    的頭像 發(fā)表于 01-17 15:50 ?1561次閱讀

    I2C總線(xiàn)與Arduino的接口示例

    基礎(chǔ) I2C總線(xiàn)由條線(xiàn)組成:數(shù)據(jù)線(xiàn)(SDA)和時(shí)鐘線(xiàn)(SCL)。SDA用于傳輸數(shù)據(jù),而SCL用于同步數(shù)據(jù)傳輸。I2C設(shè)備可以是主設(shè)備或從設(shè)備。主設(shè)備生成時(shí)鐘信號(hào)并啟動(dòng)數(shù)據(jù)傳輸,從設(shè)備響應(yīng)主設(shè)備的請(qǐng)求。 Arduino與
    的頭像 發(fā)表于 01-17 15:34 ?2097次閱讀

    I2C總線(xiàn)的工作模式介紹

    根線(xiàn)組成:數(shù)據(jù)線(xiàn)(SDA)和時(shí)鐘線(xiàn)(SCL)。數(shù)據(jù)線(xiàn)負(fù)責(zé)傳輸數(shù)據(jù),而時(shí)鐘線(xiàn)則用于同步數(shù)據(jù)傳輸。I2C總線(xiàn)是全雙工的,意味著數(shù)據(jù)可以在兩個(gè)方向上傳輸。它支持多個(gè)主設(shè)備和從設(shè)備,但在同一時(shí)刻只能有一
    的頭像 發(fā)表于 01-17 15:32 ?1437次閱讀

    I2C總線(xiàn)應(yīng)用實(shí)例分析

    I2C總線(xiàn)使用條線(xiàn)進(jìn)行通信:數(shù)據(jù)線(xiàn)(SDA)和時(shí)鐘線(xiàn)(SCL)。這種雙線(xiàn)制設(shè)計(jì)使得I2C總線(xiàn)能夠在多個(gè)設(shè)備
    的頭像 發(fā)表于 01-17 15:09 ?1056次閱讀

    I2C總線(xiàn)與SPI總線(xiàn)的比較

    在現(xiàn)代電子系統(tǒng)中,微控制器與各種外設(shè)之間通信是必不可少的。I2C和SPI是種流行的串行通信協(xié)議,它們各自具有獨(dú)特的特點(diǎn)和應(yīng)用場(chǎng)景。
    的頭像 發(fā)表于 01-17 15:08 ?1445次閱讀

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

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

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

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