首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
首页
  • GM-3568JHF
  • M4-R1
  • M5-R1
  • SC-3568HA
  • M-K1HSE
  • CF-NRS1
  • CF-CRA2
  • 1684XB-32T
  • 1684X-416T
  • C-3568BQ
  • C-3588LQ
  • GC-3568JBAF
  • C-K1BA
商城
  • English
  • 简体中文
  • M4-R1

    • 一、简介

      • M4-R1简介
    • 二、快速上手

      • 01 OpenHarmony概述
      • 02 镜像烧录
      • 03 应用开发快速上手
      • 04 设备开发快速上手
    • 三、应用开发

      • 01 ArkUI

        • 1 ArkTS语言简介
        • 2 UI 组件-Row 容器介绍
        • 3 UI 组件-Column 容器介绍
        • 4 UI 组件-Text 组件
        • 5 UI 组件-Toggle 组件
        • 6 UI 组件-Slider 组件
        • 7 UI 组件-Animation 组件&Transition 组件
      • 02 资料获取

        • 1 OpenHarmony 官方资料
      • 03 开发须知

        • 1 Full-SDK替换教程
        • 2 引入和使用三方库
        • 3 HDC调试
        • 4 命令行恢复出厂模式
        • 5 升级App为system权限
      • 04 构建第一个应用

        • 1 构建第一个ArkTs应用-HelloWorld
      • 05 案例

        • 01 串口调试助手应用案例
        • 02 手写板应用案例
        • 03 数字时钟应用案例
        • 04 WIFI 信息获取应用案例
    • 四、设备开发

      • 1 Ubuntu环境开发

        • 01 环境搭建
        • 02 下载源码
        • 03 编译源码
      • 2 使用DevEco Device Tool 工具

        • 01 工具简介
        • 02 开发环境的搭建
        • 03 导入SDK
        • 04 HUAWEI DevEco Tool 功能介绍
    • 五、内核外设与接口

      • 01 指南
      • 02 设备树介绍
      • 03 GPIO介绍
      • 04 I2C通讯
      • 05 SPI通信
      • 06 PWM 控制
      • 07 串口通讯
      • 08 TF卡
      • 09 屏幕
      • 10 触摸
      • 11 Ethernet(以太网)
      • 12 M.2 硬盘
      • 13 音频
      • 13 WIFI & BT
      • 14 摄像头
    • 六、资料下载

      • 资料下载
  • M5-R1

    • 一、简介

      • M5-R1简介
    • 二、快速上手

      • 镜像烧录
      • 环境搭建
      • 下载源码
    • 三、外设与接口

      • 树莓派接口
      • GPIO 接口
      • I2C 接口
      • SPI通信
      • PWM控制
      • 串口通讯
      • TF Card
      • 屏幕
      • 触摸
      • 音频
      • RTC
      • Ethernet
      • M.2
      • MINI-PCIE
      • Camera
      • WIFI&BT
    • 四、资料下载

      • 资料下载

04 I2C通讯

1 I2C介绍

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

I2C总线结构图

关于详细的I2C介绍请参考:

  • CSDN博客文章

2 I2C板卡接口

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
I2C总线检测

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

i2cdetect -a 3
I2C设备扫描

UU代表设备地址为20的设备驱动已加载成功,即上文中提到的I2C3上挂载的NCA9555。

3. 读取指定设备的全部寄存器的值:

i2cdump -f -y 3 0x20

(显示i2c3总线上的从设备 0x20 上从 0x00 到 0xff 的所有寄存器地址的值)

I2C寄存器读取

命令成功执行并输出了数据,说明总线3上存在地址为 0x20 的设备,并且基本通信是正常的。

4. 读取指定IIC设备的某个寄存器的值:

i2cget -f -y 3 0x20 0x01

(读取地址为0x20器件中的0x01寄存器值)

I2C单个寄存器读取

4 I2C使用---NAPI方式

在 GitHub 上编辑此页
上次更新:
贡献者: fxx, hjf
Prev
03 GPIO介绍
Next
05 SPI通信