你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

聊一聊I2C串行通讯方式

[复制链接]
feilg 发布时间:2020-2-24 13:57
I2C总线有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL。 在什么情况下,拉低了总线的电平。
$ d1 u+ r: b) `& r
I2C规范的有效电平
5 ^. j) h. ]) a/ @4 b
在I2C的Spite中,对于高电平的规范并没有一个严格的说明。I2C的协议中以5V为例,要求上拉的电平应该是5V的正负10%,但其实我们可以让它成为3.3、1.8或者其他的电平,只要上升高电平和系统的电平保持一致就可以了。但是对于低电平是有一个标准的,一定要低于0.3倍的VDD,这样才是一个标准的低电平。因为I2C对于每个Device都是一个开漏输出的功能,开漏输出是指里面没有输出高电平的能力,只能输出低电平,这样就需要I2C外面有一个上拉电阻拉到VDD上,那么通讯的时候,高电平是ideal的状态,总线是空闲的,这样各个讯号就去拉总线,谁把总线拉下来谁就获得了总线的控制权。

, z4 N: b0 S* s9 r; K. s& D; i
I2C的通讯协议
% K# d6 X: j+ _
I2C上可以是一个主机,也可以有多个主机,很多个从机。主机负责产生时钟周期,并初始化总线。从机有一个自己的地址,在接收到主机发给自己的地址之后,跟主机进行串行通讯,每次通讯开始的时候都是主机先发送一个地址信息,如果有多个主机的话,一旦有一个主机抢到了总线的控制权,它就会把时钟和自己的地址发出来,紧接着是等待从机的应答位ACK,如果从机应答了主机的地址,然后主机就会发送一些命令给从机,从机在下一个时钟周期的时候就会将它所发送的数据放在它的SDA上。
+ c6 h3 @4 |1 R( ?: e2 n
时钟延展特性

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

/ C; x9 V5 I- o: \/ D* ]; F
STM32支持时钟延展特性,也就是说STM32在作为从机的时候,可以把主机的时钟强制拉低,从而减缓数据通讯。其他的外设有的支持时钟延展特性,有的不支持,具体要看其他外设芯片的数据手册。

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

, P# w! e; l+ O8 }" d! y
正常通讯的时候电平可以低下来,如果总线出现异常,另外一端已经检测不到有效的CLOCK或者DATA,这个时候用万用表去测量中间点上拉电阻的电压。这一点的电压如果是高电平,这时候不会有问题,因为直接可以把电平拉到很高的水平;但低电平的时候,无论是SDA还是SCLL,我们需要检测VDD的上拉电阻下面的电压,如果这一点的电压是1/11倍的VDD,那就可以判断接了一倍R的设备把总线拉低了。为什么这么说呢?因为上拉电阻是十倍的R,下面跟着拉住总线的设备是一倍的R,在中间节点拉住的是0,上面整个是VDD,中间节点根据欧姆定律可以算出来是1/11倍的VDD。
3 _: a7 @0 A: G" e* |2 M! d" o
那拉住总线的设备有没有可能是五倍的R呢?答案是不可能,如果设备去拉总线的电平,一个是五倍的R,一个是一倍的R,如果另外一个外设去拉应该是5/15,即1/3倍的VDD,这样的电平才会是另外一个五倍的R拉出的。
. u. c5 [/ e& M+ q9 G
我们通过这种增加两个电阻的方式就可以判断出是谁拉住了总线,它的电压是不一样的。有了这样的判断,我们就可以去做数据的处理,并进行恢复。
% o! V. Q1 j0 V$ X
  d) U) {* A/ M: u7 P

" A7 b' y( @7 P/ E* J) Y0 a1 {& g) A
收藏 1 评论1 发布时间:2020-2-24 13:57

举报

1个回答
七哥 回答时间:2020-2-25 11:14:21
真能判断是谁拉住了总线? 表示值得怀疑,至少没看懂
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版