I2C使用参考

Version 1.0


1. 概述

目前开发板上支持2组I2C controller。


2. Dts配置


2.1. Demo板支持的I2C padmux

I2C Group Mode SCL SDA DEV
HW I2C group0 10 PAD_KEY6 PAD_KEY7 /dev/i2c-0
11 PAD_KEY12 PAD_KEY13
12 PAD_GPIO1 PAD_GPIO2
13 PAD_GPIO3 PAD_GPIO4
HW I2C group1 8 PAD_KEY8 PAD_KEY9 /dev/i2c-1
9 PAD_GPIO1 PAD_GPIO2

提供两组HW I2C,第一组HW I2C group0的配置可选择如上4种其中一种, 对应节点是/dev/i2c-0;第二组HW I2C group1的配置可选择如上2种其中一种, 对应节点是/dev/i2c-1。


2.2. I2C的dts配置

I2C0的dts配置,以mode11为例。

  1. 如下红色方框i2c-padmux = < Mode >,参数Mode要设为11,修改pioneer3 -demo.dtsi

  2. 添加I2C0 padmux复用

    修改pioneer3-ssc020a-s01a-demo-padmux.dtsi

    I2C0选择Mode 11(PAD_KEY12/PAD_KEY13)进行输出,没有在其他组输出的话,需要将其他组注释掉。

I2C1的dts配置,以mode8为例。

  1. 如下红色方框i2c-padmux = < Mode >,参数Mode要设为8,修改pioneer3 -demo.dtsi

  2. 添加I2C1 padmux复用

    修改pioneer3-ssc020a-s01a-demo-padmux.dtsi

    I2C1选择Mode 8(PAD_KEY8/PAD_KEY9)进行输出,没有在其他组输出的话,需要将其他组注释掉。


3. Kernel配置

  1. 打开kernel对I2C的配置

  2. 打开SStar I2C驱动配置


4. I2C测试


4.1. 检查I2C padmux配置

Uboot下通过reg确认I2C1的padmux配置:

使用mode8,bit4~bit7为8.

kernel下通过reg确认I2C1的padmux配置:

Kernel下读取16位地址6f(de右移一位),bit4~bit7为8,当前mode为mode8。


4.2. Uboot下验证I2C

Uboot下I2C测试指令如下,可通过i2c probe指令来测试设备是否可用:

探测I2C bus1下设备,gt911从设备地址有两组,上电初始化时通过控制Reset和INT口状态来设定设备地址。

Uboot下从设备地址为0x14:

Uboot下从设备地址为0x5D:

我们在kernel下使用0x5D这个设备地址。


4.3. Kernel下验证I2C

使用i2c_read_write来验证,测试指令如下:

测试往slave addr为0xba(0x5d左移一位)的reg 0x8140写入0x40 :

初次读取数据位0x39,写入0x40后,再次读取数据,结果与写入数据一致。


5. DEMO示例


5.1. Kernel demo示例

测试源码testI2c.c

以i2c读写sensor为例:

  1. 编译源码生成测试bin。

    arm-linux-gnueabihf-gcc –o testI2c testI2c.c
    
  2. 挂载至板端,先运行sensor相关的demo(如zkgui的人脸检测),初始化sensor。

  3. 执行测试bin档

    0x20为sensor设备地址,0xf2为sensor的一个可读写寄存器地址,向寄存器写入数据再读出,结果与写入一致。

  4. 对比i2c_read_write工具读写结果(0x20左移一位)。

    使用测试bin档写入,用i2c_read_write读取,结果一致;

    使用i2c_read_write写入,用测试bin档读取,结果一致。验证demo读写i2c正常。