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控制器句柄 */
  2. /* 打开I2C控制器 */
  3. i2cHandle = I2cOpen(3);
  4. if (i2cHandle == NULL) {
  5. HDF_LOGE("I2cOpen: failed\n");
  6. return;
  7. }

进行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控制器 */