04 I2C通讯
1 I2C介绍
I2C 总线控制器通过串行数据(SDA)线和串行时钟(SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。

关于详细的I2C介绍请参考:
2 I2C板卡接口

板子的引脚一共引出了2组I2C接口,分别是i2c-3,i2c-5。
3 I2C使用---命令行的方法
3.1 I2C设备树配置
下面,我们根据设备树章节的介绍,来解析一下I2C3和I2C5的设备树配置。
提示
下文的文件路径:out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/需要先编译码源。
我们先在 rk3568.dtsi
中找到I2C3和I2C5的基础配置内容如下:
i2c3: i2c@fe5c0000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xfe5c0000 0x0 0x1000>; // 寄存器地址
clocks = <&cru CLK_I2C3>, <&cru PCLK_I2C3>; // 时钟配置
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>; // 中断配置
pinctrl-names = "default";
pinctrl-0 = <&i2c3m0_xfer>; // 引脚复用配置
#address-cells = <1>;
#size-cells = <0>;
status = "disabled"; // 默认禁用
};
i2c5: i2c@fe5e0000 {
compatible = "rockchip,rk3399-i2c";
reg = <0x0 0xfe5e0000 0x0 0x1000>; // 寄存器地址
clocks = <&cru CLK_I2C5>, <&cru PCLK_I2C5>; // 时钟配置
clock-names = "i2c", "pclk";
interrupts = <GIC_SPI 51 IRQ_TYPE_LEVEL_HIGH>; // 中断配置
pinctrl-names = "default";
pinctrl-0 = <&i2c5m0_xfer>; // 引脚复用配置
#address-cells = <1>;
#size-cells = <0>;
status = "disabled"; // 默认禁用
};
再到到rk3568-pinctrl.dtsi
中查看I2C的引脚配置:
i2c3m0_xfer: i2c3m0-xfer {
rockchip,pins =
/* i2c3_sclm0 - 时钟线 */
<1 RK_PA1 1 &pcfg_pull_none_smt>,
/* i2c3_sdam0 - 数据线 */
<1 RK_PA0 1 &pcfg_pull_none_smt>;
};
i2c5m0_xfer: i2c5m0-xfer {
rockchip,pins =
/* i2c5_sclm0 - 时钟线 */
<3 RK_PB3 4 &pcfg_pull_none_smt>,
/* i2c5_sdam0 - 数据线 */
<3 RK_PB4 4 &pcfg_pull_none_smt>;
};
最后找到板级配置文件查看I2C外设的具体配置
在 rk3568-toybrick.dtsi
中,I2C5被使能并配置了传感器设备:
&i2c5 {
status = "okay"; // 使能I2C5
mxc6655xa: mxc6655xa@15 {
status = "okay";
compatible = "gs_mxc6655xa";
pinctrl-names = "default";
pinctrl-0 = <&mxc6655xa_irq_gpio>;
reg = <0x15>; // I2C设备地址
irq-gpio = <&gpio3 RK_PC1 IRQ_TYPE_LEVEL_LOW>;
irq_enable = <0>;
poll_delay_ms = <30>;
type = <SENSOR_TYPE_ACCEL>;
power-off-in-suspend = <1>;
layout = <1>;
};
};
相关信息
MXC6655XA 是美新半导体(MEMSIC)推出的一款数字输出三轴加速度计
在 ‘rk3568-toybrick-x0-linux.dts‘ 中,I2C3被使能并配置了NCA9555:
&i2c3{
nca9555:nca9555@20{
reg=<0x20>; // I2C设备地址为0x20
compatible = "novosense,nca9555"; // 设备兼容性字符串
status="okay"; // 设备状态为使能
gpio-controller; // 声明为GPIO控制器
#gpio-cells = <2>; // GPIO单元格数量
};
};
相关信息
NCA9555是一款24引脚CMOS器件,提供16位通用并行I2C总线数输入/输出GPIO扩展功能
3.2 操作I2C的常用指令
检查I2C设备:
ls dev/i2c*
测试I2C命令:
I2C tool 是一个开源工具,我们提供的SDK已下载好并进行了交叉编译,编译后已在板卡中生成 i2cdetect
、i2cdump
、i2cset
、i2cget
等测试命令,可以直接在命令行上调试使用:
- i2cdetect – 用来列举 I2C bus 和上面所有的设备
- i2cdump – 显示 i2c 设备所有 register 的值
- i2cget – 读取 i2c 设备某个 register 的值
- i2cset – 写入 i2c 设备某个 register 的值
3.3 具体功能演示
以下是对上述指令的常见使用示例:
1. 检测当前系统有几组i2c总线:
i2cdetect -l

2. 查看i2c-3接口上的设备:
i2cdetect -a 3

UU代表设备地址为20的设备驱动已加载成功,即上文中提到的I2C3上挂载的NCA9555。
3. 读取指定设备的全部寄存器的值:
i2cdump -f -y 3 0x20
(显示i2c3总线上的从设备 0x20 上从 0x00 到 0xff 的所有寄存器地址的值)

命令成功执行并输出了数据,说明总线3上存在地址为 0x20 的设备,并且基本通信是正常的。
4. 读取指定IIC设备的某个寄存器的值:
i2cget -f -y 3 0x20 0x01
(读取地址为0x20器件中的0x01寄存器值)
