I2C使用参考
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为例。
-
如下红色方框i2c-padmux = < Mode >,参数Mode要设为11,修改
pioneer3 -demo.dtsi
-
添加I2C0 padmux复用
修改
pioneer3-ssc020a-s01a-demo-padmux.dtsi
I2C0选择Mode 11(PAD_KEY12/PAD_KEY13)进行输出,没有在其他组输出的话,需要将其他组注释掉。
I2C1的dts配置,以mode8为例。
-
如下红色方框i2c-padmux = < Mode >,参数Mode要设为8,修改
pioneer3 -demo.dtsi
-
添加I2C1 padmux复用
修改
pioneer3-ssc020a-s01a-demo-padmux.dtsi
I2C1选择Mode 8(PAD_KEY8/PAD_KEY9)进行输出,没有在其他组输出的话,需要将其他组注释掉。
3. Kernel配置¶
-
打开kernel对I2C的配置
-
打开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为例:
-
编译源码生成测试bin。
arm-linux-gnueabihf-gcc –o testI2c testI2c.c
-
挂载至板端,先运行sensor相关的demo(如zkgui的人脸检测),初始化sensor。
-
执行测试bin档
0x20为sensor设备地址,0xf2为sensor的一个可读写寄存器地址,向寄存器写入数据再读出,结果与写入一致。
-
对比i2c_read_write工具读写结果(0x20左移一位)。
使用测试bin档写入,用i2c_read_write读取,结果一致;
使用i2c_read_write写入,用测试bin档读取,结果一致。验证demo读写i2c正常。