1 Star 0 Fork 4.9K

alvinfu / docs

forked from OpenHarmony / docs 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
I2C使用指导.md 9.04 KB
一键复制 编辑 原始数据 按行查看 历史
wenjun 提交于 2020-09-08 10:08 . add OpenHarmony 1.0 baseline

I2C使用指导

使用流程

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

图 1 I2C设备使用流程图

打开I2C控制器

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

struct DevHandle *I2cOpen(int16_t number);

表 1 I2cOpen参数和返回值描述

参数

参数描述

number

I2C控制器号

返回值

返回值描述

NULL

打开I2C控制器失败

设备句柄

打开的I2C控制器设备句柄

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

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

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

进行I2C通信

消息传输

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

表 2 I2cTransfer参数和返回值描述

参数

参数描述

handle

I2C控制器设备句柄

msgs

待传输数据的消息结构体数组

count

消息数组长度

返回值

返回值描述

正整数

成功传输的消息结构体数目

负数

执行失败

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

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

注意:

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

关闭I2C控制器

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

void I2cClose(DevHandle *handle);

表 3 I2cClose参数和返回值描述

参数

参数描述

handle

I2C控制器设备句柄

I2cClose(i2cHandle); /* 关闭I2C控制器 */
1
https://gitee.com/alvinfu/docs.git
git@gitee.com:alvinfu/docs.git
alvinfu
docs
docs
master

搜索帮助