I2C上拉电阻
在一些PCB的layout中,大家往往会看到在I2C通信的接口处,往往会接入一个4.7K的电阻,有的datasheet上面明确有要求,需要接入,有的则没有要求。
I2C接口
对于单片机来讲,有些IO内部的上拉电阻可以使能,这样就省去了外部的上拉电阻,这是对于单片机带有标准I2C通信协议接口,若是只带有模拟I2C协议接口,那么就需要考虑接入上拉电阻问题。下图是摄像头进行配置通信时SCL和SDA需要进行上拉电阻的连接。
在大多数情况下,由于I2C接口采用Open Drain机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的,如图1所示。
图1
因为I2C总线在空闲时必须拉高,只有是高的才能拉成低的,所以这是之所以规定空闲时必须为高的一个原因,要是保持“低”的话,那是不可能成为“多主”总线的。
其实I2C总线接口在工作时只会检测高低电平,他不会在乎有无上拉电阻的问题,所以总线必须满足时序要求。
上拉电阻的大小,会牵扯到两个问题,一个是功耗,一个是速度问题,两者是一个矛盾体。如果你想尽量提高速度,那么就牵涉到总线电容的问题,其实很容易理解,上拉电阻与总线的电容形成了RC,高速时将直接影响通讯!因为总线拉高时有个充电时间以及高电平的阀值,如果还没有充电到足以保证从器件可以识别的高电平的阀值时主器件就以为完成了一个总线动作的话,那么通讯肯定是不能进行的!
如果你想尽可能降低功耗,那么就要尽可能增大电阻以最大可能的减小电路各部分的消耗电流从而实现整体降低功耗!但不可能无限大,否则充电时间你会受不了的!
//========================================================
I2C上拉电阻大小
I2C上拉电阻确定有一个计算公式:
Rmin={Vdd(min)-o.4V}/3mA
Rmax=(T/0.874) *c, ( T=1us 100KHz, T=0.3us 400KHz )
C是Bus capacitance
Rp最大值由总线最大容限(Cbmax)决定,Rp最小值由Vio与上拉驱动电流(最大取3mA)决定;
于是 Rpmin=5V/3mA≈1.7K(@Vio=5V)或者2.8V/3mA≈1K(@Vio=2.8V)
Rpmax取值:标准模式,100Kbps总线的负载最大容限<=400pF;快速模式,400Kbps总线的负载最大容限<=200pF,根据具体使用情况、目前的器件制造工艺、PCB的走线距离等因素以及标准的向下兼容性,设计中以快速模式为基础,即总线负载电容<200pF,也就是传输速度可以上到400Kbps是不成问题的。于是Rpmax可以取的范围是1.8K~7K @ Vio=5V对应50pF~200pF。
根据Rpmin与Rpmax的限制范围,一般取5.1K @ Vio=5V , 负载容限的环境要求也容易达到。在2.8V系统中,console设计选3.3K,portable/handset等低供耗的设计选4.7K牺牲速度换取电池使用时间。
总的来说:电源电压限制了上拉电阻的最小值 ; 负载电容(总线电容)限制了上拉电阻的最大值
补充:在I2c总线可以串连300欧姆电阻RS可以用于防止SDA和SCL线的高电压毛刺。I2C协议还定义了串联在SDA、SCL线上电阻Rs。该电阻的作用是,有效抑制总线上的干扰脉冲进入从设备,提高可靠性。这个电阻的选择一般在100~200ohm左右。当然,这个电阻并不是必须的,在恶劣噪声环境中,可以选用。
//========================================================
I2C上拉电阻讨论
RP不宜过小,一般不低于1KΩ
一般IO 端口的驱动能力在2mA~4mA量级。如果RP阻值过小,VDD灌入端口的电流将较大,这导致端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V);如果灌入端口的电流过大,还可能损坏端口。故通常上拉电阻应选取不低于1KΩ的电阻(当VDD=3V时,灌入电流不超过3mA)。
RP不宜过大,一般不高于10KΩ
由于端口输出高电平是通过RP实现的,线上电平从低到高变化时,电源通过RP对线上负载电容CL充电,这需要一定的时间,即上升时间。端口信号的上升时间可近似用充电时间常数RPCL乘积表示。
信号线负载电容(对地)由多方面组成,包括器件引脚、PCB信号线、连接器等。如果信号线上挂有多个器件,负载电容也会增大。比如总线规定,对于的400kbps速率应用,信号上升时间应小于300ns;假设线上CL为20PF,可计算出对应的RP值为15KΩ。
如果RC充电时间常数过大,将使得信号上升沿变化缓慢,达不到数据传输的要求。
因此一般应用中选取的都是几KΩ量级的上拉电阻,比如都选取4K7的电阻。
小阻值的RP电阻增大了端口 Sink电流,故在可能的情况下,RP取值应稍大一点,以减少耗电。另外,通常情况下,SDA,SCL两条线上的上拉电阻取值是一致的,并上拉到同一电源上。
//========================================================
I2C应用中上拉电阻电源问题
在部中分应用中,还存在主从设备以及上拉电阻电源不一致的情况,比如Camera模组。在很多设计方案中,Camera模组不工作时,并不是进入Power Down模式,而是直接关闭模组供电VDDS。此时,处理器与模组相互连接的所有信号线都应该进入高阻态,否则就会有电流漏入模组;而对于此时的I2C控制信号线来说,由于上拉电阻的存在,必须关断上拉电阻电源VDDP。如果上拉电阻使用的是系统电源VDDM(VDDP=VDDM),无法关闭,就会有漏电流进入模组;因此这种情况下,应该使用VDDS作为上拉电阻电源(VDDP=VDDS),这样上拉电阻电源与Slave电源即可同时关闭,切断了漏电路径。
另外需要注意的是,在上述应用实例中选择的IO,应该选取上电默认为输入(或高阻)才行。
I2C上拉电阻的更多相关文章
- I2C 上拉电阻选择计算公式
I2C接口上拉电阻的选择 - I2C接口上拉电阻的选择 1.I2C接口的输出端是漏极开路或集电极开路,所以必须在接口外接上拉. 2.上拉电阻的范围很宽,但也需要跟据功耗.信号上升时间等具体确定. 和速 ...
- I2C上拉电阻取值范围
I2C总线是微电子通信控制领域中常用的一种总线标准,具备接线少,控制简单,速率高等优点.在I2C电路中常见的上拉电阻有1k.1.5k.2.2k.4.7k.5.1k.10k等等,但是应该如何根据开发要求 ...
- 上拉电阻大小对i2c总线的影响
漏极开路上拉电阻取值为何不能很大或很小? 如果上拉电阻值过小,Vcc灌入端口的电流(Ic)将较大,这样会导致MOS管V2(三极管)不完全导通(Ib*β<Ic),有饱和状态变成放大状态,这样端口输 ...
- (转)I2C 上拉大小
中断,GPIO,I2C等一般都是OC或者OD门,芯片内部无上拉电阻时,则外部必须加上拉电阻才能输出高电平.一般I/O端的驱动能力在2-4mA量级,OC或者OD门的导通电压为0.4V左右,手机中加在上拉 ...
- 为什么 I2C(IIC)需要上拉电阻
源鑫问: I2C时钟线和数据线为什么要接上拉电阻? 因为 I2C 的 IO 是开漏的,所以需要上拉电阻. 延伸: 之前 hippo曾经说过有人将 IO 设置为 PP,可能会烧 IO. 之前以为 I2C ...
- P0口上拉电阻选择
如果是驱动led,那么用1K左右的就行了.如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大:如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超 ...
- 自制单片机之十……AT89S51的上拉电阻问题
很多网友都问我AT89S51的P0口为什么要接一个上拉电阻.我就用一个篇幅来说一说 P0口和其它三个口的内部电路是不同的,如下图 P0口是接在两个三极管D0和D1之间的,而P1-P3口的上部是接一个电 ...
- 关于XILINX芯片IO管脚的上拉电阻的疑问
XILINX的每个IO脚都有一个可选的可配上拉电阻功能,现在我在配置文件的UCF里使用了这个上拉电阻:语法如下:NET"I_key_data" LOC = " ...
- Altera FPGA管脚弱上拉电阻详细设置方法
Altera FPGA管脚弱上拉电阻的软件设置方法 在使用 Altera 的 FPGA 时候, 由于系统需求, 需要在管脚的内部加上上拉电阻. Quartus II 软件中在 Assignment E ...
随机推荐
- sql索引唯一
alter table et_tb_1111 add constraint tbunique unique (itemid) alter table 表名 add constraint 约束名 uni ...
- 【Unity】第12章 导航网格和寻路
开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 NavMesh(导航网格)是3D游戏世界中用于实现"动态"物体自动寻路的一 ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- tengine 增加ngx_http_cache_purge_module 模块
wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz tar zxvf ngx_cache_purge-2.1.tar.gz -- ...
- C++类中的成员函数和构造函数为模板函数时的调用方法
所谓模板函数其实就是建立一个通用函数,这个通用函数的形参类型不具体指定,用一个虚拟类型来代表,这个通用函数就被称为函数模板. 例: #include <iostream> using na ...
- numRecordsIn 在哪里实现?
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreem ...
- python-enumerate方法
enumerate方法用于循环list或tuple,循环的时候可以得到索引值和当前索引的对象: letters = ['a', 'b', 'c', 'd', 'e'] for i, letter in ...
- linux命令(44):sed,vim;去掉文件中的^M 符号,去掉行首空格和制表符
注:下面的直接粘贴会出错,要重新输入^M 如何输入^M,先 ctrl+v,然后 ctrl+m 第一种方法: cat -A filename 就可以看到windows下的断元字符 ^M要去除他,最简单用 ...
- [iOS Xcode8报错]dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserN
[iOS Xcode8报错]dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserN ...
- Asp.Net解析json字符串
方法一: using LitJson; string json= "{...........}"; JsonData jdData = JsonMapper.ToObject(js ...