IIC通讯协议 - 一主多从
01 IIC-原理
1.1 基本原理
I2C(IIC)属于两线式串行总线,由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线,属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构,总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
物理I2C接口有两根双向线,串行时钟线(SCL)和串行数据线(SDA)组成,可用于发送和接收数据,但是通信都是由主设备发起,从设备被动响应,实现数据的传输。
1.2 上拉电阻
1.2.1 为什么要上拉电阻
接“上拉电阻”是因为I2C通信需要输出高电平的能力。一般开漏输出无法输出高电平,如果在漏极接上拉电阻,则可以进行电平转换。
I2C由两条总线SDA和SCL组成。连接到总线的器件的输出级必须是漏极开路,都通过上拉电阻连接到电源,这样才能够实现“线与”功能。当总线空闲时,这两条线路都是高电平。
1.2.2 上拉电阻配多少
上拉电阻配多少合适?要回答这个问题,首先明确两点:阻值不能过小;阻值也不能过大。
电阻不能过小是因为,电流倒灌问题。如果上拉阻值过小,VDD灌入端口的电流将较大,功耗会很大,导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。故通常上拉电阻应选取不低于1K的电阻(当VDD=3V时,灌入电流不超过3mA)。
电阻不能过大是因为响应速度问题。它取决于上拉电阻和线上电容形成的RC延时:RC延时越大,波形越偏离方波趋向于正弦波,数据读写正确的概率就越低,所以上拉电阻不能过大。一般情况下,I2C总线上的负载电容不能超过400pF。当I2C总线上器件逐渐增多时,总线负载电容也相应增加。当总的负载电容大于400pF时,就不能可靠的工作。这也是I2C的局限性。
因此,一般建议上拉电阻阻值范围1K~10K欧,典型的取值可选用1.5K,2.2K,4.7K(推荐4.7K)。
1.2.3 上拉电阻计算
已知IIC的上拉电阻阻值不能过小,也不能过大。如果需要信号稳定传输,阻值需要在一个合理的范围内:$[R_{min},R_{max}]$
参考链接:
1.2.3.1 计算最小值
$$
R_{min} = \frac{V_{DD} - V_{OL}}{I_{OL}}
$$
1.2.3.2 计算最大值
$$
R_{max} = \frac{Tr}{0.8473 \times {C_b}}
$$
1.2.4 并联问题
I2C协议一主多从,那么是否每个从机都需要上拉电阻呢?以及,上拉电阻要放在什么地方呢?
答案是,不需要。每个从机的上拉电阻是等价于并联的,即阻值变小。如果I2C总线上器件逐渐增多,那么总的上拉电阻可能太小,反而影响电路的正常运行(电流倒灌的情况)。
因此,只需要一对电阻即可,SDA和SCL各一个上拉电阻。至于电阻摆放的问题,没有特别的讲究。
02 IIC-代码(基于ESP32)
2.1 查找IIC的设备
1 |
|
2.2
暂略


