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号控制器
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. }
注意:
- I2cMsg结构体中的设备地址不包含读写标志位,读写信息由flags成员变量的读写控制位传递。
- 本函数不对消息结构体个数count做限制,其最大个数度由具体I2C控制器决定。
- 本函数也不对每个消息结构体中的数据长度做限制,同样由具体I2C控制器决定。
- 本函数可能会引起系统休眠,不允许在中断上下文调用
关闭I2C控制器
I2C通信完成之后,需要关闭2C控制器,关闭函数如下所示:
void I2cClose(DevHandle *handle);
表 3 I2cClose参数和返回值描述
| 参数 | 参数描述 |
|---|---|
| handle | I2C控制器设备句柄 |
1. I2cClose(i2cHandle); /* 关闭I2C控制器 */
