I2C(Inter-Integrated Circuit)是一种广泛应用于数字电路中的串行通信协议。这种通信协议由 Philips 公司(现在的 NXP 公司)在 20 世纪 80 年代开发,旨在解决多个芯片间的通信问题。I2C 通信协议具有简单、高可靠性和灵活性的特点,因此被广泛应用于各种不同领域的电子设备中。
I2C 协议使用两根线进行数据传输,分别是 SDA(Serial Data Line)和 SCL(Serial Clock Line)。数据在 SDA 线上传输,而时钟同步则由 SCL 线提供。这两根线在通信过程中通过电平变化来传输数据,并且都有上拉电阻。
在 I2C 通信中,有两个主要的参与者角色:主设备(Master)和从设备(Slave)。主设备是 I2C 总线的控制者,负责发起通信和发送指令;从设备则根据主设备的指令执行相应的操作并返回数据。
I2C 通信协议的基本操作包括起始条件和停止条件。起始条件是主设备发起通信的标志,它的产生是通过在 SCL 线保持高电平的同时将 SDA 线从高电平拉低。停止条件是通信结束的标志,在 SCL 线保持高电平的同时将 SDA 线从低电平拉高。
在起始条件之后,主设备会发送一些控制字节来选择特定的从设备进行通信。这些控制字节通常包括从设备的地址和读/写控制位。一旦从设备被选择,数据传输可以开始。数据的传输采用字节为单位,每个字节的传输分为数据传输和应答两个部分。
此外,I2C 协议还规定了数据有效性、地址及数据方向、应答信号和非应答信号等方面的细节,以确保通信的准确和可靠。
读写标志位:1 为读,0 为写。
注意:
SDA 使用 GPIO 的 OD 模式时,在读前不需要将 GPIO 切换为输入模式,可以直接读取,但需要在读前将其输出电平置为高,这时由于时开漏状态,是由外部上拉电阻将总线拉高的,这时从设备才可以将总线拉低。如果主设备输出低电平则总线一直被主设备强拉低而使从设备不能正常输出高电平,从而使读通信不能正常进行。
主机在收完从机的 ACK 后要把 SCL 拉低,否则从机一直保持输出电平(SCL 高电平是从设备电平不能变化),比如 ACK 时一直输出低电平,NACK 时一直输出高电平,主机的 Sr 开始信号不能够使从机重新开始。
SDA 线上的数据在时钟“高”期间必须是稳定的,只有当 SCL 线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。
数据有效性
I2C 使用 SDA 信号线来传输数据,使用 SCL 信号线进行数据同步。SDA 数据线在 SCL 的每个时钟周期传输一位数据。传输时,SCL 为高电平的时候 SDA 表示的数据有效,即此时的 SDA 为高电平时表示数据“1”,为低电平时表示数据“0”。当 SCL 为低电平时,SDA 的数据无效,一般在这个时候 SDA 进行电平切换,为下一次表示数据做好准备。
重启动信号
在主控器控制总线期间完成了一次数据通信(发送或接收)之后,如果想继续占用总线再进行一次数据通信(发送或接收),而又不释放总线,就需要利用重启动 Sr 信号时序。重启动信号 Sr 既作为前一次数据传输的结束,又作为后一次数据传输的开始。利用重启动信号的优点是,在前后两次通信之间主控器不需要释放总线,这样就不会丢失总线的控制权,即不让其他主器件节点抢占总线。
Sr 的型号与 S 是完全一样的,后面要重新发送器件地址,与S后的逻辑完全一致。
I2C 有 7 位和 10 位两种地址模式
I2C 规范保留了两组和 8 个地址,1111XXX 和 0000XXX。这些地址用于特殊用途。
从机地址+R/W |
描述 |
0000 0000 |
呼叫地址 |
0000 0001 |
起始字节 |
0000 001X |
CBUS地址 |
0000 010X |
保留供不同的总线格式 |
0000 011X |
保留将来用 |
0000 1XXX |
HS模式主机码 |
1111 0XXX |
10位从机地址 |
1111 1XXX |
保留将来用 |
I2C 总线的 10bit 寻址和 7bit 寻址是兼容的,这样就可以在同一个总线上同时使用 7bit 地址和 10bit 地址模式的设备,在进行 10bit 地址传输时,第一字节是一个特殊的保留地址来指示当前传输的是 10bit 地址。
|