I2C协议精讲(二):I2C上拉电阻计算

文章目录[隐藏]

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系列文章写过:

gpio subsystem(1) – linuxer

线与,是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 下软件驱动框架,都写在这里:

I2C(一):I2C bus spec

版权声明:本文为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系列文章写过:

gpio subsystem(1) – linuxer

线与,是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 下软件驱动框架,都写在这里:

I2C(一):I2C bus spec

版权声明:本文为CSDN博主「嵌入式Linux系统开发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38769551/article/details/121756958

生成海报
点赞 0

嵌入式Linux系统开发

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32串口发送接收数据

1.串口通信 我用的32是stm32f10x最小系统没有UART4和UART5 USART : 通用同步异步收发器 UART : 通用异步收发器 nRTS : 请求发送 nCTS : 请求接收 区别:USART指单片机的一个IO端

STM32的串口硬件流控(RS232/RS485)

流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-12

CH579(M0内核)中断向量表偏移处理

通常情况下,为了产品后续的升级,程序都会分为两部分BootloaderApp,因为有两个程序,所以需要对中断向量表进行处理,否则,当程序已经跳转到app中运行,当中断产生的时候,响应函数仍然是Bootloader的中断函数,而不是app的 在S