Wire库
说明
Wire库可以让Arduino与IIC / TWI
设备进行通信。 与SPI总线一样, IIC也是主从方式通讯, 因此不能同时存在两个主设备,只能是一个主设备与一个或多个从设备进行通讯
使用之前使用以下语句进行Wire库声明
#include <Wire.h>
下表显示了TWI引脚在各种Arduino板上的位置。
(在Arduino UNO板上,SDA
(数据线)和SCL
(时钟线)位于靠近AREF
引脚上面的引脚。)
Board | I2C / TWI pins |
---|---|
Uno, Ethernet | A4 (SDA), A5 (SCL) |
Mega2560 | 20 (SDA), 21 (SCL) |
Leonardo | 2 (SDA), 3 (SCL) |
Due | 20 (SDA), 21 (SCL), SDA1, SCL1 |
从Arduino 1.0开始,Wire库继承Stream流,使其与其他读/写的库一致。
因此现在send()
和receive()
已被read()
和write()
取代。
注意
一般来说I2C地址有7位和8位的版本。 7位是设备标识码,而第8位则是为了确认设备当前状态是正在写入还是读取。 而Arduino -Wire库始终使用的是7位地址。 如果您使用了8位,则需要删除低位,从而得到0到127之间的地址。但是,地址从0到7 被保留了, 因此您在开发的时候请不要使用它们!!! 可以从8开始使用。
请注意,连接SDA / SCL引脚时需要一个上拉电阻。 此外MEGA 2560
开发板上引脚20-21具有上拉电阻。
Wire库的实现使用了32字节缓冲区,因此任何通信都必须在此限制之内。 单次传输中超出的字节将被丢弃。
两块UNO通过IIC进行板间通讯
主设备读取,从设备发送
在这个示例中,将使用两块开发板通过I2C通讯协议在主设备读取/从设备发送的方式进行通信。
Arduino UNO主设备通过使用Wire库, 可以请求并读取从唯一寻址的从设备 Arduino UNO发送来的6字节数据。 收到该消息后,便可以在Arduino IDE 串口监视器窗中进行查看。
所需硬件
- 2块Arduino或Genuino开发板
- 杜邦线
电路连接
将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接
为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。
程序
主设备读取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/********************************************************************** 程序名称/Program name : Wire Master Reader 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/06/30 程序目的/Purpose : 演示了Wire库的使用 从I2C / TWI从设备读取数据 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本示例程序来源于以下链接, 由Dapenson整理注释, 旨在使初学者更好的理解Wire库的学习和应用 https://www.arduino.cc/en/Reference/Wire ***********************************************************************/ // 引入Wire库文件 #include <Wire.h> void setup() { // Wire初始化, 加入i2c总线 // 如果未指定,则以主机身份加入总线。 Wire.begin(); // 初始化串口并设置波特率为9600 Serial.begin(9600); } void loop() { // 向从设备#8请求6个字节 Wire.requestFrom(8, 6); // 当从从设备接收到信息时值为true while (Wire.available()) { // 接受并读取从设备发来的一个字节的数据 char c = Wire.read(); // 向串口打印该字节 Serial.print(c); } // 延时500毫秒 delay(500); } |
从设备发送
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/********************************************************************** 程序名称/Program name : Wire Slave Sender 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/07/01 程序目的/Purpose : 演示了Wire库的使用 作为I2C / TWI从设备发送数据给主设备 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本示例程序来源于以下链接, 由Dapenson整理注释, 旨在使初学者更好的理解Wire库的学习和应用 https://www.arduino.cc/en/Reference/Wire ***********************************************************************/ // 引入Wire库文件 #include <Wire.h> void setup() { // Wire初始化, 并以从设备地址#8的身份加入i2c总线 Wire.begin(8); // 注册请求响应事件 Wire.onRequest(requestEvent); } void loop() { delay(100); } // 每当接收到来自主机的数据时执行的事件函数 // 此函数被注册为事件,调用请见setup() void requestEvent() { // 用6个字节的消息进行响应 Wire.write("hello "); // 以此回应主设备的请求 } |
通过主设备UNO硬件串口打开的串口监视器窗口视图
主设备写入, 从设备接受
在这个示例中,将使用两个开发板通过I2C同步串行协议以主机写入从机接受的方式相互通信。
Arduino UNO(主设备)经过编程,每半秒向唯一寻址的从设备发送6个字节的数据。 从设备收到该消息后,可以在Arduino IDE 的串口监视器窗口中查看该数据。
所需硬件
- 2块Arduino或Genuino开发板
- 杜邦线
电路连接
将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接
为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。
原理图
Code
主设备写入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/********************************************************************** 程序名称/Program name : Wire Master Writer 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/07/01 程序目的/Purpose : 演示Wire库的使用 将数据写入到I2C / TWI从设备 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本示例程序来源于以下链接, 由Dapenson整理注释, 旨在使初学者更好的理解Wire库的学习和应用 https://www.arduino.cc/en/Reference/Wire ***********************************************************************/ // 引入Wire库文件 #include <Wire.h> void setup() { // Wire初始化, 加入i2c总线 // 如果未指定,则以主机身份加入总线。 Wire.begin(); } // 定义一个byte变量以便串口调试 byte x = 0; void loop() { // 将数据传送到从设备#8 Wire.beginTransmission(8); // 发送5个字节 Wire.write("x is "); // 发送一个字节 Wire.write(x); // 停止传送 Wire.endTransmission(); x++; delay(500); } |
从设备接受
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
/********************************************************************** 程序名称/Program name : Wire Slave Receiver 团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com) 作者/Author : Dapenson 日期/Date(YYYYMMDD) : 2020/07/01 程序目的/Purpose : 演示Wire库的使用 作为I2C / TWI从设备接收主设备写入的数据 ----------------------------------------------------------------------- 修订历史/Revision History 日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description ----------------------------------------------------------------------- 其它说明: 本示例程序来源于以下链接, 由Dapenson整理注释, 旨在使初学者更好的理解Wire库的学习和应用 https://www.arduino.cc/en/Reference/Wire ***********************************************************************/ // 引入Wire库文件 #include <Wire.h> void setup() { // Wire初始化, 并以从设备地址#8的身份加入i2c总线 Wire.begin(8); // 注册接受事件函数 Wire.onReceive(receiveEvent); // 初始化串口并设置波特率为9600 Serial.begin(9600); } void loop() { delay(100); } // 每当接收到来自主机的数据时执行的事件函数 // 此函数被注册为事件,调用请见setup() void receiveEvent(int howMany) { // 循环读取数据(除了最后一个字符) while (1 < Wire.available()) { // 接收字节数据并赋值给变量c(char) char c = Wire.read(); // 打印该字节 //太极创客团队 / Taichi-Maker (www.taichi-maker.com) Serial.print(c); } // 以int整数的形式接受字节数据并赋值给x(int) int x = Wire.read(); // 打印该int变量x Serial.println(x); } |
效果演示
库函数
– begin
– requestFrom
– beginTransmission
– endTransmission
– write
– available
– read
– SetClock
– onReceive
– onRequest