良许Linux教程网 干货合集 I2C通信时,谁拉住了我的总线

I2C通信时,谁拉住了我的总线

今天,我们来讨论一下I2C这种串行通信方式。I2C总线由两根双向信号线组成,一根是数据线SDA,另一根是时钟线SCL。我们会探讨在什么情况下会拉低总线的电平。

I2C规范中对于高电平的要求并没有严格的说明。在协议中以5V为例,要求上拉电平应该是5V的正负10%。实际上,我们可以将上拉电平设置为3.3V、1.8V或其他电平,只要上升高电平与系统电平保持一致即可。然而,对于低电平,却有一个明确的标准,必须低于0.3倍的VDD才能被视为标准的低电平。由于I2C对于每个设备都是一个开漏输出功能,也就是说没有输出高电平的能力,只能输出低电平。因此,在I2C外部需要使用上拉电阻将总线拉到VDD上。在通信过程中,高电平是理想的状态,表示总线空闲,各个设备可以拉低总线,通过谁拉低总线来获得总线控制权。

I2C的通讯协议

I2C上可以是一个主机,也可以有多个主机,很多个从机。主机负责产生时钟周期,并初始化总线。从机有一个自己的地址,在接收到主机发给自己的地址之后,跟主机进行串行通讯,每次通讯开始的时候都是主机先发送一个地址信息,如果有多个主机的话,一旦有一个主机抢到了总线的控制权,它就会把时钟和自己的地址发出来,紧接着是等待从机的应答位ACK,如果从机应答了主机的地址,然后主机就会发送一些命令给从机,从机在下一个时钟周期的时候就会将它所发送的数据放在它的SDA上。

时钟延展特性

I2C的规范里有一部分是关于I2C的时钟延展特性,有可能大家对这个特性不熟悉。一般来说,I2C主机进行发送,从机进行接收,主机想要数据的时候从机在CLOCK中推送出来即可。但是从机是有一定的权利的,它可以把时钟线强制拉低,拉低的作用让总线上的主机不要再发送数据,因为从机接收到数据后要准备把数据传输到自己内部或者是准备下一个要发送的数据,这需要时间处理。在这个时间段里,如果主机发送过快,第一次的数据从机接收完后,第二次的数据马上又发送过来,从机没有时间去进行数据的处理,那么从机就会把CLOCK拉低,从而使速度变慢。

STM32支持时钟延展特性,也就是说STM32在作为从机的时候,可以把主机的时钟强制拉低,从而减缓数据通讯。其他的外设有的支持时钟延展特性,有的不支持,具体要看其他外设芯片的数据手册。

如何判断是谁拉住了总线

在I2C的任意一条线上,无论是CLOCK还是DATA,都有一个上拉电阻挂在总线上,总线一端连到MCU,另一端连到外设,如果我们想去判断谁拉住了总线,就需要增加两个电阻,一个是在靠近MCU这一端,另一个加在靠近设备的一端,阻值分别是上拉电阻的十分之一和二分之一。增加的两个电阻本身是不会影响I2C的通讯,因为开漏输出是不能输出高电平的,高电平都是由VDD来拉高,所以对高电平没有要求,它只对低电平有要求。加上电阻之后,在往外面输出0的时候,总线上可以检测到电平被拉低到0.3倍的VDD以下,这样就是可行的。

正常通讯的时候电平可以低下来,如果总线出现异常,另外一端已经检测不到有效的CLOCK或者DATA,这个时候用万用表去测量中间点上拉电阻的电压。这一点的电压如果是高电平,这时候不会有问题,因为直接可以把电平拉到很高的水平;但低电平的时候,无论是SDA还是SCLL,我们需要检测VDD的上拉电阻下面的电压,如果这一点的电压是1/11倍的VDD,那就可以判断接了一倍R的设备把总线拉低了。为什么这么说呢?因为上拉电阻是十倍的R,下面跟着拉住总线的设备是一倍的R,在中间节点拉住的是0,上面整个是VDD,中间节点根据欧姆定律可以算出来是1/11倍的VDD。

那拉住总线的设备有没有可能是五倍的R呢?答案是不可能,如果设备去拉总线的电平,一个是五倍的R,一个是一倍的R,如果另外一个外设去拉应该是5/15,即1/3倍的VDD,这样的电平才会是另外一个五倍的R拉出的。

我们通过这种增加两个电阻的方式就可以判断出是谁拉住了总线,它的电压是不一样的。有了这样的判断,我们就可以去做数据的处理,并进行恢复。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部