I2C协议如下,I2C的开始信号是在SCL保持高电平的时候,SDA由高变低,停止信号是在SCL保持高电平的时候SDA由低变高,写入数据时,时钟信号SCL保持高电平稳定,读取SDA的电平值,在SCL保持低电平时,SDA可以改变自己的值。
在第一个八位数据里,包含了七位的地址(addr),和最后一位的读/写标记(R/W),0表示写,1表示读。
在发出第八位数据之后,主机的第八位会被拉高,设备是否存在,就看第九位是不是低电平信号,因为若设备存在,从设备会把第九位拉低。
也就是说,前八位由主设备驱动,第九位由从设备驱动。
后续就是所需要发送的数据。遵循的都是SCL保持高电平稳定,读取SDA的电平。
对于单个的设备如下,当输出为高电平时,CMOS管导通,SDA为低电平,当输出为低电平时,CMOS管截止,SDA浮空。
实际电路中为了防止两个设备输出低电平,导致他们的SDA没有输出而出现电路悬空的情况,会加一个上拉电阻,让电路保持在高电平。
当双方都不驱动CMOS管时,SDA一定为高,所以当从设备需要回应主设备时,ACK回应信号一定是低电平。
因为当SCL为高电平不变时,可以读取SDA,所以当从设备需要完成自己内部的一些事情的时候,把SCL拉低,就可以处理自己内部的事情。
主从设备均可驱动SCL。
所以主从设备都是如下图所示结构:
参考韦东山的芯片开发手册