📄 i2clib.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 + -