I2C总线驱动

 

//I2C.h

//

#define I2C_SCL=0     ()
#define I2C_SCL=1     ()
#define I2C_SDA=0     ()
#define I2C_SDA=1     ()
#define SCL_I2C_OUT     ()
#define SDA_I2C_OUT     ()
#define SCL_I2C_IN     ()
#define SDA_I2C_IN     ()
#define READ_I2C_SDA     ()
extern void Delay(void);
extern void INIT(void);
extern void START(void);
extern void STOP(void);
extern bool Send_Data(unsigned char add_w,unsigned char *add,unsigned  char *data,unsigned int n);
extern bool Read_Data(unsigned char add_r,unsigned char *data,unsigned int n);
extern bool Send_Byte(unsigned char data);
extern unsigned char Read_Byte(char ack);
extern void Send_Ack(char ack);
extern char Read_Ack(void);

///

//I2C.C

//

void Delay(){//延时
}
void START(){//起始信号
    I2C_SCL=1;
    Delay();
    I2C_SDA=1;
    Delay();
    I2C_SDA=0;
    Delay();
    I2C_SCL=0;
}
void STOP(){//终止信号
    I2C_SCL=1;
    Delay();
    I2C_SDA=0;
    Delay();
    I2C_SDA=1;
    Delay();
    I2C_SCL=0;
    Delay();
    I2C_SDA=0;
    Delay();
}
bool Send_Data(unsigned char add_w,unsigned char *add,unsigned  char *data,unsigned int n){//上层调用发送数据接口
    unsigned int i=0,temp=n;
    SCL_I2C_OUT;
    SDA_I2C_OUT;
    START();
    if(!Send_Byte(add_w)){
        goto Send_Data_exit;
    }
    for(;n>0;n--){
        if(!Send_Byte(add[i]))break;
        if(!Send_Byte(data[i++]))break;
    }
    Send_Data_exit:
    STOP();
    if((n==0)&&(i==temp)){
        return 1;
    }else{
        return 0;
    }
}
bool Read_Data(unsigned char add_r,unsigned char *data,unsigned int n){//上层调用接收数据接口
    unsigned int i=0;
    SCL_I2C_OUT;
    SDA_I2C_OUT;
    START();
    if(!Send_Byte(add_r)){
         goto Read_Data_exit;
    }
    SCL_I2C_IN;
    SDA_I2C_IN;
    for(;n>0;n--){
        data[i++]=Read_Byte(0);
    }
    Read_Data_exit:
    STOP();
    if(n==0){
        return 1;
    }else{
        return 0;
}
bool Send_Byte(unsigned char data){//底层发送一个字节数据
    unsigned char n = 8;
    for(;n>0;n--){
        I2C_SCL=0;
        Delay();
        if((data&0x80)>>7){
            I2C_SDA=1;
        }else{
            I2C_SDA=0;
        }
        data<<=1;
        Delay();
        I2C_SCL=1;
        Delay();
   }
    SCL_I2C_IN;
    SDA_I2C_IN;
    if(Read_Ack()){
        return 0;
    }else{
        return 1;
    }
}
unsigned char Read_Byte(char ack){//底层接收一个字节数据
    unsigned char data;
    unsigned char n = 8;
    I2C_SDA=1;
    Delay();
    for(;n>0;n--){
        I2C_SCL=1;
        Delay();
        if(READ_I2C_SDA==0){
            data=(data=<<1)|0x00;
        }
        else{
            data=(data=<<1)|0x01;
        }
        I2C_SCL=0;
        Delay();
    }
    SCL_I2C_OUT;
    SDA_I2C_OUT;
    Send_Ack(ack);
    return data;
}
void Send_Ack(char ack){//发送应答信号
    I2C_SCL=0;
    Delay();
    if(ack==1){
        I2C_SDA=1;
    }
    else{
        I2C_SDA=0;
    }
    Delay();
    I2C_SCL=1;
    Delay();
}
char Read_Ack(){//接收应答信号
    char ack;
    I2C_SCL=1;
    Delay();
    ack=READ_I2C_SDA;
    I2C_SCL=0;
    Delay();
    return ack;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值