CHAPTER 09 / FIELD GUIDE
总线与 I²C 扫描
先确认设备存在,再谈显示内容。
为什么不是每个像素接一根线
模块里的控制器负责内部细节,主控通过约定协议发数据。你需要同时核对电气层、协议和数据含义。
| 接口 | 常见信号 | 本课中的位置 |
|---|---|---|
| UART | TX、RX、GND | 日志;连接两个设备时通常 TX 接对方 RX |
| I²C | SDA、SCL、GND | 多个带地址的设备共享数据与时钟线 |
| SPI | SCLK、MOSI、可选 MISO、CS | 后续彩屏的常见接口,设备常用独立片选 |
屏幕接线
| OLED 丝印 | 开发板 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SDA | GPIO8 |
| SCL | GPIO9 |
按丝印接,不按排针位置接。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 多路复用器。扫描看到一个地址不能证明只有一个设备。
本章验收
本章一手资料
卡住时可以直接向我提问:附上章节号、工程名、接线和第一条错误日志。