⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2clib.c

📁 hreadx实时嵌入式操作系统源代码,ARM移植. threadx是一个很好的多任务实时嵌入式操作系统
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               i2cLib.c
** Last modified Date:      2007-12-05
** Last Version:            1.0.0
** Descriptions:            2440 I2C 总线操作库函数
**
**--------------------------------------------------------------------------------------------------------
** Created by:              Hanhui
** Created date:            2007-12-05
** Version:                 1.0.0
** Descriptions:            2440 I2C 总线操作库函数
**
**--------------------------------------------------------------------------------------------------------
** Modified by:             
** Modified date:           
** Version:                 
** Descriptions:            
**
*********************************************************************************************************/
#include "config.h"
#include "i2cCfg.h"
#include "i2cBus.h"
#include "i2cDev.h"
/*********************************************************************************************************
  全局变量声明
*********************************************************************************************************/
extern  I2C_BUS         __Gi2cbusChannel[I2C_MAX_CHANNEL];              /*  I2C 物理控制器通道定义      */
/*********************************************************************************************************
  I2C CON 寄存器两种取值定义
*********************************************************************************************************/
#define __I2C_CON_DACK(iBpsParam)   ((1 << 7) | (1 << 6) | (1 << 5) | (iBpsParam))
#define __I2C_CON_DNACK(iBpsParam)  ((0 << 7) | (1 << 6) | (1 << 5) | (iBpsParam))
/*********************************************************************************************************
** Function name:           __i2cInit
** Descriptions:            i2c 内部初始化
** input parameters:        NONE
** output parameters:       NONE
** Returned value:          NONE
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void  __i2cInit (void)
{
    rGPECON &= ~(0xFu << 28);
    rGPECON |=  (0xAu << 28);                                           /*  设置管脚链接                */

    rGPEUP   = rGPEUP | 0xC000;                                         /*  禁止内部上拉电阻            */
    
    rIICCON  = ((1 << 7) | (1 << 6) | (1 << 5) | (0));                  /*  初始化                      */
    rIICADD  = 0x10;                                                    /*  本地从机地址                */
    rIICSTAT =  (3 << 6) | (1 << 4);                                    /*  使能 I2C 总线               */
    rIICLC   =  (1 << 2) | (1);                                         /*  Filter enable 15 clocks     */
}
/*********************************************************************************************************
** Function name:           __i2cStartBus
** Descriptions:            启动 I2C 总线接口
** input parameters:        pi2cdevDevice   设备控制块
**                          ucReadOrWrite   读或写    1 表示读   0 表示写
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  __i2cStartBus (PI2C_DEV  pi2cdevDevice, unsigned char  ucReadOrWrite)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    INT8U           ucError;
    int             i;
    
    while (OSSemAccept(pi2cbusChannel->peventSync)) {                   /*  清除同步信号量              */
    }
    
    if (ucReadOrWrite) {                                                /*  读操作                      */
        rIICDS    = (unsigned char)(pi2cdevDevice->ucDevAddr + 1);      /*  设置器件读地址              */
        rIICSTAT  = (2 << 6) | (1 << 5) | (1 << 4);                     /*  主收模式启动                */
        rIICCON   = __I2C_CON_DACK(pi2cdevDevice->iBpsParam);           /*  重启总线 需要有此操作       */
    } else {
        rIICDS    = pi2cdevDevice->ucDevAddr;
        rIICSTAT  = (3 << 6) | (1 << 5) | (1 << 4);                     /*  主发模式启动                */
    }
    
    OSSemPend(pi2cbusChannel->peventSync, OS_TICKS_PER_SEC, &ucError);  /*  等待一秒钟                  */
    
    if ((ucError != OS_NO_ERR) || (rIICSTAT & 0x09)) {                  /*  出现错误                    */
        if (ucReadOrWrite) {                                            /*  读操作                      */
            rIICSTAT  = (2 << 6) | (0 << 5) | (1 << 4);                 /*  主收模式停止                */
        } else {
            rIICSTAT  = (3 << 6) | (0 << 5) | (1 << 4);                 /*  主发模式停止                */
        }
        rIICCON   = __I2C_CON_DACK(pi2cdevDevice->iBpsParam);           /*  允许 ACK                    */
        for (i = 0; i < 5000; i++) {                                    /*  等待结束信号有效            */
        }
        return  (-1);
    } else {
        
        return  (0);                                                    /*  器件地址发送完毕            */
    }
}
/*********************************************************************************************************
** Function name:           __i2cStopBus
** Descriptions:            停止 I2C 总线接口
** input parameters:        pi2cdevDevice   设备控制块
**                          ucReadOrWrite   读或写    1 表示读   0 表示写
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  __i2cStopBus (PI2C_DEV  pi2cdevDevice, unsigned char  ucReadOrWrite)
{
    int     i;
    
    if (ucReadOrWrite) {                                                /*  读操作                      */
        rIICSTAT  = (2 << 6) | (0 << 5) | (1 << 4);                     /*  主收模式停止                */
    } else {                                                            /*  写操作                      */
        rIICSTAT  = (3 << 6) | (0 << 5) | (1 << 4);                     /*  主发模式停止                */
    }
    
    rIICCON = __I2C_CON_DACK(pi2cdevDevice->iBpsParam);                 /*  允许 ACK                    */
    
    for (i = 0; i < 5000; i++) {                                        /*  等待结束信号有效            */
    }
    
    return (0);
}
/*********************************************************************************************************
** Function name:           __i2cSendByte
** Descriptions:            I2C 总线接口发送一个字节
** input parameters:        pi2cdevDevice   设备控制块
**                          ucData          发送的字节
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  __i2cSendByte (PI2C_DEV  pi2cdevDevice, unsigned char  ucData)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    INT8U           ucError;
    
    rIICDS  = ucData;                                                   /*  数据                        */
    rIICCON = __I2C_CON_DACK(pi2cdevDevice->iBpsParam);                 /*  允许 ACK                    */
    
    OSSemPend(pi2cbusChannel->peventSync, OS_TICKS_PER_SEC, &ucError);  /*  等待一秒钟                  */
    
    if (ucError != OS_NO_ERR || (rIICSTAT & 0x09)) {                    /*  出现错误                    */
        
        __i2cStopBus(pi2cdevDevice, __I2C_WRITE);                       /*  结束总线                    */
        
        return  (-1);
        
    } else {
    
        return  (0);
    }
}
/*********************************************************************************************************
** Function name:           __i2cRecvByte
** Descriptions:            I2C 总线接口接收一个字节 (ACK = 低电平)
** input parameters:        pi2cdevDevice   设备控制块
**                          pucData         接收的字节
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  __i2cRecvByte (PI2C_DEV  pi2cdevDevice, unsigned char  *pucData)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    INT8U           ucError;
    
    rIICCON   = __I2C_CON_DACK(pi2cdevDevice->iBpsParam);               /*  允许 ACK                    */
    
    OSSemPend(pi2cbusChannel->peventSync, OS_TICKS_PER_SEC, &ucError);  /*  等待一秒钟                  */
    
    if (ucError != OS_NO_ERR || (rIICSTAT & 0x09)) {                    /*  出现错误                    */
        
        __i2cStopBus(pi2cdevDevice, __I2C_READ);                        /*  结束总线                    */
        
        return  (-1);
    
    } else {
        
        *pucData = (unsigned char)rIICDS;                               /*  接收数据                    */
        return  (0);
    }
}
/*********************************************************************************************************
** Function name:           __i2cRecvByteLast
** Descriptions:            I2C 总线接口接收一个字节 (ACK = 高电平)
** input parameters:        pi2cdevDevice   设备控制块
**                          pucData         接收的字节
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  __i2cRecvByteLast (PI2C_DEV  pi2cdevDevice, unsigned char  *pucData)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    INT8U           ucError;
    
    rIICCON  = __I2C_CON_DNACK(pi2cdevDevice->iBpsParam);               /*  允许 NACK                   */
    
    OSSemPend(pi2cbusChannel->peventSync, OS_TICKS_PER_SEC, &ucError);  /*  等待一秒钟                  */
    
    if (ucError != OS_NO_ERR || (rIICSTAT & 0x08)) {                    /*  出现错误                    */
        
        __i2cStopBus(pi2cdevDevice, __I2C_READ);                        /*  结束总线                    */
        
        return  (-1);
    
    } else {
        
        *pucData = (unsigned char)rIICDS;                               /*  接收数据                    */
        return  (0);
    }
}
/*********************************************************************************************************
** Function name:           __i2cBusIsr
** Descriptions:            I2C 总线中断服务程序
** input parameters:        NONE
** output parameters:       NONE
** Returned value:          NONE
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void  __i2cBusIsr (void)
{
    PI2C_BUS        pi2cbusChannel = &__Gi2cbusChannel[0];
    
    INTER_CLR_PNDING(BIT_IIC);                                          /*  清除中断标志                */
    
    OSSemPost(pi2cbusChannel->peventSync);
}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -