STM32实例源码剖析(IIC协议时序分析)

SDA:串行数据线

SCL:串行时钟

 

空闲状态:

 

起始位:SCL 高 SDA出现下降沿

STM32实例源码剖析(IIC协议时序分析)_第1张图片

 

void IIC_Start(void)

{

    I2C2_SDA_H;  //拉高数据线

    I2C2_SCL_H;  //拉高时钟线

    I2C2_delay();//现在延时为16us 5

    I2C2_SDA_L; //产生下降沿

    I2C2_delay();

    I2C2_SCL_L;//拉低时钟线,钳住I2C总线,准备发数据或者接受数据

}

 

终止

STM32实例源码剖析(IIC协议时序分析)_第2张图片

void IIC_Stop(void)

{

    I2C2_SCL_L;

    I2C2_delay();

    I2C2_SDA_L;  //停止,CLK上升沿

    I2C2_delay();

    I2C2_SCL_H;  //拉高时钟线

    I2C2_delay();

    I2C2_SDA_H;  //拉高数据线,结束信号

    I2C2_delay();

}

 

 

 

数据传输

STM32实例源码剖析(IIC协议时序分析)_第3张图片

STM32实例源码剖析(IIC协议时序分析)_第4张图片

void I2C1_SendByte(uint8_t byte)

{

    uint8_t i = 8;

    while (i--) {

        I2C1_SCL_L;

        I2C1_delay();

        if (byte & 0x80) {

            I2C1_SDA_H;

        } else {

            I2C1_SDA_L;

        }

        byte <<= 1;

        I2C1_delay();

        I2C1_SCL_H;

        I2C1_delay();

    }

    I2C1_SCL_L;

}

 

 


 

 

主机发送数据后会等待从机返回应答信号:接收端通过拉低SDA提示主机完成接收

                接着发送端可以继续发送数据

bool IIC_Wait_Ack(void)

{

    I2C2_SCL_L;

    I2C2_delay();//确保拉低时钟

    I2C2_SDA_H;

    I2C2_delay();

    I2C2_SCL_H;

    I2C2_delay();

    if (I2C2_SDA_read) {     //读回高电平则失败

        I2C2_SCL_L;

        return false;

    }

    I2C2_SCL_L;   //拉低时钟

    return true; //读回低电平则成功

}

 

 


iic时钟频率: 不高于400K

 

应答:

当IIC主机(不一定是发送端还是接受端)将8位数据或命令传出后,会将SDA信号设置为输入,等待从机应答(等待SDA由高电平拉为低电平)若从机正确应答,表明数据或者命令传输成功,否则传输失败,注意,应答信号是数据接收方发送给数据发送方的。

器件地址:

每一个IIC器件都有一个器件地址,有的器件地址在出厂时地址就设定好了,用户不可以更改,比如OV7670的地址为0x42。有的器件例如EEPROM,前四个地址已经确定为1010, 后三个地址是由硬件链接确定的,所以一个IIC总线最多能连8个EEPROM芯片。


 

  STM32实例源码剖析(IIC协议时序分析)_第5张图片   

图上开始信号之后,七位地址代表器件地址,第八位代表读或者写,0为写,1代表读,然后跟着响应位。

 

 

 

IIC器件字节写时序:

 STM32实例源码剖析(IIC协议时序分析)_第6张图片

  

IIC器件多字节地址写时序:多字节地址比单字节地址在时序上就多了一块写地址

 STM32实例源码剖析(IIC协议时序分析)_第7张图片 

 


 

单字节器件读时序:注意最后产生无应答信号,另外多字节地址读时序跟单字节类似,只不过是多了几个地址字节而已。

 

 

STM32实例源码剖析(IIC协议时序分析)_第8张图片

 

 

你可能感兴趣的:(STM32深入剖析实践)