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

📄 i2cdev.c

📁 hreadx实时嵌入式操作系统源代码,ARM移植. threadx是一个很好的多任务实时嵌入式操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               i2cDev.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:             Hanhui
** Modified date:           2007-12-19
** Version:                 1.0.1
** Descriptions:            2440 I2C 中断设置的优先级与中断号相同
**
*********************************************************************************************************/
#include "config.h"
#include "i2cCfg.h"
#include "i2cBus.h"
#include "i2cDev.h"
#include "i2cDrv.h"
/*********************************************************************************************************
  全局变量声明
*********************************************************************************************************/
extern  I2C_BUS         __Gi2cbusChannel[I2C_MAX_CHANNEL];              /*  I2C 物理控制器通道定义      */
/*********************************************************************************************************
  函数声明
*********************************************************************************************************/
void  __i2cInit(void);                                                  /*  I2C 初始化                  */
void  __i2cBusIsr(void);                                                /*  I2C 中断函数                */
/*********************************************************************************************************
  i2c 库函数声明
*********************************************************************************************************/
int  __i2cStartBus(PI2C_DEV  pi2cdevDevice, unsigned char  ucReadOrWrite);
int  __i2cStopBus( PI2C_DEV  pi2cdevDevice, unsigned char  ucReadOrWrite);
int  __i2cSendByte(PI2C_DEV  pi2cdevDevice, unsigned char  ucData);
int  __i2cRecvByte(PI2C_DEV  pi2cdevDevice, unsigned char  *pucData);
int  __i2cRecvByteLast (PI2C_DEV  pi2cdevDevice, unsigned char  *pucData);
/*********************************************************************************************************
** Function name:           i2cDevOpen
** Descriptions:            打开指定 I2C 总线上的一个设备
** input parameters:        pi2cdevDevice   设备控制块
**                          uiChannel       总线通道号
**                          ucDevAddr       器件地址
**                          iBps            总线速率
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  i2cDevOpen (PI2C_DEV       pi2cdevDevice,
                 unsigned int   uiChannel, 
                 unsigned char  ucDevAddr,
                 int            iBps)
{
    PI2C_BUS        pi2cbusChannel = &__Gi2cbusChannel[uiChannel];
    
    if (uiChannel >= I2C_MAX_CHANNEL) {
        return  (-1);
    }
    
    if (!pi2cdevDevice) {
        return  (-1);
    }

    pi2cdevDevice->pi2cbusChannel = pi2cbusChannel;
    pi2cdevDevice->ucDevAddr      = ucDevAddr;
    pi2cdevDevice->ucSubAddrNum   = 0;
    pi2cdevDevice->usWaitTime     = 0;
    pi2cdevDevice->iBps           = iBps;
    pi2cdevDevice->iBpsParam      = ((PCLK / 512) / iBps) & 0xF;        /*  频率系数                    */
    
    pi2cbusChannel->uiOpenNum++;
    if (pi2cbusChannel->uiOpenNum == 1) {                               /*  第一次被打开                */
    
        __i2cInit();                                                    /*  初始化 I2C                  */
        
        vicIrqSet(VIC_CHANNEL_IIC, VIC_CHANNEL_IIC, 
                  (unsigned long)__i2cBusIsr);                          /*  中断服务程序                */
    }
    
    return  (0);
}
/*********************************************************************************************************
** Function name:           i2cDevClose
** Descriptions:            关闭指定 I2C 总线上的一个设备
** input parameters:        pi2cdevDevice   设备控制块
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  i2cDevClose (PI2C_DEV  pi2cdevDevice)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    
    if (!pi2cdevDevice) {
        return  (-1);
    }
    
    if (pi2cbusChannel->uiOpenNum == 1) {
        pi2cbusChannel->uiOpenNum =  0;
        vicIrqFree(VIC_CHANNEL_IIC);                                    /*  关闭总线中断                */
    } else {
        pi2cbusChannel->uiOpenNum--;
    }
    
    return  (0);
}
/*********************************************************************************************************
** Function name:           i2cDevRead
** Descriptions:            以主方式从 I2C 接口读取数据
** input parameters:        pi2cdevDevice   设备控制块
**                          pcBuffer        缓冲区
**                          uiMaxBytes      读取字节数
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  i2cDevRead (PI2C_DEV       pi2cdevDevice, 
                 char          *pcBuffer, 
                 unsigned int   uiMaxBytes)
{
    PI2C_BUS        pi2cbusChannel = pi2cdevDevice->pi2cbusChannel;
    INT8U           ucError;
    
    int             iIsOk;
    int             i;
    
    
    OSSemPend(pi2cbusChannel->peventLock, 0, &ucError);                 /*  等待总线使用权              */
    
    iIsOk = __i2cStartBus(pi2cdevDevice, __I2C_WRITE);                  /*  以主写模式启动总线          */
    if (iIsOk) {
        OSSemPost(pi2cbusChannel->peventLock);                          /*  释放总线使用权              */
        return  (0);                                                    /*  总线错误                    */
    }
    
    for (i = 0; i < pi2cdevDevice->ucSubAddrNum; i++) {                 /*  连续发送子地址              */
        iIsOk = __i2cSendByte(pi2cdevDevice, 
                              pi2cdevDevice->ucSubAddrArry[i]);         /*  连续发送子地址              */
        if (iIsOk) {
            OSSemPost(pi2cbusChannel->peventLock);                      /*  释放总线使用权              */
            return  (0);                                                /*  总线错误                    */
        }
    }
    
    iIsOk = __i2cStartBus(pi2cdevDevice, __I2C_READ);                   /*  以主收模式重新启动总线      */
    if (iIsOk) {

⌨️ 快捷键说明

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