树莓派学习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通信开发和调试的基础。

相关推荐
学嵌入式的小杨同学10 小时前
STM32 进阶封神之路(三十三):W25Q64 任意长度写入深度实战 —— 从页限制到工业级通用读写(附完整代码 + 避坑指南)
stm32·单片机·嵌入式硬件·架构·硬件架构·嵌入式·flash
摇滚侠11 小时前
如何选择 nodejs 版本,nodejs 版本号详解
学习
醇氧11 小时前
【学习】IP地址:数字世界的“门牌号”怎么读?
网络协议·学习·tcp/ip
talen_hx29612 小时前
《零基础入门Spark》学习笔记 Day 11
笔记·学习·spark
ZhiqianXia13 小时前
gem5 模拟器学习笔记(1):核心术语整理
笔记·学习
GHL28427109014 小时前
MCP学习
学习·ai
凌波粒14 小时前
D2L学习笔记:安装、张量与数据处理
笔记·python·学习·pandas
chools14 小时前
Java后端拥抱AI开发之个人学习路线 - - Spring AI【第一期】
java·人工智能·学习·spring·ai