跳到主要内容

第 01 节 调试 I2C 接口

ESP32-S3 芯片当中,具有两个 I2C 控制器,可设置成主机或者从机,并且可以映射到大部分的 GPIO 口上。在 ESP32-S3-Touch-LCD-7 当中我们引出了一个 PH2.0 4PIN 的座子,连接着 ESP32-S3 芯片的 IO8 和 IO9 引脚,方便客户将这两个引脚映射成 I2C 通信接口,用于连接和调试 I2C 接口的设备。

ESP32-S3-Touch-LCD-7 I2C demo 1

为演示 ESP32 在 Arduino 当中的 I2C 基本驱动方式,我们提供了一个 I2C 地址扫描的例程,方便用户迅速了解驱动步骤。

硬件连接

为了将对应的代码上传到 ESP32-S3,需要用 Type-C 转 Type-A 的线将 ESP32-S3-Touch-LCD-7 的 USB 口接到电脑的 USB 口。

ESP32-S3-Touch-LCD-7 I2C demo 2
提示

请自行准备 Type-C 转 Type-A 的 USB 数据线,单纯只能进行充电的 USB 线不行哦~

示例代码

请先从以下地址下载例程包:ESP32-S3-Touch-LCD-7 示例程序 (如果先前已经下载,直接打开对应文件夹即可) 将例程压缩包解压之后,打开对应的 01_I2C_Test 文件夹:

ESP32-S3-Touch-LCD-7 I2C demo 3

双击打开 01_I2C_Test.ino:

ESP32-S3-Touch-LCD-7 I2C demo 4

在上传代码到 ESP32 之前,我们需要选择好对应的 COM 口和主板型号。单击左上角型号栏旁边的小三角:

ESP32-S3-Touch-LCD-7 I2C demo 5

ESP32-S3 接入到电脑之后正常会识别出来一个 COM 口,例如我这边识别出来的是 COM36。点击底下的“选择其他板子和接口”

ESP32-S3-Touch-LCD-7 I2C demo 6
提示

板子第一次接入到电脑后,Arduino IDE 会自动识别板子为一些默认的 ESP32 型号,例如上图的 ESP32 Family Device,是正常的,我们下一步会进行板子正确型号的选择。

点击这个 COM36 之后会弹出来主板和接口的选项窗口,这里我们选择板子型号为 Waveshare ESP32-S3-Touch-LCD-7,接口是 COM36 Serial Port (USB),然后点击右下角的 OK 按键进行确认。

ESP32-S3-Touch-LCD-7 I2C demo 7

设置完成后,点击 Upload 按键进行上传

ESP32-S3-Touch-LCD-7 I2C demo 8

等待程序编译并上传完成即可。

ESP32-S3-Touch-LCD-7 I2C demo 9

运行结果

上传代码后,打开菜单栏上的工具,打开串口监视器

ESP32-S3-Touch-LCD-7 I2C demo 10

设置合适的波特率(115200),程序运行之后,串口监视器将显示 "Scanning for I2C devices ..." 的信息,后面跟着的地址就表示该 I2C 设备的地址。

ESP32-S3-Touch-LCD-7 I2C demo 11

程序每 5 秒运行一次,串口监视器会持续刷新

代码回顾

    #include "Wire.h"

void setup() {
Serial.begin(115200); // Initialize USB printing function, baud rate is 115200
Wire.begin(8, 9); // Initialize the I2C device and set SDA to 8 and SCL to 9
}

void loop() {
byte error, address; // Store error content, address value
int nDevices = 0; // Number of recording devices

printf("Scanning for I2C devices ...\r\n");
for (address = 0x01; address < 0x7f; address++) { // Start scanning all devices from 0x01 to 0x7f
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) { // Determine whether the device exists, and if so, output the address
printf("I2C device found at address 0x%02X\n", address);
nDevices++;
} else if (error != 2) {
printf("Error %d at address 0x%02X\n", error, address);
}
}
if (nDevices == 0) { // Determine the number of devices. If it is 0, there is no device.
printf("No I2C devices found.\r\n");
}
delay(5000); // Scan every 5 seconds
}

  1. #include <Wire.h>: 引入 Arduino 的 I2C 通信库。
  2. Wire.begin(SDA_PIN, SCL_PIN): 初始化 I2C 总线作为主设备。在 ESP32 上,该函数有多种形式:
    • Wire.begin(): 不指定引脚,使用为当前开发板定义的默认 I2C 引脚。比如 GPIO 21(SDA) 和 GPIO 22(SCL)。以所用开发板的原理图或引脚定义为准。
    • Wire.begin(SDA_PIN, SCL_PIN): 使用指定的 GPIO 引脚作为 I2C 引脚,这里我们分别定义了 IO8 和 IO9 引脚作为 SDA 和 SCL。
  3. for (address = 0x01; address < 0x7f; address++) : 循环遍历所有可能的 7 位 I2C 地址。
  4. Wire.beginTransmission(address): ESP32(主设备)尝试与指定的 address 建立通信。
  5. Wire.endTransmission(): 结束通信尝试,并返回一个状态码。
    • 0: 成功,从设备已应答 (ACK)。
    • 2: 从设备在接收地址时未应答 (NACK)。这是最常见的情况,表示该地址无设备。
    • 3: 从设备在接收数据时未应答 (NACK)。
    • 4: 其他错误。
  6. Serial.printf("I2C device found at address 0x%02X\n", address);: 如果找到设备,就以十六进制格式(如 0x270x3C)打印出它的地址。并使 nDevices 加 1。
  7. Serial.printf("No I2C devices found.\r\n");: 遍历所有的 I2C 地址,判断如果 nDevices 最后的累计数为 0 的话,则打印没有找到 I2C 设备。