Skip to main content

I2C使用

一 相关配置

I2C驱动配置有两种方式,一种直接配置驱动,另外一种可以使用gpio模拟I2C

1.1 I2C驱动配置

1

I2C相关gpio选择

2

1.2 GPIO口模拟I2C驱动

3

1.3 I2C相关demo

4

二 I2C调试

相关源码见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_i2c detect 0               //探测i2c 0号总线,发现0x14地址有设备,就是我们的gt9xx
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- UU -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

三 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
失败:负数