您的位置:

I2C时序详解

一、I2C基础概念

I2C通信是一种串行通信协议,由两根线组成——数据线(SDA)和时钟线(SCL)。I2C通信是主从式的通信协议,主设备由远程控制器控制,从设备则是被控制的器件。I2C总线上可以连接多个从设备,每个从设备都有唯一的地址。

I2C总线协议具有两种常见的模式:标准模式和快速模式。标准模式时钟频率为100kHz,快速模式时钟频率可以达到400kHz。

二、I2C时序

在I2C通信中,时序控制非常重要。I2C通信总共有两种传输模式:数据传输模式和地址传输模式。

1.数据传输模式

数据传输模式是I2C常用的传输模式之一。它分为数据发送和数据接收两个部分,以下是数据发送时序:

SDA:  ----______----______----______----______----
SCL:  --________--________--________--________--

I2C的数据传输模式是在时钟的上升沿(SCL=HIGH)时,数据线上才能进行数据传输。在数据发送时,首先将数据放在数据线(SDA)上,然后通过时钟线(SCL)上升沿的触发,将数据发送出去。在下降沿时,数据线上应答位(ACK)的值为0则表示接收成功,反之,则表示接收失败

以下是数据接收时序:

SDA:  ----______----______----______----______----
SCL:  --________--________--________--________--

在数据接收时,主设备首先向从设备发送读取指令,然后从设备才将数据从数据线(SDA)上发送出去,主设备在接受到数据时通过应答位(ACK)来告诉从设备接收是否成功。

2.地址传输模式

在I2C通信中,为了向一个从设备传递数据,主设备需要向该从设备发送数据所对应的地址。以下是地址传输模式时序图:

SDA:  ----______----______----______----______----
SCL:  --________--________--________--________--

在地址传输模式中,主设备会先发送起始信号(S),然后发送从设备地址,最后传输方向位(R/W)。从设备接收到地址后,将通过应答位(ACK)表示接收成功,并且等待主设备传输数据。

三、I2C代码实例

以下是I2C通信的STM32代码示例:

#include "Wire.h"

void setup() {
  Wire.begin();        //  初始化I2C总线
  Serial.begin(9600);  //  初始化串口波特率
}

void loop() {
  int addr = 0x3F;     //  从设备地址
  int data = 0xAA;     //  发送的数据

  Wire.beginTransmission(addr);   //  开始发送
  Wire.write(data);               //  发送数据
  Wire.endTransmission();         //  结束发送

  delay(100);

  Wire.requestFrom(addr, 1);      //  请求数据
  if (Wire.available() > 0) {
    int val = Wire.read();        //  读取数据
    Serial.println(val);          //  输出数据
  }

  delay(1000);
}

代码中使用了Wire.h库初始化了I2C总线。在setup()函数中,初始化了I2C总线和串口。在loop()函数中,定义从设备地址和发送的数据,然后开启传输并发送数据。接着,等待从设备向主设备发回数据,读取数据并输出到串口。