文章目录[隐藏]
I2C 总线能挂多少设备?
理论上:
7-bit address :2 的 7 次方,能挂 128 个设备。
10-bit address :2 的 10 次方,能挂 1024 个设备。
当然,要把预留设备地址去除,7 bit 协议规定了 8个预留地址,厂商不可以使用。保留地址如下:
但是I2C协议规定,总线上的电容不可以超过 400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。
总线之所以规定电容大小是因为,I2C 使用的GPIO为开漏结构,要求外部有电阻上拉,电阻和总线电容产生了一个 RC 延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。
传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以 RC 乘积必须更小。
I2C 架构
我们知道I2C有不同的速度模式,标准(100KHz)、快速(400KHz)、快速plus(1MHz)采用的GPIO都是开漏模式,支持线与,但是开漏模式无法输出高电平,所以需要外部有上拉,接一个电阻然后接Vdd。
Vdd可以采用 5V、3.3V、1.8V等,电源电压不同,上拉电阻阻值也不同。
一般总线上认为,低于0.3Vdd为低电平,高于0.7Vdd为高电平。
关于为什么GPIO开漏模式支持线与,无法输出高电平,我在GPIO系列文章写过:
线与,是I2C协议的基础!!!!
线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。
上拉电阻计算
1、上拉电阻过小,电流增大,端口输出低电平增大。
2、上拉电阻过大,上升沿时间增大,方波可能会变成三角波。
因此计算出一个精确的上拉电阻阻值是非常重要的。
计算上拉电阻的阻值,是有明确计算公式的:
最大电阻和上升沿时间 tr 、总线电容 Cb 、标准上升沿时间 0.8473 有关。
最小电阻和电源Vdd电压、GPIO口自己最大输出电压 Vol、 GPIO口自己最大电流 Vol 有关。
查《I2C-bus specification and user manual.pdf》7.1节:
查《I2C-bus specification and user manual.pdf》表10:
1、标准模式:0~100KHz,上升沿时间 tr = 1us
2、快速模式:100~400KHz,上升沿时间 tr = 0.3us
3、高速模式:up to 3.4MHz,上升沿时间 tr = 0.12us
由此公式,假设 Vdd 是 1.8V 供电,Cb总线电容是200pF(虽然协议规定负载电容最大400pF,实际上超过200pF波形就很不好,我们以200pF来计算)
标准模式 :
快速模式:
高速模式:
最小电阻(Vdd越大,上拉电阻就要越大):
注意,高速模式下,电源电压一般采用 1.8 V,不会采用 3.3V,因为如果用 3.3V 计算你会发现最小电阻比最大电阻大。
采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。
大家在不同速率采用的电阻一般有以下几种:1.5K、2.2K、4.7K。
一般很少会用到 高速模式(HS),因为这种模式协议比较复杂,既然要快不如用 SPI 了。
欢迎关注我的微信公众号,持续更新:
关于 I2C 协议的十篇文章,包括传输协议、传输机制、上拉电阻的计算、Linux 下软件驱动框架,都写在这里:
版权声明:本文为CSDN博主「嵌入式Linux系统开发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38769551/article/details/121756958
I2C 总线能挂多少设备?
理论上:
7-bit address :2 的 7 次方,能挂 128 个设备。
10-bit address :2 的 10 次方,能挂 1024 个设备。
当然,要把预留设备地址去除,7 bit 协议规定了 8个预留地址,厂商不可以使用。保留地址如下:
但是I2C协议规定,总线上的电容不可以超过 400pF。管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。
总线之所以规定电容大小是因为,I2C 使用的GPIO为开漏结构,要求外部有电阻上拉,电阻和总线电容产生了一个 RC 延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。
传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以 RC 乘积必须更小。
I2C 架构
我们知道I2C有不同的速度模式,标准(100KHz)、快速(400KHz)、快速plus(1MHz)采用的GPIO都是开漏模式,支持线与,但是开漏模式无法输出高电平,所以需要外部有上拉,接一个电阻然后接Vdd。
Vdd可以采用 5V、3.3V、1.8V等,电源电压不同,上拉电阻阻值也不同。
一般总线上认为,低于0.3Vdd为低电平,高于0.7Vdd为高电平。
关于为什么GPIO开漏模式支持线与,无法输出高电平,我在GPIO系列文章写过:
线与,是I2C协议的基础!!!!
线与:当总线上只要有一个设备输出低电平,整条总线便处于低电平状态,这时候总线被称为占用状态。
上拉电阻计算
1、上拉电阻过小,电流增大,端口输出低电平增大。
2、上拉电阻过大,上升沿时间增大,方波可能会变成三角波。
因此计算出一个精确的上拉电阻阻值是非常重要的。
计算上拉电阻的阻值,是有明确计算公式的:
最大电阻和上升沿时间 tr 、总线电容 Cb 、标准上升沿时间 0.8473 有关。
最小电阻和电源Vdd电压、GPIO口自己最大输出电压 Vol、 GPIO口自己最大电流 Vol 有关。
查《I2C-bus specification and user manual.pdf》7.1节:
查《I2C-bus specification and user manual.pdf》表10:
1、标准模式:0~100KHz,上升沿时间 tr = 1us
2、快速模式:100~400KHz,上升沿时间 tr = 0.3us
3、高速模式:up to 3.4MHz,上升沿时间 tr = 0.12us
由此公式,假设 Vdd 是 1.8V 供电,Cb总线电容是200pF(虽然协议规定负载电容最大400pF,实际上超过200pF波形就很不好,我们以200pF来计算)
标准模式 :
快速模式:
高速模式:
最小电阻(Vdd越大,上拉电阻就要越大):
注意,高速模式下,电源电压一般采用 1.8 V,不会采用 3.3V,因为如果用 3.3V 计算你会发现最小电阻比最大电阻大。
采用合适的电源电压和合适的上拉电阻,才会让你的 I2C 传输信号最优。
大家在不同速率采用的电阻一般有以下几种:1.5K、2.2K、4.7K。
一般很少会用到 高速模式(HS),因为这种模式协议比较复杂,既然要快不如用 SPI 了。
欢迎关注我的微信公众号,持续更新:
关于 I2C 协议的十篇文章,包括传输协议、传输机制、上拉电阻的计算、Linux 下软件驱动框架,都写在这里:
版权声明:本文为CSDN博主「嵌入式Linux系统开发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38769551/article/details/121756958
暂无评论