目录
- 一、 I2C 概述
- 二、I2C 模块相关API
- 三、接口调用实例
- 四、I2C HDF驱动开发
- 4.1、开发步骤(待续...)
- 坚持就有收获
一、 I2C 概述
I2C(Inter Integrated Circuit)集成电路间总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线。I2C 以主从方式工作。通常有一个主设备和一个或者多个从设备,主从设备通过 SDA(SerialData)串行数据线以及 SCL(SerialClock)串行时钟线两根线相连。
I2C 总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址,当主设备需要和某一个从设备通信时,通过广播的方式,将从设备地址写到总线上,如果某个从设备符合此地址,将会发出应答信号,建立传输。
I2C 的通信方式为半双工,因为只有一根 SDA 线,所以在同一时间内只可以单向通信。
I2C 接口定义了完成 I2C 传输的通用方法集合,包括:
- I2C 控制器管理:打开或关闭 I2C 控制器;
- I2C 消息传输:通过消息传输结构体数组进行自定义传输。
I2C 设备的连接示意图如下:
I2C 时序主要有四个元素组成:起始信号,终止信号,应答(0),非应答(1)。
I2C 数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。数据传输以字节为单位,高位在前,逐个 bit 进行传输。
I2C 操作流程如下:
二、I2C 模块相关API
头文件路径:base/iothardware/peripheral/interfaces/inner_api/iot_i2c.h
接口函数 | 描述 |
---|---|
unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate); | 初始化I2C |
unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen); | I2C写操作 |
unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); | I2C读操作 |
unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate); | 设置I2C波特率 |
三、接口调用实例
//代码功能:定义了 I2C 接口功能以及 I2C 相关参数,GPIO_00 号口作为 I2C_SDA 模式,最后进行读写操作。#include "iot_i2c.h"
IoTI2cInit(I2C_SDA,100000); //100KHz 为波特率
IoTI2cWrite(I2C_SDA,0x00,data,strlen(data)); //0x00 为指定的设备地址
IoTI2cRead(I2C_SDA,0x00,data,strlen(data));
四、I2C HDF驱动开发
在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型控制器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。I2C模块即采用统一服务模式(如图1)。
在统一模式下,所有的控制器都被核心层统一管理,并由核心层统一发布一个服务供接口层,因此这种模式下驱动无需再为每个控制器发布服务。
I2C模块各分层的作用为:
接口层:提供打开设备,数据传输以及关闭设备的能力。
核心层:主要负责服务绑定、初始化以及释放管理器,并提供添加、删除以及获取控制器的能力。
适配层:由驱动适配者实现与硬件相关的具体功能,如控制器的初始化等。
图 1 I2C统一服务模式结构图
4.1、开发步骤(待续…)
I2C模块适配包含以下四个步骤:
-
实例化驱动入口
- 实例化HdfDriverEntry结构体成员。
- 调用HDF_INIT将HdfDriverEntry实例化对象注册到HDF框架中。
-
配置属性文件
- 在device_info.hcs文件中添加deviceNode描述。
- 【可选】添加i2c_config.hcs器件属性文件。
-
实例化I2C控制器对象
- 初始化I2cCntlr成员。
- 实例化I2cCntlr成员I2cMethod和I2cLockMethod。
- icon-note.gif 说明:
- 实例化I2cCntlr成员I2cMethod和I2cLockMethod,详见接口说明。
-
驱动调试
- 【可选】针对新增驱动程序,建议验证驱动基本功能,例如挂载后的信息反馈,消息传输的成功与否等。