树莓派学习1-I2C配置与设备状态检测

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供电,请根据设备的数据手册正确连接电源,确保电压匹配,避免损坏模块。

接线步骤:

  1. 将从设备的VCC引脚连接到树莓派的3.3V(或5V,视设备而定)引脚

  2. 将从设备的GND引脚连接到树莓派的GND引脚

  3. 将从设备的SDA引脚连接到树莓派的GPIO2(物理引脚3)

  4. 将从设备的SCL引脚连接到树莓派的GPIO3(物理引脚5)

  5. 如图:

3. 启用树莓派I2C功能

在开始检测从设备之前,需要确保树莓派的I2C功能已被正确启用。有两种常用的配置方法:

3.1 方法一:使用raspi-config工具(推荐)

在终端中执行以下命令,打开树莓派配置工具:

复制代码
sudo raspi-config

然后按以下步骤操作:

  1. 选择 Interfacing Options(接口选项),按Enter

  2. 选择 I2C,按Enter

  3. 选择 <Yes> 启用I2C接口

  4. 依次选择 <Ok><Finish> 完成配置

  5. 如果系统提示重启,执行 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查询的地址,符合预期

在扫描结果中:

  • --:表示该地址上没有检测到设备

  • 数字(如 204850:表示在该地址上检测到了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通信开发和调试的基础。

相关推荐
handler019 小时前
从源码到二进制:深度拆解 Linux 下 C 程序的编译与链接全流程
linux·c语言·开发语言·c++·笔记·学习
电子云与长程纠缠9 小时前
UE5 两种方式解决Decal Actor贴花拉伸问题
学习·ue5·游戏引擎
red_redemption9 小时前
自由学习记录(172)
学习·cache line 64b·重用距离
阿荻在肝了10 小时前
Agent学习六:LangGraph学习-持久化与记忆一
python·学习·agent
寒秋花开曾相惜12 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
莹宝思密达12 小时前
【AI学习】 playwright-cli + SKILL 替换 chrom-devTools-MCP
学习
cyr___12 小时前
Unity教程(二十七)技能系统 黑洞技能(下)黑洞状态
学习·游戏·unity·游戏引擎
zmj32032412 小时前
单片机串口收发数据不可靠--用做指令会执行错误动作
单片机·嵌入式硬件·串口
yuan1999712 小时前
STM32 驱动 RC522(MFRC522)实现方案
单片机·嵌入式硬件
豆瓣鸡14 小时前
Gradle学习
学习