打印
[MM32硬件]

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

[复制链接]
688|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LEDyyds|  楼主 | 2022-7-30 11:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
最近在调ICM20602模块(一个六轴陀螺仪和加速度计), 使用IIC通信协议, 这个过程中遇到一个困扰我很长时间的问题。
IIC协议正确, 但是一直读取失败.最后发现因为没配置GPIO为开漏输出。


使用特权

评论回复
沙发
LEDyyds|  楼主 | 2022-7-30 11:12 | 只看该作者
推挽输出和开漏输出推挽输出: 输出逻辑0,则N-MOS激活;输出逻辑1,则P-MOS激活。
开漏输出:在不接上拉电阻时, 输出逻辑0,则N-MOS激活;输出逻辑1,P-MOS不会激活, 不会输出高电平。在接上拉电阻时, 输出逻辑0,则N-MOS激活;输出逻辑1,P-MOS激活, 可以输出高电平。
也就是说开漏输出如果不接上拉电阻, 没有输出高电平的能力。如果需要开漏输出有输出高电平的能力需要接一个上拉电阻. 目前很多单片机GPIO可以通过软件配置上拉电阻.
左图为开漏输出(接上拉电阻), 右图为推挽输出

使用特权

评论回复
板凳
LEDyyds|  楼主 | 2022-7-30 11:13 | 只看该作者
开漏输出的作用
防止短路: 在一些情况下(比如总线), 多个GPIO口可能会连接在同一根线上, 存在某个GPIO输出高电平, 另一个GPIO输出低电平的情况. 如果使用推挽输出, 你会发现这个GPIO的VCC和另一个GPIO的GND接在了一起, 也就是短路了(凉凉了). 如果换成开漏输出呢? VCC和GND多了个电阻, 这样电路就是安全的.所以总线一般会使用开漏输出.
线与: 开漏输出还能实现 线与 (自行百度), 减少一个与门, 简化电路.

使用特权

评论回复
地板
LEDyyds|  楼主 | 2022-7-30 11:15 | 只看该作者
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不能占用总线, 结束通信.
因此, 模拟IIC一定要将GPIO端口设置为开漏输出并加上上拉电阻.(硬件IIC会自动配置为开漏输出)。

使用特权

评论回复
5
cyclefly| | 2022-8-13 14:03 | 只看该作者
就是习惯性的加上拉,很少探究为什么
增加驱动能力吧

使用特权

评论回复
6
skyred| | 2022-8-15 20:19 | 只看该作者
常规应用,非要问为什么,就看怎么能给个专业又详尽的解释了

使用特权

评论回复
7
koala889| | 2022-8-29 19:25 | 只看该作者
可以增加驱动能力

使用特权

评论回复
8
回复就哭哭| | 2022-8-29 22:17 | 只看该作者
以为常规就应该这样操作的,没有深究过、

使用特权

评论回复
9
Henryko| | 2022-9-14 21:51 | 只看该作者
增加驱动能力

使用特权

评论回复
10
Henryko| | 2022-9-16 19:51 | 只看该作者
这不是常规操作嘛

使用特权

评论回复
11
Stahan| | 2022-9-16 20:24 | 只看该作者
可以增加驱动能力

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

815

帖子

1

粉丝