扫不到地址
先查 VCC/GND、SDA/SCL 是否接反、电压是否匹配、模块是否有上拉电阻,再换短线测试。
Arduino · I2C · Wire
用于排查 OLED、LCD1602 I2C 背包、RTC、传感器等 I2C 模块扫不到地址、地址不确定、SDA/SCL 接错、两个 Arduino 主从通信不通的问题。
资料基于 Arduino Wire 官方文档和常见 I2C 排查经验整理,所有接线图为自绘 SVG。
Conclusion
确认:I2C 只需要 SDA、SCL 两根信号线,但必须接 GND,并且电压电平要匹配。UNO/Nano 的 I2C 默认是 A4/A5;Mega、Leonardo、ESP32、STM32 等板子的 SDA/SCL 位置不同,要看板子丝印或资料。
先查 VCC/GND、SDA/SCL 是否接反、电压是否匹配、模块是否有上拉电阻,再换短线测试。
Arduino Wire 常用 7-bit 地址,例如 OLED 常见 0x3C,LCD1602 I2C 背包常见 0x27 或 0x3F。
先用 Scanner 扫地址,再把 LiquidCrystal_I2C 里的地址改成扫描结果;只亮背光或一排黑块,通常还要调背面对比度电位器。
多个 I2C 模块可以共用 SDA/SCL,但地址不能冲突,且总线太长、上拉过强/过弱都会不稳定。
Wiring
自绘无水印示意图。不同模块丝印可能写 VCC/GND/SDA/SCL,也可能写 SCK/SCL,实际以模块说明为准。
| I2C 模块 | Arduino UNO / Nano | 说明 |
|---|---|---|
| VCC | 5V 或 3.3V | 确认:按模块供电范围接,3.3V 模块不要直接接 5V 信号。 |
| GND | GND | 确认:必须共地。 |
| SDA | A4 / SDA | 确认:数据线。 |
| SCL | A5 / SCL | 确认:时钟线。 |
| ADDR / A0-A2 | 按模块默认 | 待确认:部分模块可通过跳线/焊盘改地址。 |
I2C Scanner
上传后打开串口监视器,波特率设为 9600。扫到地址后,再把地址填到对应模块库或示例代码里。
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C scanner");
}
void loop() {
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
}
}
delay(3000);
}
下载 Scanner .ino
先检查供电、GND、SDA/SCL 是否接反,再确认模块有没有上拉电阻。线太长或杜邦线松动也会扫不到。
把库例程里的地址改成扫描出来的地址;同时确认模块型号是否匹配,比如 SSD1306 / SH1106、PCF8574 / MCP23017 不要混用。
多半是接触不良、上拉不合适、线太长、电源不稳。先用短线只接一个模块测试。
Master / Slave
一个 Arduino 作为 Master,另一个作为 Slave。SDA 接 SDA,SCL 接 SCL,GND 必须共地。I2C 不是串口 TX/RX,不需要交叉接。
Master
向地址 0x08 的 Slave 请求 6 字节数据。
下载 Master .inoSlave
设置从机地址 0x08,被 Master 请求时返回 hello。
下载 Slave .ino提醒
同一总线上每个从机地址必须不同。两个从机都用 0x08 会冲突。
Customer Reply
I2C 问题多数是线、地址、电压、上拉、电源或库型号不匹配。先用 Scanner 扫地址,再看模块库例程。
References
不使用客户截图、订单、地址或带水印图片。接线图为自绘 SVG。