集成电路间(I2C)是用于在微控制器和新一代专用集成电路之间进行串行数据交换的系统,当它们之间的距离很短时使用。通过两个导体创建连接。一个用于数据传输,另一个用于同步(时钟信号)。
Arduino I2C
我们有两种模式-主代码和从代码-使用I2C连接两个Arduino板。他们是-
- 主发送器/从接收器
- 主接收器/从发送器
主发送器/从接收器
现在让我们看看什么是主发送器和从接收器。
主发射器
以下函数用于初始化Wire库,并将I2C总线作为主机或从机加入,通常只调用一次。
Wire.begin(address) - 在我们的示例中,地址是7位从站地址,因为未指定主机,它将作为主机加入总线。
Wire.beginTransmission(address) - 开始使用给定地址向I2C从设备进行传输。
Wire.write(value) - 将字节从主设备传输到从设备(在对beginTransmission()和endTransmission()的调用之间)。
Wire.endTransmission() - 结束对从设备的传输,该设备由beginTransmission()开始,并传输由wire.write()排队的字节。
#include <Wire.h> //加载 wire 库 void setup() //这只会运行一次 Wire.begin(); //作为主机加入 i2c 总线 } short age=0; void loop() { Wire.beginTransmission(2); //传输到设备#2 Wire.write("age is="); Wire.write(age); //发送一个字节 Wire.endTransmission(); //停止传输 delay(1000); }
从接收器
使用以下函数-
Wire.begin(address) - 地址是7位从站地址。
Wire.onReceive(received data handler) - 从设备从主机接收数据时要调用的函数。
Wire.available() - 返回可用于Wire.read()的字节数,应在Wire.onReceive()处理程序内部调用。
#include <Wire.h> //加载 wire 库 void setup() { //这只会运行一次 Wire.begin(2); //使用地址 #2 加入 i2c 总线 Wire.onReceive(receiveEvent); //当主人发送任何东西时调用receiveEvent Serial.begin(9600); //启动串行输出以打印我们收到的内容 } void loop() { delay(250); } //-----每当从 master 接收到数据时,此函数将执行-----// void receiveEvent(int howMany) { while (Wire.available()>1) //遍历除最后一个以外的所有内容 char c=Wire.read(); //接收字节作为字符 Serial.print(c); //打印字符 } }
主接收器/从发送器
现在让我们看看什么是主接收器和从发送器。
主接收器
主机被编程为请求,然后读取从唯一寻址的从Arduino发送的数据字节。
使用以下函数-
Wire.requestFrom(address,number of bytes) - 主机用于从从设备请求字节,然后可以使用wire.available()和wire.read()函数来检索字节。
#include <Wire.h> //include wire library void setup() { Wire.begin(); //加入 i2c 总线(主机地址可选) Serial.begin(9600); //启动串行输出 } void loop() { Wire.requestFrom(2, 1); //从从设备 #2 请求 1 个字节 while (Wire.available()) //从机可能发送少于请求的数量 char c=Wire.read(); //接收一个字节作为字符 Serial.print(c); //打印字符 } delay(500); }
从发送器
Wire.onRequest(handler) - 当主机从该从属设备请求数据时,将调用一个函数。
#include <Wire.h> void setup() { Wire.begin(2); //使用地址 #2 加入 i2c 总线 Wire.onRequest(requestEvent); //注册事件 } Byte x=0; void loop() { delay(100); } //每当 master 请求数据时执行的函数 //这个函数被注册为一个事件,见 setup() void requestEvent() { Wire.write(x); //响应主机期望的 1 个字节的消息 x++; }
参考链接
https://www.learnfk.com/arduino/arduino-inter-integrated-circuit.html
标签:begin,接收器,教程,Wire,字节,Arduino,主机,void,无涯 From: https://blog.51cto.com/u_14033984/7941755