Arduino IIC 主从设备连接通信

目的:
       实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法。
器材:
Arduino UNO R3 一块
Arduino Nano 三块
面包板   导线
3K电阻 2个
连接方法:

 

    由于Arduino IIC接口总线没有上拉电阻,在连接布线时需要提供两个上拉电阻。
 
首先给出程序:
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); // 要求2号IIC设备,通过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); // 要求2号IIC设备,通过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); // 要求2号IIC设备,通过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
 
 
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 个char给IC 上的主机
}
 
 
程序要点分析:
Master程序用Wire.begin();设置,表示本机为Master
  主机向从机写入数据格式
     Wire.beginTransmission(从机地址号);
     Wire.write(数据byte);
     Wire.endTransmission();
Master从Salve读数据
     Wire.requestFrom(从机地址, 字符个数);
     while(Wire.available()) // 如果Wire上有 char 等读取
     {
           char c = Wire.read(); // 从Wire 上读取一个char
            Serial.print(c); //输出到串口监视器查看
     }
SLAVE用Wire.begin(地址号)表示本机为SLAVE,并设置地址号
5.  注册用于接收和发送的函数
Wire.onReceive(receiveData);
     Wire.onRequest(sendData);
两个函数的格式:
void receiveData(int byteCount);
void sendData ();
 
当主机发出requestForm请求时,从机响应,开始发送数据
posted @ 2019-04-14 19:27  安&之~(若索)  阅读(3990)  评论(0编辑  收藏  举报