SylixOS iMX6平台I2C总线驱动

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所示。

SylixOS iMX6平台I2C总线驱动

图 21 I2C编程状态

传输大致流程:

1.使能I2C控制器

2.设置为主模式(占用总线)

3.传输消息(总线传输完成产生IIF中断,在中断中判断是否传输完成)

4.传输完成后设置为从模式(释放总线)

5.失能I2C

I2C总线传输中断处理

I2C总线驱动中断处理,编程流程如图 22所示。

SylixOS iMX6平台I2C总线驱动

图 22中断处理

技术实现

I2C总线驱动框架

I2C总线驱动实现基本功能,只要实现如图 31中的四个函数即可。

SylixOS iMX6平台I2C总线驱动

图 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所示。

SylixOS iMX6平台I2C总线驱动

图 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所示。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fe08012c725cebb94d15d7ae4ab6785b.html