四川雷竞技真假雷竞技是正规平台吗雷竞技有限公司

理解总线协议之i2c总线

来源:jsj_xx    发布时间:2019-10-23 14:45:51

作者:新浪微博(@NP等不等于P)

计算机学习微信公众号(jsj_xx)

i2c总线是PHILIPS公司开发的两线式串行总线:串行数据线(SDA)和串行时钟线 (SCL),这种简洁实现在电子领域中广泛应用。本文分享我们对i2c总线协议流程的理解(如有错误,还望指正,谢谢),希望对大家有帮助。

1 2c总线特点

i2c总线协议看上去很简单,几个明显的特点

1)master通过控制SCL,从而掌控整个总线。

2)每次通信从发送START信号开始,发送STOP信号终止。

3)每次通信中的所有数据通过SDA传输。

2 i2c总线写过程

下面,我们再深入一下,以写过程为例详细地分析i2c总线协议流程。

写操作过程
  1)master监测总线状态,在总线空闲时发送START信号,从而为此次通信掌控住总线。

【总线空闲时,SDA和SCL都必须保持为高电平。当master要发送START信号时,在保持SCL高电平的情况下,让SDA从高电平跳变到低电平即可。】
 2)master发送一个字节的slave地址(7bit的地址+1bit的读写控制位)。

【master发送的这一个字节,其实也应该归属于数据。但是由于是第一个字节,master和slave就给其赋予了特殊含义:slave地址+读写控制位。对应本次的写过程,此处自然要设置写控制位。】

slave地址的作用类似于局域网中的mac地址。一条i2c总线就相当于一个局域网(i2c总线中,pca954x相当于路由器。对于pci总线也是类似的,而其中pci桥相当于路由器。这些,我们以后会讲到。),同一个总线中所有slave都会收到master发送的slave地址,但是只有地址匹配的slave才会给master返回ACK信号。】

 3)对应的slave会回复一个ACK信号。

【返回一个结果。对于接收者而言,每收到8个bit(这样,一个字节就占8个时钟周期),都会在之后的时钟脉冲(第九个时钟周期)返回一个信号:设置SDA为低电平为ACK信号,否则为NACK信号。】

 4)master发送一个字节的slave register地址。

【跟发送slave地址一样,master发送的这个字节也应当归属为数据。但是由于是第二个字节,master和slave就给其赋予了特殊含义:slave register地址。】

 5)对应的slave会回复一个ACK信号。

【返回一个结果。】

 6)master收到ACK信号后,开始将所有数据逐字节地发送。

【终于可以发送真正的数据了:持续的数据流。】

数据传输过程中的要点是:master控制SCL,在SCL为低电平时,发送者设置SDA,此时SDA允许变化;在SCL为高电平时,SDA必须稳定,因为接收者此时要读取SDA。】

 7)slave在每收到一个字节后都会回复一个ACK信号(异常时slave会回复NACK信号)。

接收者会为接收到的每个字节返回一个结果:ACK信号或者NACK信号。master在保持SCL为低电平的情况下,将1bit的数据放到SDA上:如果此bit数据为0,则master设置SDA为低电平,否则设置SDA为高电平。这样发送8个bit就完成了一个字节的发送。】

8)master发完数据后会发送STOP信号,从而结束本次操作(当然也就释放了总线)。

【同发送START信号类似。master在保持SCL为高电平时,设置SDA从低电平跳变到高电平,从而发送STOP信号。】

 i2c总线读过程

如果大家理解了上述这个写过程,自然也可以举一反三地理解读过程。其中的区别仅仅是:

在读过程中,master变成了接收者,从而由master来发送ACK或者NACK了。。。

4 i2c总线协议关键点总结

最后,我们依据读写流程,可以梳理出其中的几个关键点
1)只有SCL为低电平时,SDA允许变化;SCL为高电平时,SDA必须保持稳定。

2)master在一次通信中,可能是发送者,也可能是接收者。

3)接收者会发送ACK或者NACK,接收者可能是master,也可能是slave。

4)START信号或者STOP信号只能由master发出,不管master在本次通信中是发送者还是接收者。

5)在一次通信中:SCL只能被master控制,SDA可以被master控制,也可以被slave控制。换句话说,只有拥有(掌控)了SCL才能称之为master。

后续我们会结合AT24系列芯片等,具体讲解i2c设备(本文纯属个人理解,如有错误,还望指正,谢谢)。

新浪微博(@NP等不等于P)

计算机学习微信公众号(jsj_xx)

原创技术文章,感悟计算机,透彻理解计算机!

【计算机学习微信公众号:jsj_xx】