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

为演示 ESP32 在 Arduino 当中的 I2C 基本驱动方式,我们提供了一个 I2C 地址扫描的例程,方便用户迅速了解驱动步骤。
硬件连接
为了将对应的代码上传到 ESP32-S3,需要用 Type-C 转 Type-A 的线将 ESP32-S3-Touch-LCD-7 的 USB 口接到电脑的 USB 口。

请自行准备 Type-C 转 Type-A 的 USB 数据线,单纯只能进行充电的 USB 线不行哦~
示例代码
请先从以下地址下载例程包:ESP32-S3-Touch-LCD-7 示例程序 (如果先前已经下载,直接打开对应文件夹即可) 将例程压缩包解压之后,打开对应的 01_I2C_Test 文件夹:

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

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

板子第一次接入到电脑后,Arduino IDE 会自动识别板子为一些默认的 ESP32 型号,例如上图的 ESP32 Family Device,是正常的,我们下一步会进行板子正确型号的选择。
点击这个 COM36 之后会弹出来主板和接口的选项窗口,这里我们选择板子型号为 Waveshare ESP32-S3-Touch-LCD-7,接口是 COM36 Serial Port (USB),然后点击右下角的 OK 按键进行确认。

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

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

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

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

程序每 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
}
#include <Wire.h>: 引入 Arduino 的 I2C 通信库。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。
for (address = 0x01; address < 0x7f; address++): 循环遍历所有可能的 7 位 I2C 地址。Wire.beginTransmission(address): ESP32(主设备)尝试与指定的address建立通信。Wire.endTransmission(): 结束通信尝试,并返回一个状态码。0: 成功,从设备已应答 (ACK)。2: 从设备在接收地址时未应答 (NACK)。这是最常见的情况,表示该地址无设备。3: 从设备在接收数据时未应答 (NACK)。4: 其他错误。
Serial.printf("I2C device found at address 0x%02X\n", address);: 如果找到设备,就以十六进制格式(如0x27或0x3C)打印出它的地址。并使 nDevices 加 1。Serial.printf("No I2C devices found.\r\n");: 遍历所有的 I2C 地址,判断如果 nDevices 最后的累计数为 0 的话,则打印没有找到 I2C 设备。