I2C 总线扫描
这一章让 ESP32 学会“认出旁边接了哪个小模块”,比如温湿度传感器或小屏幕。
I2C 适合连接低速外设,比如温湿度传感器、OLED 屏、触摸芯片和 IO 扩展器。它只需要两根主要信号线:SCL 时钟线和 SDA 数据线。先扫地址,就像先确认教室里有哪些同学,再开始点名交流。
直觉
I2C 像一条共享小路:主机发起通信,从机根据地址回应。初学时不要一上来读传感器寄存器,先扫描地址,确认电源、接线和上拉电阻基本正常。
准备工作
准备一个 I2C 模块,例如 OLED 或温湿度传感器。把 VCC 接 3.3 V,GND 接 GND,SDA 和 SCL 接到 menuconfig 中配置的 GPIO。很多模块已经带上拉电阻;如果总线不稳定,再考虑外接上拉。
最小例程
对应工程:examples/i2c_scanner。
i2c_master_bus_config_t bus_config = {
.i2c_port = I2C_NUM_0,
.sda_io_num = CONFIG_I2C_SDA_GPIO,
.scl_io_num = CONFIG_I2C_SCL_GPIO,
.flags.enable_internal_pullup = true,
};运行后串口会打印扫描到的地址。扫描成功只说明总线能找到设备,不代表你已经会读这个传感器的数据;下一步需要看外设的数据手册。
速率与边界
I2C 常见速率是标准模式 100 kHz 和快速模式 400 kHz。它适合少量寄存器读写,不适合连续大吞吐数据。总线越长、设备越多、上拉越弱,波形越容易变钝,稳定速率就越低。
I2C 的速度不是只改一个数字就能无限提升。你要同时看上拉电阻、线长、电容、模块电平和外设是否支持对应速率。课堂实验优先稳定,先用 100 kHz 跑通,再根据需要提高。
应用场景
I2C 常用于温湿度、气压、光照、加速度计、OLED、小型 IO 扩展器等低速外设。多个设备可以共享 SDA/SCL,但地址不能冲突;如果两个模块地址一样,就需要换地址、换总线或加 I2C 多路复用器。
常见错误
扫描不到设备时,优先检查 VCC/GND、SDA/SCL 是否接反、模块是否支持 3.3 V、地址是否被硬件引脚改变。不要把 I2C 看成“传感器万能接口”,真正的数据含义来自外设芯片的数据手册。
官方资料
我想用 ESP32 学习 I2C。请先帮我完成 I2C 地址扫描和接线排查,再根据我提供的数据手册寄存器表,提取初始化流程、读数流程、错误处理和最小 ESP-IDF demo。