Arduino IIC 主从设备连接通信
目的: 实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法。 器材: Arduino UNO R3 一块 Arduino Nano 三块 面包板 导线 3K电阻 2个 连接方法:
#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请求时,从机响应,开始发送数据
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

由于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请求时,从机响应,开始发送数据

更多精彩