#ifndef IIC_H
#define IIC_H
#include <CommonType.h>
#include <Delay.h>
#define IIC_BITSEQHL 0
#define IIC_BITSEQLH 1
typedef void (*PFNIICSetPin)(BIT btValue);
typedef BIT (*PFNIICGetPin)(void);
typedef struct tagFNIIC
{
BIT btIIC_LL; /*正逻辑或负逻辑*/
BIT btIIC_HH;
INT8U nIICBitSeq;
PFNIICSetPin pfnSetIICSDA;
PFNIICGetPin pfnGetIICSDA;
PFNIICSetPin pfnSetIICSCL;
PFNIICGetPin pfnGetIICSCL;
}FNIIC, *PFNIIC;
/*****************函数声明*****************/
void IICStart(PFNIIC pfnIIC);
void IICStop(PFNIIC pfnIIC);
void IICSendBit(PFNIIC pfnIIC, BIT btValue);
BOOL IICSendAckBit(PFNIIC pfnIIC, BIT btValue);
BOOL IICReceiveAckBit(PFNIIC pfnIIC, BIT btCompare);
INT8U IICReceiveBits8(PFNIIC pfnIIC, INT8U nBitsNumber);
void IICSendBits8(PFNIIC pfnIIC, INT8U nValue, INT8U nBitsNumber);
BYTE IICReceiveByte(PFNIIC pfnIIC);
void IICSendByte(PFNIIC pfnIIC, BYTE byValue);
#endif /*IIC_H*/
#include <IIC.h>
void IICStart(PFNIIC pfnIIC)
{
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
}
void IICStop(PFNIIC pfnIIC)
{
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
}
BIT IICReceiveBit(PFNIIC pfnIIC)
{
BIT btReturn = 0;
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
btReturn = pfnIIC->pfnGetIICSDA();
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
return btReturn;
}
void IICSendBit(PFNIIC pfnIIC, BIT btValue)
{
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
pfnIIC->pfnSetIICSDA(btValue);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_HH);
pfnIIC->pfnSetIICSCL(pfnIIC->btIIC_LL);
}
BOOL IICSendAckBit(PFNIIC pfnIIC, BIT btValue)
{
INT8U i=0xff;
BIT btRet = 0;
while(i--)
{
IICSendBit(pfnIIC, btValue);
btRet = pfnIIC->pfnGetIICSDA();
if (btValue == btRet)
break;
}
return ((btValue == btRet)?TRUE:FALSE);
}
BOOL IICReceiveAckBit(PFNIIC pfnIIC, BIT btCompare)
{
INT8U i = 0xff;
BIT btRet = 0x00;
pfnIIC->pfnSetIICSDA(pfnIIC->btIIC_HH);
while(i--)
{
btRet = IICReceiveBit(pfnIIC);
if (btCompare == btRet)
break;
}
return ((btRet==btCompare)?TRUE:FALSE);
}
INT8U IICReceiveBits8(PFNIIC pfnIIC, INT8U nBitsNumber)
{
INT8U nResult = 0;
INT8U i = 0;
if (pfnIIC->nIICBitSeq == IIC_BITSEQHL)
{
for (i=0; i<nBitsNumber; i++)
nResult |= (IICReceiveBit(pfnIIC)<<(nBitsNumber-i-1));
}
else if (pfnIIC->nIICBitSeq == IIC_BITSEQLH)
{
for (i=0; i<nBitsNumber; i++)
nResult |= (IICReceiveBit(pfnIIC)<<(i));
}
return nResult;
}
void IICSendBits8(PFNIIC pfnIIC, INT8U nValue, INT8U nBitsNumber)
{
INT8U i = 0;
if (pfnIIC->nIICBitSeq == IIC_BITSEQHL)
{
for (i=0; i<nBitsNumber; i++)
IICSendBit(pfnIIC, TOBIT(nValue>>(nBitsNumber-i-1)));
}
else if (pfnIIC->nIICBitSeq == IIC_BITSEQLH)
{
for (i=0; i<nBitsNumber; i++)
IICSendBit(pfnIIC, TOBIT(nValue>>(i)));
}
}
BYTE IICReceiveByte(PFNIIC pfnIIC)
{
return IICReceiveBits8(pfnIIC, 8);
}
void IICSendByte(PFNIIC pfnIIC, BYTE byValue)
{
IICSendBits8(pfnIIC, byValue, 8);
}