3.I2C通讯 =========== **3.1 I2C引脚** -------------- 在40PIN引脚中有两组I2C可使用,分别是i2c-3,i2c-5 |I2C_0| +----------+---------+---------------------------+ | I2C | 引脚 | 功能 | +==========+=========+===========================+ | I2C3-SCL | 5 | I2C3 的时钟信号线 | +----------+---------+---------------------------+ | I2C3-SDA | 3 | I2C3 的数据线 | +----------+---------+---------------------------+ | I2C5-SCL | 28 | I2C5 的时钟信号线 | +----------+---------+---------------------------+ | I2C5-SDA | 27 | I2C5 的数据线 | +----------+---------+---------------------------+ **3.2 I2C接口使能** -------------------- 可以在arch/arm64/boot/dts/rockchip/rk3568-toybrick-x0-linux.dts中使能I2C3和I2C5(这两个接口默认已经使能) .. code-block:: bash :linenos: &i2c3{ status = "okay"; }; &i2c5{ status = "okay"; }; **3.3 挂载I2C设备** ------------------- 在注册 I2C 设备时,需要结构体 i2c_client 来描述 I2C 设备。然而在标准 Linux 中,用户只需要提供相应的 I2C 设备信息,Linux 就会根据所提供的信息构造 i2c_client 结构体。 用户所提供的 I2C 设备信息以节点的形式写到 DTS 文件中,如下所示: .. code-block:: bash :linenos: &i2c3{ nca9555:nca9555@20{ reg=<0x20>; compatible = "novosense,nca9555"; status="okay"; gpio-controller; #gpio-cells = <2>; }; }; 驱动通过获取DTS中的节点信息将设备挂载 .. attention:: NCA9555是一款24引脚CMOS器件,提供16位通用并行I2C总线数输入/输出GPIO扩展功能 **3.4 检查I2C设备** ------------------- 通过以下命令查看i2c总线有没有开启 如图: |I2C_1| **3.5 I2C测试工具** -------------------- 板卡中带有i2c测试命令,命令有i2cdetect、i2cdump、i2cset以及i2cget,用于扫描I2C总线上的设备、读写指定设备的寄存器等。 例如查看挂载在i2c5上的设备情况,输出内容如下: .. code-block:: bash :linenos: # i2cdetect -y 5 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- 15 -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- .. hint:: 其中“15”代表有设备地址为15的设备但是驱动未加载,UU代表设备地址为50的设备驱动已加载成功 其他常用命令使用案例如下: .. code-block:: bash :linenos: #检测当前系统有几组i2c总线 i2cdetect -l #查看i2c-3接口上的设备 i2cdetect -a 3 #读取指定设备的全部寄存器的值。 i2cdump -f -y 3 0x20 #读取指定IIC设备的某个寄存器的值,如下读取地址为0x68器件中的0x01寄存器值。 i2cget -f -y 3 0x20 0x01 #写入指定IIC设备的某个寄存器的值,如下设置地址为0x68器件中的0x01寄存器值为0x6f; i2cset -f -y 3 0x20 0x01 0x6f b .. |I2C_0| image:: picture/I2C_0.png :width: 5in :height: 3in .. |I2C_1| image:: picture/I2C_1.png :width: 7in :height: 0.5in