一、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()函数中,定义从设备地址和发送的数据,然后开启传输并发送数据。接着,等待从设备向主设备发回数据,读取数据并输出到串口。