Arduino – Wire 库

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将开发板连接到计算机上并保证各个开发板的供电。

Wire板间通讯电路图Arduino IIC协议 Wire 太极创客
Wire板间通讯电路图Arduino

Wire板间通讯电路原理图 Arduino IIC协议 Wire 太极创客

程序
主设备读取

从设备发送

效果演示

Wire板间通讯 主设备读取,从设备发送 Arduino IIC协议 Wire 太极创客

通过主设备UNO硬件串口打开的串口监视器窗口视图

主设备写入, 从设备接受

在这个示例中,将使用两个开发板通过I2C同步串行协议以主机写入从机接受的方式相互通信。

Arduino UNO(主设备)经过编程,每半秒向唯一寻址的从设备发送6个字节的数据。 从设备收到该消息后,可以在Arduino IDE 的串口监视器窗口中查看该数据。


所需硬件
  • 2块Arduino或Genuino开发板
  • 杜邦线


电路连接

将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接

为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。

Wire板间通讯电路图Arduino IIC协议 Wire 太极创客
Wire板间通讯电路图Arduino

原理图

Wire板间通讯电路原理图 Arduino IIC协议 Wire 太极创客

Code
主设备写入

从设备接受


效果演示

Wire板间通讯 主设备写入,从设备接收Arduino IIC协议 Wire 太极创客

库函数

begin
requestFrom
beginTransmission
endTransmission
write
available
read
SetClock
onReceive
onRequest