瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】258811263(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第十五篇 I2C_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
第167章 I2C上拉电阻
I2C的硬件连接如下图所示:
可以看到在SDA数据线和SCL时钟线上都需要接一个上拉电阻,在本章中将会讲解为什么这里要接一个上拉电阻,以及上拉电阻如何计算。
167.1 接上拉电阻的作用
SDA数据线和SCL时钟线上接一个上拉电阻的作用如下所示:
(1)保证总线空闲时保持高电平
I2C 总线采用开漏/开集电极输出,当没有设备驱动总线时,总线会处于高阻态。如果不接上拉电阻,总线电平将不确定,很容易受到噪声干扰。接上拉电阻可以确保总线空闲时保持稳定的高电平。
(2)实现线与功能
I2C 总线允许多个设备挂载在同一总线上。当一个设备拉低总线时,其他设备的输出也会被拉低。这就是线与功能,实现总线仲裁。如果不接上拉电阻,当总线空闲时电平不确定,一个设备拉低总线时其他设备无法感知到总线电平变化,无法实现线与功能。
而这里的上拉电阻也并不能随意进行取值,需要考虑总线电容的影响。I2C 总线上存在各种寄生电容,可以等效成一个RC充电电路,如下图所示:
当总线从低电平转为高电平时,需要通过上拉电阻为总线供电,充电总线电容,如果上拉电阻取值过大,充电时间过长,会导致上升沿过慢,可能影响通信,如果上拉电阻取值过小,则无法产生低电平,所以在I2C规范中要求总线电容不能超过400PF,通常建议在 1k至10k欧姆之间选择,能够既保证上升沿速度,又能够可靠拉低总线电平,在下一小节中将对I2C上拉电阻的阻值计算进行讲解。
167.2 I2C上拉电阻阻值计算
上拉电阻的最小值计算
(1)公式:
Rp(min) = (VDD - VOL(max)) / IOL
(2)各参数解释:
VDD: 通常为 5V 或 3.3V 等常用的供电电压,在iTOP-RK3568 开发板上为3.3V
VOL(max): 表示器件在低电平时的最大输出电压,具体数值表格如下所示,由于VDD为3.3V,所以VOL的最大值为0.4.
IOL: 器件在低电平时的最大灌入电流,具体数值表格如下所示,通过VOL值为0.4,可以得到IOL在常规模式下和快速模式下的值为3ma。
Rp(min) 为上拉电阻的最小值
(3)计算步骤:
确定 VDD、VOL(max) 和 IOL 的值:
在RK3568中VDD为3.3V,所以VOL(max) =0.4V,对应的IOL为3mA
代入公式 Rp(min) = (VDD - VOL(max)) / IOL 计算得到上拉电阻的最小值。
Rp(min) = (3V - 0.4V) / 3mA = 966Ω
上拉电阻的最大值计算:
- 公式
Rp(max) = 0.8473 * Cb / tr
(2)各参数解释:
Rp(max) 是上拉电阻的最大值
Cb 是总线电容
tr 是高电平上升时间,一般上升时间是从0.3VDD到0.7VDD,具体可以从数据手册获得,具体如下所示:
根据上图可以得到在标准模式下tr的取值为 ≤ 1000ns。
在快速模式下tr的取值为 ≤ 300ns。
在超快速模式下tr的取值为≤ 120ns。
(3)计算步骤:
I2C 工作在标准模式下,上拉电压是 3.3V,引脚电容是 10pF,连接电容是 30pF,高电平上升时间 tr = 1000ns,计算上拉电阻的最大值
总线电容 Cb = 10pF + 30pF = 40pF,然后将对应值代入公式: Rp(max) = 0.8473 * Cb / tr Rp(max) = 0.8473 * 40pF / 1000ns Rp(max) = 33.89 kΩ
具体选择:
一般来说,I2C 总线速度越快,所需的上拉电阻值越小,具体选择如下所示:
400kbps: 一般选择 4.7k 上拉电阻
100kbps: 一般选择 10k 上拉电阻
1Mbps: 一般选择 2.2k 上拉电阻
当然上述选择未必正确,需要根据实际测试结果进行调整。在实际使用中,可以先根据经验选择一个上拉电阻值试用,无需过于纠结于计算公式。