久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2002|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产欧美性成人精品午夜 | 999久久久国产精品 欧美成人h版在线观看 | 国产一二三区在线 | 欧美久久久久久久久 | 精品乱子伦一区二区三区 | 亚洲va国产日韩欧美精品色婷婷 | 国产精品成人国产乱一区 | 香蕉视频91| 人人艹人人 | 亚洲经典一区 | 精品在线看 | 国产小视频在线观看 | 97免费视频在线观看 | 日韩在线不卡视频 | 精品91久久| 人操人免费视频 | h片在线观看网站 | 黄色一级大片在线免费看产 | av中文字幕在线观看 | 成人在线免费电影 | 国产在线拍偷自揄拍视频 | 日韩午夜影院 | 天天干成人网 | 一级毛片视频 | 日本三级全黄三级三级三级口周 | 久久99久久99精品免视看婷婷 | 久久精品久久久久久 | 欧美精品一区在线 | 久久国产精品免费一区二区三区 | 亚洲 自拍 另类 欧美 丝袜 | 亚洲一区欧美 | 欧美激情精品久久久久 | 国产九九九 | 国产小视频自拍 | 免费在线性爱视频 | 欧美黄色绿像 | 中文字字幕一区二区三区四区五区 | 国产精品视频在线免费观看 | 免费在线观看成年人视频 | 黄色毛片在线观看 | 又爽又黄axxx片免费观看 |