找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1961|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

IIC通信程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:300027 發(fā)表于 2018-4-3 10:03 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include "Global.h"

#define SDA                                P3_1       
#define SCL                                P3_0       

#define SET_SDA                        (SDA        = 1)
#define CLR_SDA                        (SDA        = 0)

#define SET_SCL                        (SCL        = 1)
#define CLR_SCL                        (SCL        = 0)

#define SDA_INPUT                {P3M1 &= ~(BIT1);SET_SDA;}
#define SDA_OUTPUT                {P3M1 |= (BIT1);}

#define SCL_INPUT                {P3M1 &= ~(BIT0);SET_SCL;}
#define SCL_OUTPUT                {P3M1 |= (BIT0);}

#define Device_Addr                0xA0
#define DELAN_TIM                30

//------------------------------------------
void DelanNop(u8 Count)
{
        do
        {
                Count--;
        } while (Count != 0);
}

//**********************************
//I2C start signal
//**********************************
void i2cStart(void)
{
        SDA_OUTPUT;                                        //set SDA as output
        SCL_OUTPUT;                                        //set SCL as output
        SET_SDA; DelanNop(DELAN_TIM);                //SDA=1
        SET_SCL; DelanNop(DELAN_TIM);                //SCL=1
        CLR_SDA; DelanNop(DELAN_TIM);                //SDA=0
        CLR_SCL; DelanNop(DELAN_TIM);                //SCL=0
}

//**********************************
//I2C stop signal
//**********************************
void i2cStop(void)
{
        SDA_OUTPUT;                        //set SDA as output
        SCL_OUTPUT;                        //set SCL as output
        CLR_SDA; DelanNop(DELAN_TIM);//SDA=0
        SET_SCL; DelanNop(DELAN_TIM);//SCL=1
        SET_SDA; DelanNop(DELAN_TIM);//SDA=1
        CLR_SCL; DelanNop(DELAN_TIM);//SCL=0

}
//**********************************
//ACK(0) signal
//**********************************
void Ack(void)
{
        SDA_OUTPUT;//set SDA as output
        SCL_OUTPUT;//set SCL as output
        CLR_SDA; DelanNop(DELAN_TIM);//SDA=0
        SET_SCL; DelanNop(DELAN_TIM);//SCL=1
        CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
        SET_SDA; DelanNop(DELAN_TIM);//SDA=1
}
//**********************************
//NoAck(1) signal
//**********************************
void NoAck(void)
{
        SDA_OUTPUT;//set SDA as output
        SCL_OUTPUT;//set SCL as output
        SET_SDA; DelanNop(DELAN_TIM);//SDA=1
        SET_SCL; DelanNop(DELAN_TIM);//SCL=1
        CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
}
//**********************************
//master check ack signal
//0:ACK complete1 no complete
//**********************************
bl TestAck(void)
{
        bl Ack_Bit;                //define ack bit
        SDA_INPUT;                //set SDA as input
        SCL_OUTPUT;                //set SCL as output
        //SDA=1;_delay(30);//SDA=1
        SET_SCL;         DelanNop(DELAN_TIM);//SCL=1
        Ack_Bit = SDA; DelanNop(DELAN_TIM);//read back ACK
        CLR_SCL; DelanNop(DELAN_TIM);//SCL=0
        SDA_OUTPUT;
        Ack_Bit = 1;
        if (!Ack_Bit)
        {
                DelanNop(DELAN_TIM);
                DelanNop(DELAN_TIM);
                Ack_Bit = 1;
        }
        return Ack_Bit;
}
//**********************************
//master write data
//**********************************
void i2cWrite(u8 Data)
{
        u8 count = 8;
        SDA_OUTPUT;                                        //set SDA as output
        SCL_OUTPUT;                                        //set SCL as output
        while (count--)
        {
                SDA = (bl)(Data & 0x80);        //bit7 sent to SDA pin
                DelanNop(DELAN_TIM);
                SET_SCL; DelanNop(DELAN_TIM);        //sent clock
                CLR_SCL; DelanNop(DELAN_TIM);
                Data = Data << 1;                //Data shift left 1 bit
        }
}
//**********************************
//master read data
//**********************************
u8 i2cRead(void)
{
        u8 count = 8, Data;
        SDA_INPUT;//set SDA as input
        SCL_OUTPUT;//set SCL as output
        do
        {
                SET_SCL; DelanNop(DELAN_TIM);
                Data = Data << 1;                                //Data shift left 1 bit
                if (SDA){ Data |= BIT0; }
                CLR_SCL;
                DelanNop(DELAN_TIM);
                count--;
        } while (count);
        return(Data);
}
//---------------------------------------------------------------------------------IIC 發(fā)送數(shù)據(jù)
void SendI2cData(void)
{
        u8 I;
        i2cStart();
        i2cWrite(Device_Addr);
        TestAck();
        DelanNop(DELAN_TIM);
        for (I = 0; I < sizeof(SendBuf); I++)
        {
                i2cWrite(SendBuf[I]);
                TestAck();
        }
        i2cStop();
}

//---------------------------------------------------------------------------------IIC 接收數(shù)據(jù)
bl FlagBuzOk;

void ReceveI2cData(void)
{
        u8 I, CKM;

        i2cStart();
        i2cWrite(Device_Addr + 1);
        TestAck();
        DelanNop(DELAN_TIM);
        for (I = 0; I < sizeof(ReadBuf); I++)
        {
                ReadBuf[I] = i2cRead();
                Ack();
        }
        NoAck();
        i2cStop();


}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表