CHAPTER 09 / FIELD GUIDE

总线与 I²C 扫描

先确认设备存在,再谈显示内容。

建议用时 40 分钟先预测,再实验,再解释

为什么不是每个像素接一根线

模块里的控制器负责内部细节,主控通过约定协议发数据。你需要同时核对电气层、协议和数据含义。

接口常见信号本课中的位置
UARTTX、RX、GND日志;连接两个设备时通常 TX 接对方 RX
I²CSDA、SCL、GND多个带地址的设备共享数据与时钟线
SPISCLK、MOSI、可选 MISO、CS后续彩屏的常见接口,设备常用独立片选

屏幕接线

OLED 丝印开发板
VCC3V3
GNDGND
SDAGPIO8
SCLGPIO9

按丝印接,不按排针位置接。I²C 需要上拉:模块若已有连到 3.3 V 的上拉电阻,就先用它;否则 SDA 和 SCL 分别通过 4.7 kΩ 上拉到 3V3。不要重复堆很多上拉,也不要把线拉到 5 V。

实验工程 · 05_scan

扫描普通 7 位地址范围,找到应答地址。SSD1306 模块常见 0x3C 或 0x3D。

打开 main.c · 查看公共驱动 lab.c · 下载全部工程

#include "lab.h"
#include "esp_log.h"
void app_main(void) {
    i2c_master_bus_handle_t b=bus_init();
    for(int a=0x08; a<=0x77; a++) {
        esp_err_t e=i2c_master_probe(b,a,50);
        if(e==ESP_OK)ESP_LOGI("scan","found 0x%02x",a);
        else if(e!=ESP_ERR_NOT_FOUND)ESP_LOGW("scan","0x%02x: %s",a,esp_err_to_name(e));
    }
    ESP_LOGI("scan","done");
}
结果解释与下一步
找到 0x3C / 0x3D电气连接和地址应答基本可用;不代表屏幕已初始化
没有找到测供电 → 查 SDA/SCL → 查上拉和共地 → 查模块型号
多处超时总线可能被持续拉低;先断电检查短路、模块与电压
资料写 0x78可能是含读写位的 8 位表示;本 API 使用未左移的 7 位地址
停下来想一想

两个相同地址的模块能直接挂在同一条 I²C 总线上并分别控制吗?

查看推导与答案

通常不能。需要改其中一个地址、使用另一条总线或 I²C 多路复用器。扫描看到一个地址不能证明只有一个设备。

本章验收

本章一手资料

卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。