良许Linux教程网 干货合集 IIC为什么需要用开漏输出和上拉电阻?

IIC为什么需要用开漏输出和上拉电阻?

最近我正在进行对ICM20602模块的调试,该模块是一个具有六轴陀螺仪和加速度计功能的设备,使用的是IIC通信协议。在这个过程中,我遇到了一个困扰了我很长时间的问题。

我确认了IIC协议的正确性,但是一直无法成功读取数据。最后,我发现问题的根源在于我没有正确配置GPIO为开漏输出。这个问题的解决让我终于能够顺利地读取到所需的数据了。

image-20230905234858260
image-20230905234858260

推挽输出和开漏输出

推挽输出:

输出逻辑0,则N-MOS激活;

输出逻辑1,则P-MOS激活。

开漏输出:

在不接上拉电阻时, 输出逻辑0,则N-MOS激活;

输出逻辑1,P-MOS不会激活, 不会输出高电平。

在接上拉电阻时, 输出逻辑0,则N-MOS激活;

输出逻辑1,P-MOS激活, 可以输出高电平。

也就是说开漏输出如果不接上拉电阻, 没有输出高电平的能力。

如果需要开漏输出有输出高电平的能力需要接一个上拉电阻. 目前很多单片机GPIO可以通过软件配置上拉电阻.

image-20230905234901266
image-20230905234901266

左图为开漏输出(接上拉电阻), 右图为推挽输出

开漏输出的作用

防止短路: 在一些情况下(比如总线), 多个GPIO口可能会连接在同一根线上, 存在某个GPIO输出高电平, 另一个GPIO输出低电平的情况. 如果使用推挽输出, 你会发现这个GPIO的VCC和另一个GPIO的GND接在了一起, 也就是短路了(凉凉了). 如果换成开漏输出呢? VCC和GND多了个电阻, 这样电路就是安全的.所以总线一般会使用开漏输出.

image-20230905234905309
image-20230905234905309

线与: 开漏输出还能实现 线与 (自行百度), 减少一个与门, 简化电路.

IIC为什么用开漏输出和上拉电阻

IIC协议支持多个主设备与多个从设备在一条总线上, 如果不用开漏输出, 而用推挽输出, 会出现主设备之间短路的情况.

至于为什么需要上拉电阻, 那是因为IIC通信需要输出高电平的能力.

为了实现多个主设备抢占总线时的仲裁.IIC只有两根线(SCL和SDA), 怎么判断哪个主设备占用总线(当然是先来后到了).

假设主设备A需要启动IIC, 他需要在SCL高电平时, 将SDA由高电平转换为低电平作为启动信号. 主设备A在把SDA拉高后, 它需要再检查一下SDA的电平。

为什么? 因为线与. 如果主设备A拉高SDA时, 已经有其他主设备将SDA拉低了. 由于 1 & 0 = 0 那么主设备A在检查SDA电平时, 会发现不是高电平, 而是低电平. 说明其他主设备抢占总线的时间比它早, 主设备A只能放弃占用总线. 如果是高电平, 则可以占用。

这就是开漏输出在IIC通信中的另一个作用。

SDA是高电平, 说明主设备A可以占用总线, 然后主设备A将SDA拉低, 开始通信.

SDA是低电平, 说明有人已经捷足先登了, 主设备A不能占用总线, 结束通信.

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

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

作者: 良许

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

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

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

微信扫一扫关注我们

关注微博
返回顶部