📄 i2cdev.c
字号:
/****************************************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 + -