i2c

#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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值