工程师三宝之如何读懂I^2C时序

文摘   科学   2023-05-19 17:32   江苏  

工程师朋友几乎都知道I^2CInterIntegrated CircuitI^2C接口线少,控制方式简单,用途广泛。所谓成也萧何败也萧何,常常听到新手工程师抱怨,I^2C看着简单,线不多(只有两根线SDACLK),其中的坑却不少。

I^2C的通讯时序对于小伙伴们理解I^2C非常重要。今天我们先从读懂I^2C的通讯时序开始,由浅入深的了解一下I^2C。关于I^2C的发展历程和定义,篇幅有限就不在这里展开讲了,有兴趣的小伙伴可以自行百度。

上干货。我们今天就从最复杂的时序(Random Read)开讲。其它的时序,像Sequential ReadRandom WriteSequential Write帧数以及变化都比Random Read少,相对而言没有那么复杂。我们一帧一帧来看

1帧:START信号。如下图当SCL为高电平的时候,SDA的电平有一个从HL的变化。

2帧:发送从机地址 + 读写控制位 + 应答位I^2C总线有起始信号与终止信号, 每一字节必须是8位长度,发完还有一位应答位, 所以一共会有9. 完整的SCL是由9个时钟周期组成,前7个,用于传输从机地址倒数第2个,用于表示对SLAVE何种操作,0表示写(W)1表示读(R)。最后1个,是从机对Host的应答 (Acknowledge),正常情况下, SLAVE需要将SDA拉低,以告诉Host有收到数据。

DECODE:由下面述信号可知,Host0xA2这个SLAVE发送(写)数据, SLAVE有应答。

3帧:数据 + 应答位

SCL8个为数据,由上一帧可知,这个数据是Host传给SLAVE的,

最后1个,是从机对Host的应答,正常情况下, SLAVE需要将SDA拉低,以告诉Host有收到数据。

DECODE:由上述信号可知,Host0xA2这个SLAVE发送了数据0x00 SLAVE有应答。

4帧:Repeat START与第一帧一样,当SCL为高电平的时候,SDA的电平有一个从HL的变化,这就表示,Host要从SLAVE读取数据了,正常来说,下一帧就是SLAVE_ADDRESS + R了。

对于Repeat START,初学者可能会不太理解。Repeat START表明设备想要传输更多数据,但不希望释放总线。 这种情形通常是必须发送‘开始’,但没有发生‘停止’。 这时,紧接着‘开始’发送一个‘停止’也是一种方便的方式。它可以防止其他设备在转换之间抢夺总线。如果你正在与一个设备(例如串行 EEPROM)通话,你可能不想在传输地址和收集数据时中断。 Repeat START条件将处理这个事情。你也可以这么理解Repeat START只是为了不让其他占用总线,而以及其快的速度发生的‘停止’‘开始’。

5帧:发送从机地址 + 读写控制位 + 应答位

DECODE:由下面信号可知,Host要向0xA2这个SLAVE读数据了,接下来从机开始接管SDA并发送数据。

6帧:数据 + 应答位

完整的SCL是由9个时钟周期组成,前8个,为数据,由上一帧可知,这个数据是SLAVE传给Host的,最后1个,是HostSLAVE的应答,0表示Host还要继续读;1表示Host不再需要了,随后应该就是STOP信号了。

DECODE:由下面信号可知,SLAVEHost发送了数据0x64 Host应答了1

7帧:STOP信号

SCL为高电平的时候,SDA的电平有一个从LH的变化。

如果小伙伴们有什么关于I^2C的问题可以私信讨论,毕竟与I^2C打了这么多年的交道,对它还是有比较深刻的领悟的。







YoYo酱慢谈
杂说漫谈,科技前沿信息介绍与分享。
 最新文章