Skip to main content

I2C使用

1. Iconfig配置方法

1.1 I2C shell命令配置

1

1.2 I2C控制器驱动配置

2

相关GPIO选择

3

1.3 GPIO模拟I2C使用

若I2C总线不够用,或者怀疑i2c驱动异常,还可以使用GPIO口模拟I2C,以便检测,具体配置如下:

4

2. I2C shell命令详解

相关源码见libhardware2/src/cmds目录下的i2c_main.c

2.1 shell命令

cmd_i2c detect <busnum>
功能:探测i2c设备
参数:
busnum //探测的i2c总线号
example:
cmd_i2c detect 5
cmd_i2c read <busnum> <dev_addr> <size>
功能:从指定的i2c总线下的设备接收数据
参数:
busnum //指定的i2c总线号
dev_addr //指定设备相对应的设备地址
size //接收的⼤⼩
example:
cmd_i2c read 5 0x5d 8
cmd_i2c write <busnum> <dev_addr> <data0> [data...]
功能:往指定的i2c总线下的设备发送数据
参数:
busnum //指定的i2c总线号
dev_addr //指定设备对应的设备地址
<data0>[data...] //发送的数据(16进制)
example:
cmd_i2c write 5 0x5d 0xaa 0xbb
cmd_i2c read_reg <busnum> <dev_addr> <reg_addr> <size>
功能:从指定的i2c总线下的设备的寄存器地址读取数据(8位寄存器)
参数:
busnum //指定的i2c总线号
dev_addr //指定设备对应的设备地址
reg_addr //指定设备的寄存器地址
size //读取的⼤⼩
example:
read_reg 5 0x5d 0x00 8
cmd_i2c wrtie_reg <busnum> <dev_addr> <reg_addr> <data0> [data...]
功能:往指定的i2c总线下的设备的寄存器写⼊数据(8位寄存器)
参数:
busnum //指定的i2c总线号
dev_addr //指定设备对应的设备地址
reg_addr //指定设备对应的寄存器地址
<data0>[data...]//写⼊的数据(16进制)
example:
write_reg 5 0x5d 0x00 0xaa 0xbb
cmd_i2c read_reg_16 <busnum> <dev_addr> <reg_addr_16> <size>
功能:从指定的i2c总线下的设备的寄存器地址读取数据(16位寄存器)
参数:
busnum //指定的i2c总线号
dev_addr //指定设备对应的设备地址
reg_addr_16 //指定设备的寄存器地址
size //读取的⼤⼩
example:
read_reg_16 5 0x5d 0x3010 2
cmd_i2c wrtie_reg_16 <busnum> <dev_addr> <reg_addr_16> <data0> [data...]
功能:往指定的i2c总线下的设备的寄存器写⼊数据(16位寄存器)
参数:
busnum //指定的i2c总线号
dev_addr //指定设备对应的设备地址
reg_addr_16 //指定设备对应的寄存器地址
<data0>[data...] //写⼊的数据(16进制)
example:
write_reg_16 5 0x5d 0x3010 0x55 0xaa

2.2 具体例⼦

cmd_gpio set_func pb24 output1  //这是gtx99的上电流程,必须先上电才可以进行如下操作
cmd_i2c detect 5  //探测i2c 5号总线,发现0x5d地址有设备,就是我们的gt9xx


0 1 2 3 4 5 6 7 8 9 a b c d e f

00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- UU -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
cmd_i2c read_reg 5 0x5d 0x80 1              //找一个可读写的寄存器

Dump Recv Buffer: //读到的值
ff:

3. I2C 应用接口分析

相关源码见libhardware2/src/lib/i2c目录下的i2c.c

3.1 API详细介绍

int i2c_open(uint8_t bus_num)
功能:打开i2c设备
参数:
bus_num //i2c总线号
返回值:
成功:i2c设备句柄
失败:负数
void i2c_close(int i2c_fd)
功能:关闭I2C设备
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
返回值:

int i2c_detect(int i2c_fd, uint16_t device_addr)
功能:i2c接收数据
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址

返回值:
成功:0
失败:负数
int i2c_read(int i2c_fd, uint16_t device_addr, void *buffer, int size)
功能:i2c接收数据
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
buffer //存放接收数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数
int i2c_write(int i2c_fd, uint16_t device_addr, void *buffer,int size)
功能:i2c发送数据
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
buffer //存放发送数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数
int i2c_read_reg(int i2c_fd, uint16_t device_addr, uint8_t reg_addr,void*buffer, int size)
功能:i2c读寄存器
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
reg_addr //寄存器地址(8bit)
buffer //存放读取数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数
int i2c_write_reg(int i2c_fd,uint16_t device_addr, uint8_t reg_addr,void*buffer, int size)
功能:i2c写寄存器
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
reg_addr //寄存器地址(8bit)
buffer //存放写入数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数
int i2c_read_reg_16(int i2c_fd, uint16_t device_addr, uint16_t reg_addr,void *buffer, int size)
功能:i2c读寄存器
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
reg_addr //寄存器地址(16bit)
buffer //存放读取数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数
int i2c_write_reg_16(int i2c_fd, uint16_t device_addr, uint16_t reg_addr, void *buffer, int size)
功能:i2c写寄存器
参数:
i2c_fd //i2c设备句柄,通过i2c_open获得
device_addr //i2c设备地址
reg_addr //寄存器地址(16bit)
buffer //存放写入数据的buffer
size //buffer的大小
返回值:
成功:0
失败:负数

3.2 具体例⼦

#include <stdio.h>
#include <libhardware2/i2c.h> //包含i2c相关api
#include <stdint.h>

int main(void) //i2c总线读取与写入,寄存器读写与写入例子
{
int read_size = 4, write_size = 4;
int bus_num = 5;
uint16_t device_addr = 0x5d; //gt9xx设备地址
uint8_t reg_addr = 0x80; //可读写寄存器地址

uint8_t buffer_read[read_size];

int fd = i2c_open(bus_num); //打开总线设备

printf("read reg : ");
i2c_read_reg(fd, device_addr, reg_addr, buffer_read, read_size); //读取寄存器数据
i2c_read_print(buffer_read, read_size);

i2c_close(fd); //关闭总线设备

return 0;

}