首页 > 其他分享 >i2ctransfer

i2ctransfer

时间:2025-01-16 21:57:04浏览次数:3  
标签:i2ctransfer 0x18 总线 地址 寄存器 i2c

i2ctransfer

i2ctransfer 是一个在 Linux 系统上通过 I2C 总线与设备通信的工具,它通常用于执行低级的 I2C 数据传输。这个命令允许用户通过 I2C 总线进行读取和写入操作。它是 i2c-tools 包的一部分,通常用于调试和与 I2C 设备进行交互。


提示: i2c 通信失败可以参考《rk3568 I2C》

文章目录


前期准备

  1. Linux 安装 i2c-tools
    如果你的Linux系统上还没有安装 i2c-tools,可以通过以下命令进行安装:
sudo apt-get install i2c-tools

buildroot 默认集成 i2c工具包,无需额外配置。

  1. Android 添加 i2ctransfer 工具
    从 官方下载 i2c-tools
    i2c-tools
    将代码放在Android项目源代码的external目录下,解包后得到 i2c-tools-4.4 文件夹。
    方便进行编译,编写 Android.mk,内容如下:
LOCAL_PATH:= $(call my-dir)

################### i2c-tools #########################
include $(CLEAR_VARS)

LOCAL_MODULE := i2c-tools

LOCAL_SRC_FILES := \
    tools/i2cbusses.c \
    tools/util.c \
    lib/smbus.c

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

#LOCAL_CFLAGS := -g -Wall -Werror -Wno-unused-parameter
include $(BUILD_STATIC_LIBRARY)

################### i2ctransfer #######################
include $(CLEAR_VARS)

LOCAL_MODULE:=i2ctransfer

LOCAL_SRC_FILES:= \
    tools/i2ctransfer.c

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH) \
    $(LOCAL_PATH)/include

LOCAL_SHARED_LIBRARIES:= \
    libc
LOCAL_STATIC_LIBRARIES := \
    i2c-tools

LOCAL_CPPFLAGS += -DANDROID

include $(BUILD_EXECUTABLE)

提示:源码中包含 i2cdetect、i2cget、i2cdump、i2cset等工具,切勿添加到编译配置文件,以免与原有冲突。

配置环境变量,编译 i2ctransfer

source build/envsetup.sh
lunch rk3568_s-userdebug
# 编译 i2ctransfer
mmm external/i2c-tools-4.4 -j8
.......
[100% 1/1] initializing build system ...
device/rockchip/common/prebuild.mk:2: warning: Generating manifest snapshot at out/commit_id.xml...
device/rockchip/common/prebuild.mk:3: warning: You can disable this by removing this and setting BOARD_RECORD_COMMIT_ID := false in BoardConfig.mk
Saved manifest to out/commit_id.xml
[100% 28/28] Install: out/target/product/rk3568_s/system/bin/i2ctransfer

将生成 i2ctransfer 拷贝到系统,到此 i2ctransfer 工具准备完成。

1. i2ctransfer 简述

i2ctransfer 是一个在 Linux 系统上通过 I2C 总线与设备通信的工具,它通常用于执行低级的 I2C 数据传输。这个命令允许用户通过 I2C 总线进行读取和写入操作。它是 i2c-tools 包的一部分,通常用于调试和与 I2C 设备进行交互。

1.1 i2ctransfer 命令基础介绍

i2ctransfer 命令的基本结构:

i2ctransfer -f -y <bus> <read/write>N@<address> [<data>...]

参数详解:

  • -f--force:强制执行该操作,即使有一些警告或潜在的错误存在。
  • -y:跳过对总线访问的确认,通常用于自动化脚本,防止每次都询问确认。
  • <bus>:指定 I2C 总线的编号。在大多数系统上,I2C 总线设备路径通常为 /dev/i2c-X,其中 X 是总线编号。总线编号通常可以通过 ls /dev/i2c-* 命令来确认。
  • <read/write>:指定是进行读操作(rN,N 是要写入的字节数)还是写操作(wN,N 是要读取的字节数)。读操作会从设备读取数据,写操作则向设备发送数据。
  • <address>:指定 I2C 设备的地址,这是设备的 7 位地址(0xXX)。设备地址通常可以从文档或数据表中找到。
  • <data>:在写操作中,列出要发送到设备的数据字节;在读操作中,指定要读取的字节数。

额外选项:

  • -r <retries>:指定重试次数,表示在遇到通信失败时自动重试指定次数。
  • -t <timeout>:指定每次操作的超时时间(以毫秒为单位)。

2. i2ctransfer 示例

简单讲解 i2ctransfer 在不同场景下使用方法。

2.1 芯片 7位i2c地址 8位寄存器地址 8位数据读写操作

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x18, 写入数据 0xa7
i2ctransfer -f -y 3 w2@0x1a 0x18 0xa7

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x18:表示寄存器地址 0x18。
0xa7:表示要写入的值。

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x18, 读取一字节
i2ctransfer -f -y 3 w1@0x1a 0x18 r1

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x18:表示寄存器地址 0x18。
r1:表示要读取字节数量。

2.2 芯片 7位i2c地址 16位寄存器地址 8位数据 读写操作

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x3018, 写入数据 0xa7
i2ctransfer -f -y 3 w3@0x1a 0x30 0x18 0xa7

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
0xa7:表示要写入的值。

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x3018, 读取一字节
i2ctransfer -f -y 3 w2@0x1a 0x30 0x18 r1

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
r1:表示要读取字节数量。

2.3 芯片 7位i2c地址 16位寄存器地址 16位数据 读写操作

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x3018, 写入数据 0xa7
i2ctransfer -f -y 3 w4@0x1a 0x30 0x18 0xa7 0xb0

-y 3:选择 I2C 总线 3,并跳过确认提示。
w4@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
0xa7 0xb0:表示写入寄存器的值 0xa7b0,这里分为两个字节分别发送。0xa7 是高字节,0xb0 是低字节。

i2c总线 3, 芯片地址 0x1a, 寄存器地址 0x3018, 读取一字节
i2ctransfer -f -y 3 w2@0x1a 0x30 0x18 r1

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a:表示写操作,设备地址为 0x1a,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
r2:表示要读取字节数量。

2.4 芯片 13位i2c地址 16位寄存器地址 8位数据 读写操作

i2c总线 3, 芯片地址 0x1a20, 寄存器地址 0x3018, 写入数据 0xa7
i2ctransfer -f -y 3 w3@0x1a20 0x30 0x18 0xa7

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a20:表示写操作,设备地址为 0x1a20,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
0xa7:表示要的值。

i2c总线 3, 芯片地址 0x1a20, 寄存器地址 0x3018, 读取一字节
i2ctransfer -f -y 3 w2@0x1a20 0x30 0x18 r1

-y 3:选择 I2C 总线 3,并跳过确认提示。
w2@0x1a20:表示写操作,设备地址为 0x1a20,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
r1:表示要读取字节数量。

2.5 芯片 13位i2c地址 16位寄存器地址 16位数据 读写操作

i2c总线 3, 芯片地址 0x1a20, 寄存器地址 0x3018, 写入数据 0xa7
i2ctransfer -f -y 3 w4@0x1a20 0x30 0x18 0xa7

-y 3:选择 I2C 总线 3,并跳过确认提示。
w4@0x1a20:表示写操作,设备地址为 0x1a20,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
0xa7 0xb0:表示写入寄存器的值 0xa7b0,这里分为两个字节分别发送。0xa7 是高字节,0xb0 是低字节。

i2c总线 3, 芯片地址 0x1a20, 寄存器地址 0x3018, 读取2字节
i2ctransfer -f -y 3 w2@0x1a20 0x30 0x18 r2

-y 3:选择 I2C 总线 3,并跳过确认提示。
w4@0x1a20:表示写操作,设备地址为 0x1a20,后面跟随两个字节的操作。
0x30 0x18:表示寄存器地址 0x3018,这里分为两个字节分别发送。0x30 是高字节,0x18 是低字节。
r2:表示要读取字节数量。

3. i2ctransfer 帮助说明

Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...
  I2CBUS is an integer or an I2C bus name
  DESC describes the transfer in the form: {r|w}LENGTH[@address]
    1) read/write-flag 2) LENGTH (range 0-63535, or '?')
    3) I2C address (use last one if omitted)
  DATA are LENGTH bytes for a write message. They can be shortened by a suffix:
    = (keep value constant until LENGTH)
    + (increase value by 1 until LENGTH)
    - (decrease value by 1 until LENGTH)
    p (use pseudo random generator until LENGTH with value as seed)

Example (bus 0, read 8 byte at offset 0x64 from EEPROM at 0x50):
  # i2ctransfer 0 w1@0x50 0x64 r8
Example (same EEPROM, at offset 0x42 write 0xff 0xfe ... 0xf0):
  # i2ctransfer 0 w17@0x50 0x42 0xff

结语

不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋

标签:i2ctransfer,0x18,总线,地址,寄存器,i2c
From: https://blog.csdn.net/weixin_35723192/article/details/145017492

相关文章