I2C 总线内部使用漏极开路输出驱动器,因此 SDA和 SCL 可以被拉低为低电平,但是不能被驱动为高电平,所以每条线上都要使用一个上拉电阻,默认情况下将其保持在高电平。
根据数据手册来看参数:
·灌电流最大值为3mA;
·低电平输出电压设置了最大值为0.4V。
所以根据上述公式可以计算,对于5V的电源,每个上拉电阻阻值至少1.53kΩ,而对于3.3V的电源,每个电阻阻值至少967Ω。可以算出基本的上拉电阻阻值范围,根据驱动能力大小,选择合适的上拉电阻。
正常情况下,一个完整的I2C通信过程有如下步骤:
第1步:起始条件主设备通过将SDA线从高电平切换到低电平,再将SCL线从高电平切换到低电平,来向每个连接的从机发送启动条件。
第2步:发送从设备地址主设备向每个从机发送要与之通信的从机的7位或10位地址,以及相应的读/写位。
第3步:接收应答每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA线拉低一位以表示返回一个ACK位。如果来自主设备的地址与从机自身的地址不匹配,则从设备将SDA线拉高,表示返回一个NACK位。
第4步:收发数据主设备发送或接收数据到从设备。
第5步:接收应答在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧。
第6步:停止通信为了停止数据传输,主设备将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件I2C单个主设备连接多个从机。
使用7位地址可提供128 (2的7次方)个唯一地址。使用10位地址很罕见,但可提供1024 (2的10次方)个唯一地址。
要将多个节点连接到单个主器件多个主设备可以连接到一个或多个从机。当两个主设备试图通过SDA线路同时发送或接收数据时,同一系统中的多个主设备就会出现问题。为了解决这个问题,每个主设备都需要在发送消息之前检测SDA线是低电平还是高电平;如果SDA线为低电平,则意味着另一个主设备可以控制总线,并且主设备应等待发送消息;如果SDA线为高电平,则可以安全地发送消息。
小结:
1.I2C上拉电阻要看实际情况去选择合适的阻值,I2C需要上拉电阻的原因是什么(在大多数情况下,由于I2C接口采用Open Drain(开漏)机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的);
2.I2C一般可以挂很多个从设备,理论上可以挂128个,实际使用因为寄生电容的原因一般不超过8个从设备(连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制),理论上按照位数地址来确定能挂多少从设备,7位就是128个,10位就是1024个。