CrazyBingo

I2C上啦电阻到底多大

0
阅读(10675)

I2C上啦电阻到底多大

1. I2C出现的问题

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

wps_clip_image-30660

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

2. I2C电路举例

以下是我的电路的设计,听官哥的,用了4,7K 的上啦电阻

wps_clip_image-19144

下面这个是官哥的

wps_clip_image-30095

还有人说,上啦时候,还不行了,首先要降低速度,其次减小上啦电阻,一直都是听人说,都不知道为什么过,人家都说经验。。。。。人家用到了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总线上的上拉电阻是必须的!如下图所示:

wps_clip_image-16245

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,应该选取上电默认为输入(或高阻)才行。

wps_clip_image-8706

关于verilog I2C设计代码,会在后续文章中发布,磨刀不误砍柴工,预知结果如何,请听下回分解,一步一步来……