I2C总线驱动概述
I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数。驱动程序包含初始化I2C总线控制器__i2cHwInit函数,操作函数集(总线传输__i2cTransfer函数,总线控制__i2cMasterCtl函数)。
Imx6ul控制器的硬件描述
imx6ul处理器内部集成了一个I2C控制器,通过五个寄存器来进行控制。
I2Cx_IADR
I2C地址寄存器
I2Cx_IFDR
I2C分频寄存器
I2Cx_I2CR
I2C控制寄存器
I2Cx_I2SR
I2C状态寄存器
I2Cx_I2DR
I2C数据寄存器
通过I2Cx_I2CR,I2Cx_IFDR,I2Cx_I2DR,I2Cx_IADR寄存器操作,可在I2C总线上产生开始位、停止位、数据和地址,而传输的状态则通过I2Cx_I2SR寄存器来获取。
I2C总线传输编程流程
I2C总线驱动传输函数,主要编程流程如图 21所示。
图 21 I2C编程状态
传输大致流程:
1.使能I2C控制器
2.设置为主模式(占用总线)
3.传输消息(总线传输完成产生IIF中断,在中断中判断是否传输完成)
4.传输完成后设置为从模式(释放总线)
5.失能I2C
I2C总线传输中断处理
I2C总线驱动中断处理,编程流程如图 22所示。
图 22中断处理
技术实现
I2C总线驱动框架
I2C总线驱动实现基本功能,只要实现如图 31中的四个函数即可。
图 31 I2C总线驱动四个基本函数
i2cBusCreate
i2cBusCreate函数初始化目标电路板i2c总线系统,调用i2cBusFuns函数初始化相应I2C总线系统并创建对应I2C适配器。根据在bspimx6ul/bsp/SylixOS/bsp/ulevk_board/bspboard.h中的I2C配置,初始化相应的I2C总线。
i2cBusFuncs
i2cBusFuncs函数用于初始化 i2c总线并获取操作函数集,主要包括了设置芯片管脚复用__i2cIomuxConfig函数,初始化I2C控制器__i2cInit函数,返回操作函数集(总线传输Transfer函数,总线控制MasterCtl函数)。
__i2cInit
__i2cInit函数用于初始化I2C控制器,主要包括了初始化I2C使用的信号量,设置时钟频率,指定作从设备时的地址。
__i2cTransfer
__i2cTransfer函数为I2C传输函数,用于在I2C总线上传输和接收数据。
驱动程序框架
整个驱动程序的框架如图 32所示。
图 32驱动程序流程框架
BSP中驱动配置
根据imx6ul相关芯片手册,配置寄存器地址并定义I2C通道相关信息结构。如程序清单 31所示。
程序清单 31 I2C通道信息
/********************************************************************************************************* i2c 通道相关信息 *********************************************************************************************************/ struct __i2c_channel{ UINT uiChannel; /* I2C总线通道号 */ LW_OBJECT_HANDLE I2C_hSignal; /* 信号量 */ BOOL I2C_bIsInit; /* 是否初始化 */ int iStatus; /* 状态 */ int iBpsParam; /* 波特率参数 */ PLW_I2C_MESSAGE pi2cmsg; /* 需要处理的消息 */ int iMsgPtr; /* 消息内部指针 */ int iMsgNum; /* 消息数量 */ int iMsgIndex; /* 当前处理的 msg 下标 */ }; typedef struct __i2c_channel __I2C_CHANNEL; typedef struct __i2c_channel *__PI2C_CHANNEL;代码实现
I2C总线驱动代码
i2cBusCreate,i2cBusFuncs的具体实现
i2cBusCreate函数与i2cBusFuncs函数初始化I2C,并将返回的操作函数集与i2c适配器绑定。如程序清单 32,程序清单 33所示。