I2C上拉电阻到底多大

I2C上啦电阻到底多大
1. I2C出现的问题
最近群里,由于大部分人都玩摄像头,在摄像头初始化,即I2C接口的初始化中,前前后后出现了很多问题,包括我自己。不能理解。。如下部分群聊记录:

我在当时在驱动ov7670的时候,由于官哥的模块上没有默认I2C的上啦电阻,导致三四天I2C时序的设计,testbench,都是如此的崩溃,想哭的冲动都用了,FPGA内部上拉也不行。。。。后来官哥跟我说:“你个傻x,赶紧上啦4.7K”
2. I2C电路举例
以下是我的电路的设计,听官哥的,用了4,7K 的上拉电阻

下面这个是官哥的

还有人说,上啦时候,还不行了,首先要降低速度,其次减小上啦电阻,一直都是听人说,都不知道为什么过,人家都说经验。。。。。人家用到了1K电阻,我5K ,人家速度1K,我100K,屡试不爽,但是就是揪心,吃不好睡不香,这到底为什么呢。。。。
3. I2C为什么要上拉电阻
这是我最搞不懂的问题,他为啥不在IC内部做好上啦呢,让我们在外面再拉一次,麻烦死了。。还有这SCLK明明只是输出,为啥也要上啦呢。。这逼迫我不得不研究一下I2C内部电路。。。哎,如下:
借鉴参考: http://bbs.eeworld.com.cn/thread-95337-1-1.html
http://hi.baidu.com/spbeijilang/blog/item/012f13824c2d18b26d811911.html
(1)单片机内部有上啦电阻,有些上拉能力够了,可以不加上拉电阻,有些不够,那就必须在外部加上拉电阻。解析如下:
“这 个就要看你使用的单片机是否有标准的IIC标准接口了,如果你使用了标准的IIC接口,这个接口在使能的时候,引脚进入漏极开路模式,不过有一些单片机内 部的上拉电阻可以使能,这样就省去了外部的上拉电阻,我用过AVR的,就是使能的内部的上拉电阻。但是如果是使用单片机的引脚模拟IIC协议的话,这个就 得另说了,得看你的单片机引脚是否支持漏极开路模式或者上拉模式,不过一般推拉模式的输出引脚用在IIC里可能会有问题具体也没用过。”
(2)也有人回答是为了保护,如下:
“其 实各个I2C接口工作时只检测高、低电平,管你有没有什么上拉电阻呢!但问题是,你要是直接接电源的来实现高的话,一旦器件拉低时岂不危险?所以,这个上 拉电阻有保护作用。如果你确信直接接电源没问题(比如有短路保护等,呵呵),也可以试一试,问题的关键是主器件要能正确的拉低或置高,从器件要能明确地区 分高、低就可以了,这是问题的关键,当然,还有时序问题,不能混乱!”
根据I2C总线规范,总线空闲时两根线都必须为高
由于I2C接口采用Open Drain机制,器件本身只能输出低电平,无法主动输出高电平,只能通过外部上拉电阻RP将信号线拉至高电平。因此I2C总线上的上拉电阻是必须的!如下图所示:

I2C 总线空闲的时候,两条信号线应该维持高电平。否则,上拉电阻上会有耗电。特别是在上电过程中,IO线上电平也应保持在高电平状态。也就是说:当 Master的I2C使用的是IO软件模拟时,一定要保证该两个IO上电默认均为输入(或高阻)或者输出高电平,切不可默认为输出低电平。IO默认为输入 时,可以通过外部上拉电阻将I2C信号线拉至高电平。
4. I2C上拉电阻大小问题
看了一些文档,还有前辈的提醒,的确I2C上拉电阻也有很大的文章可做啊。有人这样说道:
“最 直接的,牵涉到两方面的问题,首先是功耗的问题,其次是速度的问题,二者是矛盾的!如果你想尽量提高速度,那么就牵涉到总线电容的问题,其实很容易理解, 上拉电阻与总线的电容形成了RC,高速时将直接影响通讯!因为总线拉高时有个充电时间以及高电平的阀值,如果还没有充电到足以保证从器件可以识别的高电平 的阀值时主器件就以为完成了一个总线动作的话,那么通讯肯定是不能进行的!如果你想尽可能降低功耗,那么就要尽可能增大电阻以最大可能的减小电路各部分的 消耗电流从而实现整体降低功耗!但不可能无限大,否则充电时间你会受不了的!”
I2C的上拉电阻可以是1.5K,2.2K,4.7K, 电阻的大小对时序有一定影响,对信号的上升时间和下降时间也有影响,一般接1.5K或2.2K。
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)
标 准模式, 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牺牲速度换取电池使用时间
总的来说:电源电压限制了上拉电阻的最小值 ; 负载电容(总线电容)限制了上拉电阻的最大值
上拉电阻阻值的确定
5. I2C上拉电阻电源问题
这部分我也不是非常了解,因为我的设计中,摄像头和fpga是用的是同一个3.3V,不存在两个电源的问题,但是问题还是得说,如下:
在 部中分应用中,还存在主从设备以及上拉电阻电源不一致的情况,比如Camera模组。在很多设计方案中,Camera模组不工作时,并不是进入Power Down模式,而是直接关闭模组供电VDDS。此时,处理器与模组相互连接的所有信号线都应该进入高阻态,否则就会有电流漏入模组;而对于此时的I2C控 制信号线来说,由于上拉电阻的存在,必须关断上拉电阻电源VDDP。如果上拉电阻使用的是系统电源VDDM(VDDP=VDDM),无法关闭,就会有漏电 流进入模组;因此这种情况下,应该使用VDDS作为上拉电阻电源(VDDP=VDDS),这样上拉电阻电源与Slave电源即可同时关闭,切断了漏电路 径。
另外需要注意的是,在上述应用实例中选择的IO,应该选取上电默认为输入(或高阻)才行。

你可能感兴趣的:(Hardware,硬件,标准)