1. I2C简介
I²C(Inter-Integrated Circuit)是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线仅需两条线即可完成数据传输:一条串行数据线(SDA)和一条串行时钟线(SCL)。在I2C总线体系中,树莓派通常作为主设备(Master),而传感器、显示屏等外围模块作为从设备(Slave)。检测从设备的状态是I2C通信的第一步,也是排查硬件连接问题的关键环节。
2. 准备工作
2.1 硬件准备
-
树莓派4一块
-
待检测的I2C从设备(如我使用的SHT45)
-
杜邦线若干
2.2 接线方式
树莓派的I2C接口位于GPIO引脚上。树莓派4对应的引脚为:
| 功能 | 物理引脚号 | GPIO编号 |
|---|---|---|
| SDA(数据线) | 3 | GPIO2 |
| SCL(时钟线) | 5 | GPIO3 |
| GND | 6、9、14、20、25等 | --- |
| 3.3V | 1、17 | --- |
⚠️ 注意:部分I2C从设备(如PCF8591)需要5V供电,请根据设备的数据手册正确连接电源,确保电压匹配,避免损坏模块。
接线步骤:
-
将从设备的VCC引脚连接到树莓派的3.3V(或5V,视设备而定)引脚
-
将从设备的GND引脚连接到树莓派的GND引脚
-
将从设备的SDA引脚连接到树莓派的GPIO2(物理引脚3)
-
将从设备的SCL引脚连接到树莓派的GPIO3(物理引脚5)
-
如图:

3. 启用树莓派I2C功能
在开始检测从设备之前,需要确保树莓派的I2C功能已被正确启用。有两种常用的配置方法:
3.1 方法一:使用raspi-config工具(推荐)
在终端中执行以下命令,打开树莓派配置工具:
sudo raspi-config
然后按以下步骤操作:
-
选择
Interfacing Options(接口选项),按Enter -
选择
I2C,按Enter -
选择
<Yes>启用I2C接口 -
依次选择
<Ok>→<Finish>完成配置 -
如果系统提示重启,执行
sudo reboot重启树莓派
3.2 方法二:手动编辑配置文件
也可以手动编辑 /boot/config.txt 文件来启用I2C:
sudo nano /boot/config.txt
在文件末尾添加以下内容:
dtparam=i2c_arm=on
保存并退出(Ctrl+O → Enter → Ctrl+X),然后重启树莓派:
sudo reboot
3.3 验证I2C是否已启用
重启后,执行以下命令检查I2C内核模块是否已加载:
lsmod | grep i2c
如果I2C已启用,会有下面的输出:
如果没有任何输出,请重启系统后再试。如需查看树莓派上的I2C总线列表,可以使用:
i2cdetect -l
输出示例:
树莓派1代使用I2C0,而树莓派2代及以后(包括树莓派4)使用I2C1。
4. 安装I2C工具
i2c-tools是Linux系统中用于监控和识别I2C设备的工具集,在硬件识别和故障诊断方面非常重要。执行以下命令进行安装:
sudo apt update
sudo apt install i2c-tools -y
i2c-tools包含以下四个主要命令:
-
i2cdetect--- 扫描I2C总线,检测已连接的设备 -
i2cdump--- 读取I2C设备的所有寄存器内容 -
i2cget--- 从I2C设备的指定寄存器读取数据 -
i2cset--- 向I2C设备的指定寄存器写入数据
5. 检测Slave设备状态
5.1 使用i2cdetect扫描I2C设备
i2cdetect 是检测从设备状态的核心命令,它可以扫描指定I2C总线上的所有地址,并报告哪些地址有设备响应-。在树莓派上执行以下命令-:
sudo i2cdetect -y 1
📖 参数说明:
-y:禁用交互模式,直接执行扫描操作,适用于脚本调用
1:指定要扫描的I2C总线编号,树莓派2代及以后使用总线1
-a(可选):扫描所有地址(包括保留地址)
5.2 理解扫描结果
执行命令后,终端会显示一个16×8的地址表格。以下是一个SHT45的输出示例:
SHT45查询的地址,符合预期

在扫描结果中:
-
--:表示该地址上没有检测到设备 -
数字(如
20、48、50):表示在该地址上检测到了I2C从设备
💡 提示 :如果扫描结果中所有地址都显示为
--,请检查接线是否正确、电源是否稳定,以及从设备是否正常工作。
6. 常见故障排查
在检测I2C从设备状态时,可能会遇到以下常见问题:
6.1 扫描不到任何设备
可能原因及解决方法:
-
I2C未启用 :执行
sudo raspi-config重新启用I2C,并重启系统 -
接线错误:检查SDA和SCL是否正确连接(SDA接GPIO2,SCL接GPIO3)
-
电源问题:检查从设备的供电是否正常
-
地址冲突:如果总线上有多个设备,确认地址不冲突
-
逻辑电平不匹配:确保从设备支持3.3V逻辑电平(树莓派GPIO为3.3V)
6.2 读取寄存器失败
可能原因及解决方法:
-
寄存器地址错误:查阅从设备的数据手册,确认正确的寄存器地址
-
通信速率问题:某些设备对I2C时钟频率敏感,可以尝试降低通信速率
-
设备需要唤醒:某些设备在读取前需要先发送特定的唤醒命令
6.3 i2cdetect显示设备地址但无法通信
可能原因及解决方法:
-
设备可能只响应特定的通信协议(如SMBus),尝试使用不同的读取方式
-
设备可能处于复位或待机状态,需要发送特定命令唤醒
-
检查从设备的数据手册,确认正确的通信时序
6.4 设备地址显示为UU
如果在 i2cdetect 的输出中看到 UU 而不是数字,这表示该地址已被内核驱动程序占用,属于正常现象,说明设备已被系统识别并加载了相应驱动-。
掌握I2C从设备的检测方法,是后续进行I2C通信开发和调试的基础。