文章目录
概要
IIC是一个同步多主(多个主机向一个从机发送数据),多从(多个从机向主机发送数据)的通信协议。多个ESP32开发板进行IIC通信时,可以根据用户自由配置为主机或者从机。
支持标准模式100kbit/s,快速模式400kbit/s,速度最高可达 5 MHz,但受制于 SDA 上拉强度。
支持7-bit 以及 10-bit 寻址,双寻址模式。
支持关闭 SCL 时钟实现连续数据传输。支持可编程数字噪声滤波功能。
ESP32的IIC总线可以配置为直接输出或开漏输出
,将 SCL 的 pad 配置成开漏方式时,SCL 从低电平转向高电平的时间会变长,这个转变时间由 SCL 线上的上拉电阻以及电容共同决定。开漏模式下,SCL 的输出频率会偏低。
ESP32的 I2C 控制器处理 I2C 协议,腾出处理器核用于其它任务。
接线
使用默认的IIC引脚,GPIO21-(SDA),GPIO22-(SCL),GND接在一起有一个共同的参考地。若使用其他ESP32-C3、ESP32-S3等开发板默认IIC引脚会有所不同。
Arduino示例程序
ESP32从机IIC通信程序
#include "Wire.h"
#define I2C_DEV_ADDR 0x55
uint32_t i = 0;
void onRequest() {
Wire.print(i++);
Wire.print(" Packets.");
Serial.println("onRequest");
Serial.println();
}
void onReceive(int len) {
Serial.printf("onReceive[%d]: ", len);
while (Wire.available()) {
Serial.write(Wire.read());
}
Serial.println();
}
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Wire.onReceive(onReceive);
Wire.onRequest(onRequest);
Wire.begin((uint8_t)I2C_DEV_ADDR);
/*#if CONFIG_IDF_TARGET_ESP32
char message[64];
snprintf(message, 64, "%lu Packets.", i++);
Wire.slaveWrite((uint8_t *)message, strlen(message));
Serial.print('Printing config %lu', i);
#endif*/
}
void loop() {
}
ESP32主机IIC通信程序
#include "Wire.h"
#define I2C_DEV_ADDR 0x55
uint32_t i = 0;
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(true);
Wire.begin();
}
void loop() {
delay(5000);
// Write message to the slave
Wire.beginTransmission(I2C_DEV_ADDR);
Wire.printf("Hello World! %lu", i++);
uint8_t error = Wire.endTransmission(true);
Serial.printf("endTransmission: %u\n", error);
// Read 16 bytes from the slave
uint8_t bytesReceived = Wire.requestFrom(I2C_DEV_ADDR, 16);
Serial.printf("requestFrom: %u\n", bytesReceived);
if ((bool)bytesReceived) {
//If received more than zero bytes
uint8_t temp[bytesReceived];
Wire.readBytes(temp, bytesReceived);
log_print_buf(temp, bytesReceived);
}
}
IIC通信验证
上传主机和从机程序到两个开发板,并接好线。
打开主机串口助手可看到打印信息:
打开从机串口助手可看到打印信息:
小结
本实验验证了ESP32开发板之间进行IIC有线通信,相互收发数据。IIC总线上挂载更多的ESP32开发板,可以组成一个IIC的有线通信网络。