Arduino – Wire 库(中文文档)#

Wire - Arduino Reference

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()取代。

特点注意#

7位还是8位地址#

一般来说I2C地址有7位和8位的版本。 7位是设备标识码,而第8位则是为了确认设备当前状态是正在写入还是读取。 而Arduino -Wire库始终使用的是7位地址。 如果您使用了8位,则需要删除低位,从而得到0到127之间的地址。但是,地址从0到7 被保留了, 因此您在开发的时候请不要使用它们!!! 可以从8开始使用。

上拉电阻#

请注意,连接SDA / SCL引脚时需要一个上拉电阻。 此外MEGA 2560开发板上引脚20-21具有上拉电阻。

读写缓存只有 32 字节#

Wire库的实现使用了32字节缓冲区,因此任何通信都必须在此限制之内。 单次传输中超出的字节将被丢弃。

The Wire library implementation uses a 32 byte buffer, therefore any communication should be within this limit. Exceeding bytes in a single transmission will just be dropped.

实际观察到能一次读写 30 字节,不能更多。

如何读写更多的数据?

  1. 改变 Wire 库对缓存 length 的定义

  2. 分成多次(多个 30 字节以内)完成

  3. 考虑 I2C 更加适合突发的,不太长的数据通信,即限制帧长。否则,需要考虑使用其它通信协议,是不是会更加合适一点。