I2C使用指导

使用流程

使用I2C设备的一般流程如图1所示。

图 1 I2C设备使用流程图

I2C使用指导 - 图1

打开I2C控制器

在进行I2C通信前,首先要调用I2cOpen打开I2C控制器。

struct DevHandle *I2cOpen(int16_t number);

表 1 I2cOpen参数和返回值描述

参数 参数描述
number I2C控制器号
返回值 返回值描述
NULL 打开I2C控制器失败
设备句柄 打开的I2C控制器设备句柄

假设系统中存在8个I2C控制器,编号从0到7,那么我们现在获取3号控制器


1. struct DevHandle *i2cHandle = NULL;  /* I2C控制器句柄 */

3. /* 打开I2C控制器 */
4. i2cHandle = I2cOpen(3);
5. if (i2cHandle == NULL) {
6. HDF_LOGE("I2cOpen: failed\n");
7. return;
8. }

进行I2C通信

消息传输

int32_t I2cTransfer(struct DevHandle *handle, struct I2cMsg *msgs, int16_t count);

表 2 I2cTransfer参数和返回值描述

参数 参数描述
handle I2C控制器设备句柄
msgs 待传输数据的消息结构体数组
count 消息数组长度
返回值 返回值描述
正整数 成功传输的消息结构体数目
负数 执行失败

I2C传输消息类型为I2cMsg,每个传输消息结构体表示一次读或写,通过一个消息数组,可以执行若干次的读写组合操作。


1. int32_t ret;
2. uint8_t wbuff[2] = { 0x12, 0x13 };
3. uint8_t rbuff[2] = { 0 };
4. struct I2cMsg msgs[2]; /* 自定义传输的消息结构体数组 */
5. msgs[0].buf = wbuff;    /* 写入的数据 */
6. msgs[0].len = 2;        /* 写入数据长度为2 */
7. msgs[0].addr = 0x5A;    /* 写入设备地址为0x5A */
8. msgs[0].flags = 0;      /* 传输标记为0,默认为写 */
9. msgs[1].buf = rbuff;    /* 要读取的数据 */
10. msgs[1].len = 2;        /* 读取数据长度为2 */
11. msgs[1].addr = 0x5A;    /* 读取设备地址为0x5A */
12. msgs[1].flags = I2C_FLAG_READ /* I2C_FLAG_READ置位 */
13. /* 进行一次自定义传输,传输的消息个数为2 */
14. ret = I2cTransfer(i2cHandle, msgs, 2);
15. if (ret != 2) {
16. HDF_LOGE("I2cTransfer: failed, ret %d\n", ret);
17. return;
18. }

I2C使用指导 - 图2 注意:

  • I2cMsg结构体中的设备地址不包含读写标志位,读写信息由flags成员变量的读写控制位传递。
  • 本函数不对消息结构体个数count做限制,其最大个数度由具体I2C控制器决定。
  • 本函数也不对每个消息结构体中的数据长度做限制,同样由具体I2C控制器决定。
  • 本函数可能会引起系统休眠,不允许在中断上下文调用

关闭I2C控制器

I2C通信完成之后,需要关闭2C控制器,关闭函数如下所示:

void I2cClose(DevHandle *handle);

表 3 I2cClose参数和返回值描述

参数 参数描述
handle I2C控制器设备句柄

1. I2cClose(i2cHandle); /* 关闭I2C控制器 */