目录
介绍
I2C(内部集成电路)是串行总线接口连接协议。它也被称为TWI(双线接口),因为它只使用两根电线进行通信。这两条线是SDA(串行数据)和SCL(串行时钟)。
I2C是需要确认的通信协议,即发送器在发送数据之后检查来自接收器的确认以知道接收器是否成功接收到数据。
I2C有两种工作模式,
- 主模式
- 从模式
SDA(串行数据)线用于主设备和从设备之间的数据交换。SCL(串行时钟)用于主设备和从设备之间的同步时钟。
主设备启动与从设备的通信。主设备需要从设备地址来启动与从设备的对话。从设备在主设备寻址时响应主设备。
NodeMCU的GPIO引脚具有I2C功能支持。由于ESP-12E的内部功能,我们无法将其所有GPIO用于I2C功能。因此,在将任何GPIO用于I2C应用程序之前,请先进行测试。
例
让我们为NodeMCU编写Arduino程序作为I2C主设备,为Arduino Uno编写Arduino 程序作为I2C从设备。主设备向从设备发送hello字符串,从设备将响应主设备发送hello字符串。
在这里,我们正在使用
主设备: NodeMCU
从设备: Arduino Uno
从设备地址: 8
接线图如下图所示
NodeMCU Arduino I2C连接
NodeMCU的Arduino程序(主I2C设备)
#include <Wire.h>
void setup() {
Serial.begin(9600); /* begin serial for debug */
Wire.begin(D1, D2); /* join i2c bus with SDA=D1 and SCL=D2 of NodeMCU */
}
void loop() {
Wire.beginTransmission(8); /* begin with device address 8 */
Wire.write("Hello Arduino"); /* sends hello string */
Wire.endTransmission(); /* stop transmitting */
Wire.requestFrom(8, 13); /* request & read data of size 13 from slave */while(Wire.available()){
char c = Wire.read();
Serial.print(c);
}
Serial.println();
delay(1000);
}
Arduino Uno的Arduino程序(从I2C设备)
输出结果
从设备(Arduino Uno)串行监视器的输出窗口
主设备(NodeMCU)上串行监视器的输出窗口