Linux学习笔记--i2cget 命令
i2cget
是 Linux 下 i2c-tools 工具包中的一个命令行工具,用于从 I2C 设备读取数据。
所属工具包
i2c-tools 包含:
- i2cget: 从I2C设备读取数据
- i2cset: 向I2C设备写入数据
- i2cdetect: 扫描I2C总线上的设备
- i2cdump: 转储I2C设备寄存器内容
- i2ctransfer: 执行复杂的I2C传输
安装
# Ubuntu/Debian
sudo apt-get install i2c-tools# CentOS/RHEL
sudo yum install i2c-tools
命令语法
i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
参数详解
必需参数
I2CBUS:I2C总线编号(如:0, 1, 2...)
CHIP-ADDRESS:I2C设备地址(7位地址,如0x50)
可选参数
DATA-ADDRESS:要读取的寄存器地址
MODE:读取模式
b
:读取一个字节(默认)w
:读取一个字(2字节)c
:写入寄存器地址后读取一个字节i
:连续读取多个字节
选项标志
-f
:强制访问,即使设备忙也执行-y
:禁用交互模式,自动回答"yes"-a
:允许使用10位设备地址
使用示例
示例1:读取设备ID(无寄存器地址)
# 从I2C总线1上的设备0x50读取一个字节
i2cget -y 1 0x50
示例2:读取特定寄存器
# 读取设备0x1e的寄存器0x0A(红外数据低字节)
i2cget -y 1 0x1e 0x0A
示例3:读取16位数据(字)
# 从设备0x1e的寄存器0x0A读取2字节数据
i2cget -y 1 0x1e 0x0A w
输出:0x3412
(低字节0x12,高字节0x34)
示例4:连续读取多个字节
# 从设备0x50的寄存器0x00开始连续读取8字节
i2cget -y 1 0x50 0x00 i 8
在实际驱动中的应用场景
对应AP3216C驱动的读取操作
// 驱动中的读取代码
val = i2c_smbus_read_word_data(ap3216c_client, 0xA);// 对应的i2cget命令
i2cget -y 1 0x1e 0x0A w
调试传感器数据
# 读取AP3216C的3个传感器数据(模拟驱动中的read函数)
echo "IR数据:"
i2cget -y 1 0x1e 0x0A w
echo "光强数据:"
i2cget -y 1 0x1e 0x0C w
echo "距离数据:"
i2cget -y 1 0x1e 0x0E w
与相关命令配合使用
1. 先检测设备是否存在
# 扫描I2C总线1上的设备
i2cdetect -y 1
输出:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
2. 读取设备所有寄存器
# 转储设备0x1e的所有寄存器
i2cdump -y 1 0x1e
3. 写入配置后再读取
# 先写入配置,然后读取数据(模拟驱动的open函数)
# 复位设备
i2cset -y 1 0x1e 0x00 0x04
sleep 0.02
# 启动测量
i2cset -y 1 0x1e 0x00 0x03
sleep 0.25
# 读取数据
i2cget -y 1 0x1e 0x0A w
在实际项目中的用途
硬件调试
# 快速验证I2C设备是否正常工作
#!/bin/bash
BUS=1
DEVICE=0x1e# 检查设备是否响应
if i2cget -y $BUS $DEVICE > /dev/null 2>&1; thenecho "设备 0x${DEVICE:2} 在总线 $BUS 上响应正常"# 读取设备ID或其他识别寄存器DEVICE_ID=$(i2cget -y $BUS $DEVICE 0x00)echo "设备ID: $DEVICE_ID"
elseecho "设备无响应,请检查连接"
fi
传感器数据监控
# 实时监控传感器数据
while true; doclearecho "=== AP3216C 传感器数据 ==="echo "IR数据: $(i2cget -y 1 0x1e 0x0A w 2>/dev/null || echo '读取失败')"echo "光强数据: $(i2cget -y 1 0x1e 0x0C w 2>/dev/null || echo '读取失败')" echo "距离数据: $(i2cget -y 1 0x1e 0x0E w 2>/dev/null || echo '读取失败')"sleep 1
done