Arduino IIC 主从设备连接通信

 

 

目的:

       实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法。

器材:

Arduino UNO R3 一块

Arduino Nano 三块

面包板   导线

3K电阻 2个

连接方法:

    由于Arduino IIC接口总线没有上拉电阻,在连接布线时需要提供两个上拉电阻。

 

首先给出程序:

  1. Master程序

   #include <Wire.h>

void setup() {

  Wire.begin(); // join i2cbus (主机,不用写IIC地址)

  Serial.begin(9600); // 串口输出

 }

 

int i = 1;

 

 void loop()

 {

     //向从机写入数据

     Wire.beginTransmission(2);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(2, 6); // 要求2IIC设备,通过Wire传送 6 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

     delay(2000); // 2

     Serial.println( ); // 输出到下一行方便查看        

     

     //向从机写入数据

     Wire.beginTransmission(3);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(3, 6); // 要求2IIC设备,通过Wire传送 6 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

      delay(2000); // 2

      Serial.println( ); // 输出到下一行方便查看            

    

     //向从机写入数据

     Wire.beginTransmission(4);

     Wire.write(i);

     Wire.endTransmission();

     //读数据

     Wire.requestFrom(4, 6); // 要求2IIC设备,通过Wire传送 6 char过来

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

      delay(2000); // 2

      Serial.println( ); // 输出到下一行方便查看      

    

     i++;

     i = i%4;

  

 }// loop

 

 

  1. SALVE程序

#include <Wire.h>

void ggyy();

//接收主机命令

int revData = 0;

void receiveData(int byteCount) {  

  while (Wire.available()) {

    int number = Wire.read();

    Serial.print("data received1: ");

    Serial.println(number);

    revData = number;

    } 

 

void setup()

{

  Wire.begin(3); //通知IIC总线, 2 IIC设备地址

  Wire.onReceive(receiveData);

  Wire.onRequest(ggyy); // 注册当收到主机信息时相应的调用函数ggyy( )

  Serial.begin(9600);

  pinMode(13,OUTPUT);

  digitalWrite(13,LOW);

}

void loop()

{ // 从机,代码空

      int b = revData;

      revData = 0;

      for(int i = 0; i < b; i++){

      digitalWrite(13,HIGH);

      delay(200);

      digitalWrite(13,LOW);

      delay(200);

    }

}

// 信息处理函数,必须在 setup( ) 內用onRequest( ) 注册

void ggyy()

{

  Wire.write("World "); // 送出 6 charIC 上的主机

}

 

 

程序要点分析:

  1. Master程序用Wire.begin();设置,表示本机为Master
  1.   主机向从机写入数据格式

     Wire.beginTransmission(从机地址号);

     Wire.write(数据byte);

     Wire.endTransmission();

  1. Master从Salve读数据

     Wire.requestFrom(从机地址, 字符个数);

     while(Wire.available()) // 如果Wire上有 char 等读取

     {

           char c = Wire.read(); // Wire 上读取一个char

            Serial.print(c); //输出到串口监视器查看

     }

  1. SLAVE用Wire.begin(地址号)表示本机为SLAVE,并设置地址号

5.  注册用于接收和发送的函数

Wire.onReceive(receiveData);

     Wire.onRequest(sendData);

两个函数的格式:

void receiveData(int byteCount)

void sendData ()

 

当主机发出requestForm请求时,从机响应,开始发送数据

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值