ESP32开发板之间通过IIC协议进行有线通信

概要

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的有线通信网络。