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为什么用开漏输出和上拉电阻
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会自动配置为开漏输出)。
举报