7. I2C 使用

7.1. 简介

主控芯片 RK3588S 上有9个I2C控制器,I2C总线上的数据在标准模式下可以以高达100k位/秒的速率传输,在快速模式下可以以高达400k位/秒的速率传输。 AIO-3588SG开发板引出2路I2C供用户自行配置。

_images/usage_i2c_interface.png

本文主要描述如何调试i2c

7.2. i2cdetect 命令

查看系统已安装的 I2C 总线列表

rk3588s_firefly_aio_3588sg:/ # i2cdetect -l
i2c-10  i2c             DP-AUX                                  I2C Adapter
i2c-8   i2c             rk3x-i2c                                I2C Adapter
i2c-6   i2c             rk3x-i2c                                I2C Adapter
i2c-4   i2c             rk3x-i2c                                I2C Adapter
i2c-2   i2c             rk3x-i2c                                I2C Adapter
i2c-0   i2c             rk3x-i2c                                I2C Adapter
i2c-9   i2c             fde50000.dp                             I2C Adapter
i2c-7   i2c             rk3x-i2c                                I2C Adapter

查看i2c6下的设备

rk3588s_firefly_aio_3588sg:/ # i2cdetect -y 6
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

可以看到i2c6上加载了两个设备的驱动,设备地址是0x48、0x5dUU表示此地址已经加载了驱动,具体有没有设备不一定

7.3. i2cdump 命令

查看i2c4下,0x64设备 0x00 - 0xff 的寄存器的值

rk3588s_firefly_aio_3588sg:/ # i2cdump -f  -y 4 0x63
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 0d 00 34 3a 63 26 81 00 00 00 40 8a aa 50 0f f5    ?.4:c&?...@??P??
10: 3c 00 00 00 00 00 00 00 b0 c4 bf b9 9b 97 e0 cf    <.......????????
20: c1 cd bb 9d 88 7c 65 56 52 50 4e 97 79 d2 de ff    ?????|eVRPN?y???
30: e5 b4 71 7c b0 c5 ae 93 9d b5 cf d5 c6 b0 99 89    ??q|????????????
40: 82 85 91 a8 c1 c9 b0 43 00 00 90 02 00 00 00 00    ???????C..??....
50: 00 00 64 00 00 00 00 00 00 00 00 00 00 00 00 a2    ..d............?
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
a0: 00 00 00 00 00 00 64 00 00 e6 00 00 00 00 00 00    ......d..?......
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

可以看到寄存器
地址: 0x00 值: 0x0d
地址: 0x01 值: 0x00
地址: 0x02 值: 0x34
地址: 0x03 值: 0x3a

以此类推

7.4. i2cget 命令

获取 i2c4 下 0x63 设备的 0x0d 寄存器的值

rk3588s_firefly_aio_3588sg:/ # i2cget -f -y 4 0x63 0x0d
0x50

7.5. i2cset 命令

对 i2c4 下 0x63 设备的 0x0d 寄存器写入数据, 0x51 是数据,b表示数据长度为8bit

rk3588s_firefly_aio_3588sg:/ # i2cset -fy 4 0x63 0x0d 0x51 b
rk3588s_firefly_aio_3588sg:/ #
rk3588s_firefly_aio_3588sg:/ # i2cget -f -y 4 0x63 0x0d
0x51

对 i2c4 下 0x63 设备的 0x0c 寄存器写入数据, 0xff00 是数据,w 表示数据长度为16bit

rk3588s_firefly_aio_3588sg:/ # i2cset -fy 4 0x63 0x0c 0xff00 w
rk3588s_firefly_aio_3588sg:/ #
rk3588s_firefly_aio_3588sg:/ # i2cget -f -y 4 0x63 0x0c
0x00
rk3588s_firefly_aio_3588sg:/ # i2cget -f -y 4 0x63 0x0d
0xff