1. 使用开漏输出不会短路
IIC协议中,所有从设备连接到同一根SDA和SCL 。
如果用推挽输出,当两个设备一个输出低电平一个输出高电平时,相当于电源直接和地连接,会发生短路。
而开漏输出只有NMOS管,只能输出低电平,不会短路;
需要外加上拉电阻输出高电平,因此默认状态下SDA和SCL都是高电平;
2. 使用开漏输出可以实现仲裁机制
在总线上连接多个主设备时,可以避免多个设备同时通信,从而导致通信混乱;
在尝试通信之前,主设备会先检测总线是否处于空闲状态,空闲状态的定义是:已经检测到产生了终止条件(SCL=1时,SDA由低到高),上一段通信已经结束,即SCL和SDA=1;
IIC仲裁机制:
空闲状态下,多个设备同时开启通信,向总线发送数据。这时候就要通过仲裁机制来决定到底由谁来进行这场通信,也就是谁赢。
主设备A发送1000...
主设备B发送1001...
发送到100时,总线上电平都一样,仲裁没有结束;
发送到第四位时,A发送0,SDA被拉低,B发送1,但是SDA会表现成0(毕竟接地嘛)
主设备发送数据之后都会检测一下电平是否为自己发送的,
- 如果是(主设备A),赢得仲裁;
- 不是自己发送的(例如主设备B),输掉仲裁;
那么主设备B就成为这次通信的主宰者,继续通信;
主设备B放弃本次通信;