找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1647|回复: 0
打印 上一主题 下一主题
收起左侧

IIC通信程序

[复制链接]
跳转到指定楼层
楼主
ID:300027 发表于 2018-4-3 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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 发送数据
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 接收数据
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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表