I2C使用指导
使用流程
使用I2C设备的一般流程如图1所示。
打开I2C控制器
在进行I2C通信前,首先要调用I2cOpen打开I2C控制器。
struct DevHandle *I2cOpen(int16_t number);
表 1 I2cOpen参数和返回值描述
假设系统中存在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参数和返回值描述
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参数和返回值描述
I2cClose(i2cHandle); /* 关闭I2C控制器 */