模拟I2C通信

    技术2024-04-11  84

    IIC

    -开始条件

    IIC的起始条件为:在SCL高电平期间SDA由高电平变为低电平。 代码如下:

    void IIC_Start(void) { IIC_SCL=1; IIC_SDA=1; delay(); IIC_SDA=0; delay(); IIC_SCL=0; }

    -停止条件

    IIC的停止条件为:SCL高电平期间SDA由低电平变为高电平。 代码如下:

    void IIC_Stop(void) { IIC_SCL=1; delay(); IIC_SDA=0; delay(); IIC_SDA=1; }

    -发出应答

    代码如下:

    void PUT_ACK(unsigned char ACK) { IIC_SCL=0; if(ACK) IIC_SDA=1; //非应答 else IIC_SDA=0; //应答 delay(); IIC_SCL=1; delay(); IIC_SCL=0; }

    - 得到应答

    代码如下:

    unsigned char GET_ACK(void) { unsigned char ACK; IIC_SCL=0; delay(); IIC_SDA=1; //开漏输出 delay(); IIC_SCL=1; if(Read_SDA) ACK=1; //非应答 else ACK=0; //应答 delay(); IIC_SCL=0; return ACK; }

    - IIC写一字节

    代码如下:

    void IIC_Write_byte(unsigned char data) { unsigned char i; for(i=0;i<8;i++) { IIC_SCL=0; if(data&0x80) IIC_SDA=1; else IIC_SDA=0; data<<=1; delay(); IIC_SCL=1; delay(); } IIC_SCL=0; delay(); GET_ACK(); }

    - IIC读一字节

    代码如下:

    unsigned char IIC_Read_byte(void) { unsigned char i,data=0; IIC_SCL=0; delay(); IIC_SDA=1delay(); for(i=0;i<8;i++) { IIC_SCL=1; data<<=1; if(Read_SDA) data|=0x01; else data&=0xfe; delay(); IIC_SCL=0; } PUT_ACK(ACK); return data; }
    Processed: 0.021, SQL: 9