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

📄 i2cdev.c

📁 hreadx实时嵌入式操作系统源代码,ARM移植. threadx是一个很好的多任务实时嵌入式操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
        OSSemPost(pi2cbusChannel->peventLock);                          /*  释放设备使用权              */
        return  (0);                                                    /*  总线错误                    */
    }
    
    for (i = 0; i < uiMaxBytes - 1; i++) {                              /*  连续接收数据                */
        __i2cRecvByte(pi2cdevDevice, (unsigned char *)&pcBuffer[i]);
    }
    iIsOk = __i2cRecvByteLast(pi2cdevDevice, 
                              (unsigned char *)&pcBuffer[i]);           /*  接收最后一个字节            */
    if (iIsOk) {
        OSSemPost(pi2cbusChannel->peventLock);                          /*  释放设备使用权              */
        return  (0);                                                    /*  总线错误                    */
    }
    
    __i2cStopBus(pi2cdevDevice, __I2C_READ);                            /*  结束总线                    */
    
    OSSemPost(pi2cbusChannel->peventLock);                              /*  释放设备使用权              */
    
    return  (uiMaxBytes);
}
/*********************************************************************************************************
** Function name:           i2cDevWrite
** Descriptions:            以主方式向 I2C 接口写入数据
** input parameters:        pi2cdevDevice   设备控制块
**                          pcBuffer        缓冲区
**                          iNBytes         字节数
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  i2cDevWrite (PI2C_DEV       pi2cdevDevice, 
                  char          *pcBuffer, 
                  int            iNBytes)
{
    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);                                                /*  总线错误                    */
        }
    }
    
    for (i = 0; i < iNBytes; i++) {                                     /*  连续发送数据                */
        iIsOk = __i2cSendByte(pi2cdevDevice, 
                             (unsigned char)pcBuffer[i]);
        if (iIsOk) {
            OSSemPost(pi2cbusChannel->peventLock);                      /*  释放总线使用权              */
            return  (0);                                                /*  总线错误                    */
        }
    }
    
    __i2cStopBus(pi2cdevDevice, __I2C_WRITE);                           /*  结束总线                    */
    
    if (pi2cdevDevice->usWaitTime) {
        OSTimeDly(pi2cdevDevice->usWaitTime);                           /*  写后等待                    */
    }
    
    OSSemPost(pi2cbusChannel->peventLock);                              /*  释放设备使用权              */
    
    return  (iNBytes);
}
/*********************************************************************************************************
** Function name:           i2cDevIoctl
** Descriptions:            以主方式向 I2C 接口写入数据
** input parameters:        pi2cdevDevice   设备控制块
**                          pcBuffer        缓冲区
**                          iNBytes         字节数
** output parameters:       NONE
** Returned value:          -1 表示错误   0 表示正确
** Created by:              Hanhui
** Created Date:            2007/12/05
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**--------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
int  i2cDevIoctl (PI2C_DEV       pi2cdevDevice,
                  int            iCommand,
                  int            iArg)
{
    I2C_SUB_ADDR    *pi2csubaddrInfo = (I2C_SUB_ADDR *)iArg;
    
    switch (iCommand) {
    
    case I2C_SET_ADDR:
        pi2cdevDevice->ucDevAddr = (unsigned char)iArg;
        break;
        
    case I2C_SET_BPS:
        pi2cdevDevice->iBps      = iArg;
        pi2cdevDevice->iBpsParam = ((PCLK / 512) / iArg) & 0xF;         /*  频率系数                    */
        break;
        
    case I2C_SET_WAIT_TICKS:
        pi2cdevDevice->usWaitTime = (unsigned short)iArg;
        break;
        
    case I2C_SET_SUB_ADDR:
        if (!pi2csubaddrInfo) {
            return  (-1);
        }
        if (pi2csubaddrInfo->ucSubAddrNum >= I2C_MAX_SUBADDRS) {
            return  (-1);
        }
        memcpy(pi2cdevDevice->ucSubAddrArry,
               pi2csubaddrInfo->ucSubAddrArry, 
               pi2csubaddrInfo->ucSubAddrNum);
        pi2cdevDevice->ucSubAddrNum = pi2csubaddrInfo->ucSubAddrNum;
        break;
        
    case I2C_GET_ADDR:                                                  /*  获得子地址                  */
        if (!iArg) {
            return  (-1);
        }
        (*(unsigned short *)iArg) = pi2cdevDevice->ucDevAddr;
        break;
        
    case I2C_GET_BPS:
        if (!iArg) {
            return  (-1);
        }
        *(unsigned int *)iArg = pi2cdevDevice->iBps;
        break;
        
    case I2C_GET_WAIT_TICKS:
        if (!iArg) {
            return  (-1);
        }
        (*(unsigned short *)iArg) = pi2cdevDevice->usWaitTime;
        break;
        
    case I2C_GET_SUB_ADDR:                                              /*  获取当前子地址              */
        if (!pi2csubaddrInfo) {
            return  (-1);
        }
        memcpy(pi2csubaddrInfo->ucSubAddrArry, 
               pi2cdevDevice->ucSubAddrArry,
               pi2cdevDevice->ucSubAddrNum);
        pi2csubaddrInfo->ucSubAddrNum = pi2cdevDevice->ucSubAddrNum;
        break;
    }
    
    return  (0);
}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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