/*==============================================================================
* 文 件 名: F:\wmf\wmfc\Mylib\I2C\I2CDeriver.c
* 功能描述: I2C驱动文件
* 调用方法:
* 处理过程:
* 注 意:
* 完成日期 作 者 说 明
* 2014-02-26 吴明付
*==============================================================================*/
/*************************使用方法如下*******************************************
1、使用时需注意CLK及DATA的变化后电平需要维持在5us以上
2、建立"I2C_HardDeriver.c"
3、建立"I2C_HardDeriver.h"
4、在需要使用I2C驱动的文件中包含"I2C_HardDeriver.h"及"I2CDeriver.h"
5、在初始化时调用初始化函数"f_I2CDeriverInit(I2CDeriver,I2C_DeriverFuc,I2C_HardDeriver)"
6、例:文件"I2C_HardDeriver.h"
**************************以下为"I2C_HardDeriver.h"文件内容********************
#ifndef _I2C_HARD_DEIVER_H_
#define _I2C_HARD_DEIVER_H_
void (*ClkOut)(MyLibbool Level);
void (*DataOut)(MyLibbool Level);
uchar (*DataIn)(void);
void (*SetDataOut)(void);
void (*SetDataIn)(void);
void (*FreeDog)(void);
void (*Delay)(void);
extern _CONST_ I2C_HARD_DERIVER I2C_HardDeriver;
#endif
7、例:文件"I2C_HardDeriver.c"
**************************以下为"I2C_HardDeriver.c"文件内容*********************
#include "MyDataType.h"
#include "I2CDeriver.h"
#include "I2C_HardDeriver.h"
void (*ClkOut)(MyLibbool Level)
{
}
void (*DataOut)(MyLibbool Level)
{
}
uchar (*DataIn)(void)
{
}
void (*SetDataOut)(void)
{
}
void (*SetDataIn)(void)
{
}
void (*FreeDog)(void)
{
}
void (*Delay)(void)
{
}
_CONST_ I2C_HARD_DERIVER I2C_HardDeriver
={
ClkOut,
DataOut,
DataIn,
SetDataOut,
SetDataIn,
FreeDog,
Delay,
};
********************************************************************************/
#include "MyDataType.h"
#include "I2CDeriver.h"
void f_I2CWriteStop(I2C_DERIVER* pDeriver);
void f_I2CWriteStart(I2C_DERIVER* pDeriver);
void f_I2CWriteAck(I2C_DERIVER* pDeriver,I2C_ACK_TYPE ACK);
MyLibbool f_I2CReadAck(I2C_DERIVER* pDeriver);
ubyte8 f_I2CRead8Bit(I2C_DERIVER* pDeriver);
void f_I2CWrite8Bit(I2C_DERIVER* pDeriver,ubyte8 Data);
MyLibbool f_I2CWriteSlaveAdd(I2C_DERIVER* pDeriver,ubyte8 SlaveAdd);
MyLibbool f_I2CWriteByte(I2C_DERIVER* pDeriver,ubyte8 SlaveAdd,ubyte8 DataAdd,ubyte8 Data);
MyLibbool f_I2CReadByte(I2C_DERIVER* pDeriver,ubyte8 SlaveAdd,ubyte8 DataAdd,ubyte8 *pData);
MyLibbool f_I2CWriteMoreByte(I2C_DERIVER* pDeriver,ubyte8 SlaveAdd,ubyte8 DataAdd,ubyte8 *pData,uint Length);
MyLibbool f_I2CReadMoreByte(I2C_DERIVER* pDeriver,ubyte8 SlaveAdd,ubyte8 DataAdd,ubyte8 *pData,uint Length);
#if (MY_LIB_VERSION < 20160405) || !defined(USE_PRIVATE_I2C_DERIVER_FUC)
_CONST_ I2C_DERIVER_FUC I2C_DeriverFuc
={
f_I2CWriteStart,
f_I2CWriteStop,
f_I2CWriteAck,
f_I2CReadAck,
f_I2CRead8Bit,
f_I2CWrite8Bit,
f_I2CWriteByte,
f_I2CReadByte,
f_I2CWriteMoreByte,
f_I2CReadMoreByte
};
#endif
/*==============================================================================
* 函 数 名: void f_I2CDeriverInit(I2C_DERIVER *pI2CDeriver,I2C_DERIVER_FUC const* pDeriverFuc,I2C_HARD_DERIVER const* pHardDeriver)
* 功能描述: I2C驱动创建初始化
* 调用方法: f_I2CDeriverInit(pI2CDeriver,pDeriverFuc,pHardDeriver);
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 处理过程:
* 注 意:
* 完成日期: 作 者 说 明
* 2014-02-26 吴明付
*==============================================================================*/
void f_I2CDeriverInit(I2C_DERIVER *pI2CDeriver,I2C_DERIVER_FUC _P_CONST_ pDeriverFuc,I2C_HARD_DERIVER _P_CONST_ pHardDeriver)
{
pI2CDeriver->pDeriverFuc = pDeriverFuc;
pI2CDeriver->pHardDeriver = pHardDeriver;
}
//#define pI2CDeriver ((I2C_DERIVER *)pDeriver)
/*==============================================================================
* 函 数 名: void f_I2CWriteStop(void* pDeriver)
* 功能描述: 在I2C总线下产生停止条件
* 调用方法: f_I2CWriteStop()
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 处理过程: 在CLK为高电平的条件下DATA由低到高,此时总线变为忙状态
* 注 意:重复的产生起始条件与起始条件是一样的,起始条件后而没有终止条件总线会一直处于忙状态
* 终止条件后CLK保持为高
* 完成日期: 作 者 说 明
* 2014-02-27 吴明付
*==============================================================================*/
void f_I2CWriteStop(I2C_DERIVER* pI2CDeriver)
{
//I2C_DERIVER *pI2CDeriver;
//pI2CDeriver = (I2C_DERIVER *)pDeriver;
pI2CDeriver->pHardDeriver->DataOut(ML_FALSE);
pI2CDeriver->pHardDeriver->SetDataOut();
pI2CDeriver->pHardDeriver->ClkOut(ML_TRUE);
pI2CDeriver->pHardDeriver->DataOut(ML_TRUE);
}
/*==============================================================================
* 函 数 名: void f_I2CWriteStart(void* pDeriver)
* 功能描述: 在I2C总线上产生一个起始条件
* 调用方法: f_I2CWriteStart()
* 调用函数:
* 全局变量:
* 输 入:
* 返 回:
* 处理过程: 在CLK为高时,DATA由低到高,此时总线被释放
* 注 意:起始条件后CLK保持为低
* 完成日期: 作 者 说 明
* 2014-02-27 吴明付
*==============================================================================*/
void f_I2CWriteStart(I2C_DERIVER* pI2CDeriver)
{
//I2C_DERIVER *pI2CDeriver;
//pI2CDeriver = (I2C_DERIVER *)pDeriver;
pI2CDeriver->pHardDeriver->ClkOut(ML_TRUE);
pI2CDeriver->pHardDeriver->DataOut(ML_TRUE);
pI2CDeriver->pHardDeriver->SetDataOut();
pI2CDeriver->pHardDeriver->DataOut(ML_FALSE);
pI2CDeriver->pHardDeriver->ClkOut(ML_FALSE);
}
/*==============================================================================
* 函 数 名: void f_I2CWriteAck(void *pDeriver,I2C_ACK_TYPE ACK)
* 功能描述: 在I2C总线上输出应答信号
* 调用方法: f_I2CWriteAck(pDeriver,ACK);
* 调用函数:
* 全局变量:
* 输 入: pDeriver 驱动
* ACK 应答类型
* 返 回:
* 处理过程:
* 注 意:应答结束后CLK保持为高
* 完成日期: 作 者 说 明
* 2014-02-27 吴明付
*==============================================================================*/
void f_I2CWriteAck(I2C_DERIVER* pI2CDeriver,I2C_ACK_TYPE ACK)
{
//I2C_DERIVER *pI2CDeriver;
//pI2CDeriver = (I2C_DERIVER *)pDeriver;
if(I2C_ACK == ACK)//应答数据线输出低电平
pI2CDeriver->pHardDeriver->DataOut(ML_FALSE);
else//应答非数据线输出高电平
pI2CDeriver->pHardDeriver->DataOut(ML_TRUE);
pI2CDeriver->pHardDeriver->SetDataOut();
pI2CDeriver->pHardDeriver->ClkOut(ML_TRUE);
pI2CDeriver->pHardDeriver->ClkOut(ML_FALSE);
}
/*==============================================================================
* 函 数 名: MyLibbool f_I2CReadAck(void *pDeriver)
* 功能描述: 读I2C总线的应答状态
* 调用方法: f_I2CReadAck(pDeriver)
* 调用函数:
* 全局变量:
* 输 入: pDeriver 驱动
* 返 回: 读到应答信号返回ture,否则返回false
* 处理过程:
* 注 意:读取应答后CLK保持高电平状态
* 完成日期: 作 者 说 明
* 2014-02-27 吴明付
*==============================================================================*/
MyLibbool f_I2CReadAck(I2C_DERIVER* pI2CDeriver)
{
uchar i;
MyLibbool iTempBool;
//I2C_DERIVER *pI2CDeriver;
//pI2CDeriver = (I2C_DERIVER *)pDeriver;
pI2CDeriver->pHardDeriver->ClkOut(ML_FALSE);
pI2CDeriver->pHardDeriver->SetDataIn();
pI2CDeriver->pHardDeriver->ClkOut(ML_TRUE);
i = 0;
iTempBool = ML_TRUE;
while(pI2CDeriver->pHardDeriver->DataIn())
{
pI2CDeriver->pHardDeriver->Delay();
i ++;
if(i > MAX_ACK_READ_CNT)
{
iTempBool = ML_FALSE;
break;
}
};
pI2CDeriver->pHardDeriver->ClkOut(ML_FALSE);
return iTempBool;
}
/*==============================================================================
* 函 数 名: ubyte8 f_I2CRead8Bit(void* pDeriver)
* 功能描述: 读出1字节数据
* 调用方法: f_I2CRead8Bit()
* 调用函数:
* 全局变量:
* 输 入: pDeriver 驱动
* 返 回: 读到的数据
* 处理过程:
* 注 意:
* 完成日期: 作 者 说 明
* 2014-02-27 吴明付
*==============================================================================*/
ubyte8 f_I2C