
什么是I2C线与对 SDA 来讲多个 I2C 设备⽆论是谁⼤家都输出⾼电平但只要有⼀个导通 NMOS 输出低电平那么 SDA 线上就是低电平所有设备未来感知到 SDA 上的数据就都是 0。这样的逻辑结构和C语言中的逻辑与很像所以就称为线与。线与有什么作用1 时钟同步当发送信息过快接收方接收数据来不及处理时从设备会拉低时钟信号告诉主设备。具体过程主设备给从设备发送数据时钟高电平时从设备采集 SDA 线上数据进而让从设备获得有效数据。 但是从设备需要更多时间来处理历史数据进而导致当前数据无法及时处理从设备便把 SCL 线拉低因为线与特性SCL 必然为低电平即便主设备想拉高也不行。主设备检测到 SCL 为低后只能暂停产生时钟直到从设备释放 SCLSCL 自动被拉高之后主设备再恢复通信过程。这种特性叫做 I2C 时钟拉伸拉伸一般是接收方拉伸从而实现主从设备通信的同步的过程。I2C 时钟拉伸Clock Stretching是 I2C 协议中一种从设备 “强制” 主设备等待的机制不过不用过于担心这个过程是通信双方硬件自动完成的。2 总线仲裁当有多个主设备同时竞争总线控制权时它们都在发送数据通常是地址。如果某个主设备发送 1释放总线但检测到总线实际是 0被其他主设备拉低它就知道自己输掉了仲裁会立即停止发送并转为从设备角色发送 0 的主设备赢得仲裁仲裁过程不会破坏数据。谁先拉 SDA 线谁仲裁胜利因为失败的会退出