IIC为什么需要用开漏输出和上拉电阻
IIC通信协议
IIC协议正确,?但是一直读取失败
推挽输出和开漏输出推挽输出:?
输出逻辑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会自动配置为开漏输出)。
相关推荐: