#define _I2C_Define
#include "include.h"
BYTE NoACK;
#ifdef HW_IIC_INCLUDE
//=================================================================
void I2CNop(void)
{
unsigned char i;
for (i = 0; i < 50; i++)
;
}
void I2CStart(BYTE Mode, BYTE DevAddr)
{
rIICDS = DevAddr;
rIICCON = 0xAF; //enable ACK,interrupt
rIICSTAT = (Mode << 6) | 0x30;
while(!(rIICCON & MASK_BIT(4)))
; //wait until devaddr send finished
}
void I2CStop(void)
{
rIICSTAT &= ~MASK_BIT(5);
rIICCON &= ~MASK_BIT(4);
}
BYTE I2CWaitACK()
{
NoACK = rIICSTAT & MASK_BIT(0);
return NoACK;
}
void I2CSendOneByte(BYTE ByteData)
{
rIICDS = ByteData;
rIICCON &= ~MASK_BIT(4);
while(!(rIICCON & MASK_BIT(4)))
; //wait until send byte finished
}
BYTE I2CReceiveOneByte(BYTE LastBit)
{
if (LastBit)
rIICCON = 0x2F;
else
rIICCON = 0xAF;
while(!(rIICCON & MASK_BIT(4)))
; //wait until receive one byte
return rIICDS;
}
void I2C_Write(BYTE DevAddr, BYTE SubAddr, BYTE *DataPstr, BYTE DataLength)
{
#define IICRETRYMAX 3
BYTE *CurrDataPstr, CurrLength, I2CRetryTimes;
I2CRetryTimes = 0;
do {
NoACK = 0x0;
I2CRetryTimes++;
CurrDataPstr = DataPstr;
CurrLength = DataLength;
I2CStart(MASTRT, DevAddr);
I2CSendOneByte(SubAddr);
while(CurrLength != 0)
{
I2CSendOneByte(*CurrDataPstr);
CurrDataPstr++;
CurrLength--;
}
I2CStop();
I2CNop();
I2CStart(MASTRT, DevAddr);
I2CWaitACK();
I2CStop();
}while(I2CRetryTimes < IICRETRYMAX && NoACK != 0);
}
void I2C_Read(BYTE DevAddr, BYTE SubAddr, BYTE *DataPstr, BYTE DataLength)
{
BYTE *CurrDataPstr, CurrLength;
CurrDataPstr = DataPstr;
CurrLength = DataLength;
I2CStart(MASTRT, DevAddr);
I2CSendOneByte(SubAddr);
I2CStart(MASTRR, DevAddr);
while(CurrLength != 1)
{
*CurrDataPstr = I2CReceiveOneByte(0);
CurrDataPstr++;
CurrLength--;
}
*CurrDataPstr = I2CReceiveOneByte(1);
I2CStop();
}
#endif