/***************************************************************/
/***** Description : I2c Transmeter *****/
/***** Modtime: 3/11/28 19:50 *****/
/***** Revision: 01 *****/
/***** Programmer : Vicle wang *****/
/***************************************************************/
#include "i2c.h"
/*=============================================================*/
/* Function : I2C Delay */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2cDelay(void)
{
BYTE i;
for(i=0; i<10; i++) nop();
}
/*=============================================================*/
/* Function : I2C Delay */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2cByteDelay(void)
{
BYTE i;
for(i=0; i<20; i++) nop();
}
/*=============================================================*/
/* Function : Set I2C Clk */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2cSetClk(BOOL fgHigh)
{
PI2C_CLK = fgHigh;
PI2C_CLK_DIR = SV_OUT;
vI2cDelay();
}
/*=============================================================*/
/* Function : vSetI2cDataIn */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vSetI2cClkIn(void)
{
PI2C_CLK_DIR = SV_IN;
}
/*=============================================================*/
/* Function : fgI2cGetData */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
BOOL fgI2cGetClk(void)
{
BOOL fgRet;
PI2C_CLK_DIR = SV_IN;
fgRet = PI2C_CLK;
return fgRet;
}
/*=============================================================*/
/* Function : Set I2C Data */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2cSetDat(BOOL fgHigh)
{
PI2C_DAT = fgHigh;
PI2C_DAT_DIR = SV_OUT;
}
/*=============================================================*/
/* Function : Set I2c Data Pin For Input */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vSetI2cDataIn(void)
{
PI2C_DAT_DIR = SV_IN;
}
/*=============================================================*/
/* Function : fgI2cGetData */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
BOOL fgI2cGetData(void)
{
BOOL fgRet;
PI2C_DAT_DIR = SV_IN;
fgRet = PI2C_DAT;
return fgRet;
}
/*=============================================================*/
/* Function : I2C Send start condition */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2cStart(void)
{
vI2cSetDat(SV_HIGH);
vI2cDelay();
vI2cDelay();
vI2cSetClk(SV_HIGH);
vI2cDelay();
vI2cDelay();
vI2cDelay();
vI2cSetDat(SV_LOW);
vI2cDelay();
vI2cDelay();
vI2cDelay();
}
/*=============================================================*/
/* Function : I2C Send stop condition */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
void vI2CStop(void)
{
vI2cSetDat(SV_LOW);
vI2cDelay();
vI2cDelay();
//Stop
vI2cSetClk(SV_HIGH);
vI2cDelay();
vI2cDelay();
vI2cDelay();
vI2cSetDat(SV_HIGH);
vI2cDelay();
vI2cDelay();
//Relase
vI2cSetClk(SV_HIGH);
vI2cSetDat(SV_HIGH);
}
/*=============================================================*/
/* Function : I2C Send BYTE */
/* Description : */
/* Parameter : Data */
/* Return : Success = 1 ,Failed = 0 */
/*=============================================================*/
BOOL fgI2cWriteByte(BYTE bData)
{
BYTE bBitMask = 0x80; //MSB first
while(bBitMask)
{
//Set Data
vI2cSetClk(SV_LOW); //Ready For Set data
vI2cSetDat((bData&bBitMask)?SV_HIGH:SV_LOW);
//Data Out
vI2cSetClk(SV_HIGH);
bBitMask >>= 1; // For Next bit & timing delay
}
vI2cSetClk(SV_LOW);
vI2cDelay();
//I2c Stretch Check, Not Essential
vI2cSetClk(SV_HIGH);
bBitMask = ACK_RETRY_COUNT; // Set timeout for wait Slave Deal With
vSetI2cClkIn();
while((fgI2cGetClk()== SV_LOW)&&(bBitMask--));
//while(fgI2cGetClk()== SV_LOW);
//Relase data Line For Wait ACK
vI2cSetDat(SV_HIGH);
vSetI2cDataIn();
//vI2cSetClk(SV_HIGH);
if(bBitMask>0)
{
bBitMask = ACK_RETRY_COUNT; // Set timeout for wait ACK
while(fgI2cGetData()&&(bBitMask--)); // wait for ACK
}
//Clock Line Hold Low For Wait Procress
vI2cSetClk(SV_LOW);
//Wait For Slave Procress
vI2cByteDelay();
return(bBitMask);
}
/*=============================================================*/
/* Function : I2C Read BYTE */
/* Description : */
/* Parameter : */
/* Return : */
/*=============================================================*/
BOOL fgI2cReadByte(BYTE *bValue, BOOL fgSetAck)
{
BYTE bBitMask = 0x80; //MSB first
*bValue = 0;
//vI2cSetDat(SV_HIGH);
vSetI2cDataIn();
while(bBitMask)
{
vI2cSetClk(SV_LOW); // ready for get bit
vI2cDelay();
vI2cSetClk(SV_HIGH); // Ready For read data
if(fgI2cGetData()) (*bValue)|= bBitMask; // Get one bit
bBitMask >>= 1;