开漏输出在IIC通信中的作用

最近在调icm20602模块(一个六轴陀螺仪和加速度计), 使用iic通信协议, 这个过程中遇到一个困扰我很长时间的问题。
iic协议正确, 但是一直读取失败.最后发现因为没配置gpio为开漏输出。
推挽输出和开漏输出
推挽输出: 输出逻辑0,则n-mos激活;输出逻辑1,则p-mos激活。
开漏输出:在不接上拉电阻时, 输出逻辑0,则n-mos激活;输出逻辑1,p-mos不会激活, 不会输出高电平。在接上拉电阻时, 输出逻辑0,则n-mos激活;输出逻辑1,p-mos激活, 可以输出高电平。
也就是说开漏输出如果不接上拉电阻, 没有输出高电平的能力。如果需要开漏输出有输出高电平的能力需要接一个上拉电阻. 目前很多单片机gpio可以通过软件配置上拉电阻.
左图为开漏输出(接上拉电阻), 右图为推挽输出
开漏输出的作用
防止短路: 在一些情况下(比如总线), 多个gpio口可能会连接在同一根线上, 存在某个gpio输出高电平, 另一个gpio输出低电平的情况. 如果使用推挽输出, 你会发现这个gpio的vcc和另一个gpio的gnd接在了一起, 也就是短路了(凉凉了). 如果换成开漏输出呢? vcc和gnd多了个电阻, 这样电路就是安全的.所以总线一般会使用开漏输出.
线与: 开漏输出还能实现 线与 (自行百度), 减少一个与门, 简化电路.
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会自动配置为开漏输出)。
原文标题:iic为什么需要用开漏输出和上拉电阻?
文章出处:【微信公众号:嵌入式arm】欢迎添加关注!文章转载请注明出处。


PCB行业对上游依赖程度高,下游具有牵引和驱动作用
长安汽车2020全年营收预计800-900亿元
大规模AI Twitter探针绘制了企业家个性的热点图
到2026年,全球60%的人口将获得5G覆盖
MeeGo手持移动设备GUI设计
开漏输出在IIC通信中的作用
机器人拥有类人感知是如何实现的
中国移动中标2559万重庆高新区智慧城市5G融合基建项目
蓝牙耳机性价比高的有哪些,性价比最好的无线耳机
医疗电子设备的电磁兼容
三星S8+真机谍照再曝光,正面设计无悬念
韩国首尔法院批准了三星电子公司两名高管的逮捕令
人工智能并不遥远,颠覆地产行业未来可期
Vishay推出新款 PLTT精密高温薄膜片式电阻
配电变压器负荷不平衡分析
病毒消杀利器——中科亿东负氧离子机
二氧化碳传感器测试与应用方式OFweek Mall
无人机是怎样种树的
安森美推出用于更小更纤薄智能手机的可调谐射频元件,具备可靠天线性能
混动卡罗拉电子换挡装置