I2C为什么要接上拉电阻?
因为它是开漏输出。
为什么是开漏输出?
I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况。所以总线一般会使用开漏输出。
为什么要接上拉电阻?
接上拉电阻是因为I2C通信需要输出高电平的能力。一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换。
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。
我们知道了SDA需要开漏输出和上拉电阻的原因,那为什么连SCLK也要使用这种模式呢?
这是因为虽然大部分时间都是由主机来驱动SCLK的,但是从机也是有情况来驱动SCLK线的;比如:当从机需要处理自身的数据,暂时不能和主机通信,就需要驱动SCLK(拉低SCLK)
这种情况不使用开漏输出的话就容易短路。
IIC的协议层
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
(开始位“Start”和停止位“Stop”,只能由Master来发出。)
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
IIC 总线时序图