找回密码
 注册
关于网站域名变更的通知
查看: 9950|回复: 7
打印 上一主题 下一主题

I2C七宗罪之第三罪

[复制链接]
  • TA的每日心情
    开心
    2023-5-19 15:05
  • 签到天数: 339 天

    [LV.8]以坛为家I

    跳转到指定楼层
    1#
    发表于 2019-1-11 14:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

    您需要 登录 才可以下载或查看,没有帐号?注册

    x
    本帖最后由 alexwang 于 2019-1-11 14:07 编辑
    0 a$ Z% S/ p7 t5 E& N' q# D1 ]
    - R7 E7 F$ d1 H, ], u. P) B  H5 I4 T
    I2C七宗罪之第三罪
    EDA365原创 作者:John

    % x3 W# ^( ]+ @( N* ]  R2 v. P, A
    前面说过I2C第一罪(复位)I2C第二罪(电源),今天来看看:. x8 p0 P; k- v! E2 O( q# S9 X

    9 U: x4 q& i& B$ `# `
    I2C第三罪——时序

    我们都知道I2C是open drain的,不是普通的push-pull,我们也知道open drain的接口信号需要加上拉电阻,那么为什么要用open drain呢?上拉电阻的阻值是否需要计算考量呢? 我们先来说说为什么。

    0 D2 G5 w" d6 o( O( c% L" R2 z7 P8 d

    第一个问题, 为什么要用open drain?

    2 _  g# J0 m- h: i" v# v; @0 m9 n3 a

    请看下图,I2C总线的拓扑往往是由于多个设备直接线与连接在一起的,最常用的就是一个master(一般是一个CPU)和多个slave设备(比如EEPROM, Thermal Sensor等等)。这样子的连接比较简单,容易理解,可是你知道吗?这也会有坑。

    + o) j: \7 Q* ]& o1 f6 N' e


    " ?* ^: `" l% ]1 G

    我们先来谈谈为什么不能用普通的push-pull,而是一定要用open drain,一张图告诉你二者的区别,所谓的push-pull就是由一个PMOS和一个NMOS组成的。

    ; ?( {! E- N2 h# E

    1.当输出高电平时:PMOS打开NMOS关闭;
    2.当输出低电平时:PMOS关闭NMOS打开。
    2 `# `. x, G+ n5 i$ J- M4 [

    3 s0 |6 L7 B% ]9 ~3 W' R, k% [6 D

    如上面的图左,此PMOS和NMOS交替打开和关闭,分别输出方波的高低电平,但是图右的open drain buffer则只有下面的NMOS:


    0 u( I8 k) R% r* B3 a, J

    1.当输出高电平时NMOS关闭,输出处于floating的状态;
    2.当输出低电平时NMOS打开即可。
    - |, P% g3 H' D: e3 v

    如此我们看出,open drain的输出高一定要借助外力,这就是为什么我们检查I2C的设计时,一定要确保外部有上拉电阻才行。那么为什么呢? 如果我们用push-pull会产生什么样的情况?


    5 g8 Q9 q; t: K' e3 V

    上面第一张图已经解释了,I2C是有很多设备线与连接而成,如果采用push-pull的output buffer的话,难免会出现下面的情况,一个设备输出高,另外设备输出低,也就是左边设备的PMOS打开而右边设备的NMOS打开,这样就在VCC和GND之间形成短路,此时大的电流会把设备烧毁,后果是灾难性的。这种现象还有专门的英文名字叫bus contention。

    ( U" k% ~$ N: \! q! w+ E: |( g

    为什么取了个这么奇怪的名字呢?

    7 b7 z/ j) R' H8 b

    这还得从老的那些个公用总线说起,对于I2C来说,解决bus contention的方法很简单,那就是使用open drain,因为一共就两根信号线嘛。但是,老的产品很多并行的共用总线,比如一个32bit甚至64bit的总线,那就不能用open drain了,因为那么多的上拉电阻加在板子上,那PCB工程师可吃不消啊。


    / H( M! O! t! N# b  b

    所以人们就发明了三态门,这又是怎么回事呢 ? 我们知道64bit的数据总线是双向的,如下图所示:

    6 W( k+ E4 d) a+ g3 G1 j


    + @+ R# _. w* ~" Y8 B

    当系统在复位或者紊乱时,总线的所有设备都自动把自己的data buffer设为三态,那么什么叫三态门呢?顾名思义就是:

    , r; y& V8 E" G# T. d4 J0 Q$ K" {+ J3 H

    1.输入、2.输出、3.三态
    / _  t6 L. O6 L$ \/ u# y( ]8 e% M

    接着上图,绿色为输出buffer,红色为输入buffer,当两个buffer都被disable时,就是所谓的第三态输出。


    & ?1 y6 u  C+ A- d, I$ u

    故此,我们总结出一个规律:但凡多个设备直接相连并且双向输出的总线, 要么设计成open drain,要么设计成三态门。回到上面的bus contention,这个名称其实不是来自于I2C这种低速简单的总线,而是来自于高位宽的并行总线。看下图如果左边任意两个buffer同时为输出的话,那么就产生了bus contention,后果不堪设想。

    ; I1 V, V& t+ `0 s6 A) U& }


    2 z; q0 s: s  t" ]3 J
    , g9 R. B- ~2 A- t$ A
    第二个问题,上拉电阻的阻值是否需要计算考量

    * C2 L4 E% K& H, C6 `

    现在我们明白了I2C为什么一定要用open drain加上拉电阻的方式,那再来说说上拉电阻的选择,曾经我在C公司的一块ASR路由器的板子上,有一颗I2C芯片在高温时,就访问不了,但是在常温和低温下就一切正常,其实现在我们根据结果来说这个问题,就没有啥意思了,因为说者有心,听着无意。

    我们刚刚开始压根没有怀疑上拉电阻的事情,各种调试手段都上了,比如更换不同的芯片,用协议分析仪找出高温失败时的读写波形,另外在高温温箱的情况下,捕捉并且定位这种问题也是非常困难的,最痛苦的是这种fail的问题很少能复现。


      L" G* |1 _" q- X( R7 a

    这里我们先来思考一个问题,I2C是latch,不是flip-flop,再通俗一点说就是电平触发,不是边沿触发,所以通常情况下,我们是不关心上升沿和下降沿的,可是偏偏问题就出在这里,我们的芯片会对SCL和SDA的边沿提出要求,这又是为什么呢?

    , U% R5 J! r' i7 ]


    , g5 E. k& u) H: y0 i8 U) Q

    先把这和个问题留着,看下面这张图,当SDA输出高电平时,是蓝色的箭头,有VCC通过上拉电阻和电容充电,而当SDA输出低电平时,是红色的箭头

    - A# Y; z1 P2 z& H" c" j4 a9 g


    1 l1 i0 P4 _3 W: f5 C

    我们很容易就能看出,输出高比较慢,因为有电阻和电容的阻挡,需要通过RC进行指数充电,而输出低电平就比较快,因为从电容放电到地全程无遮挡啊,所以下面我们之研究上升沿。

    + d) b9 J3 p) O- {

    # y/ _& w+ a2 l0 i

    这里有人会问,这里的电容是从哪里来的,问得好。我们知道复杂的大板子上面芯片之间的距离比较远,走线的杂散电容比较大,另外板子的I2C接的芯片数量比较多,每个芯片的输入pin的电容加起来,就形成了这里的一个总的电容,为了描述方便,我们就用一个电容代替。


    - X3 I+ T) c+ H% |( i* o3 N& V

    现在我们来回答为什么I2C会Rise time提出要求呢? 太慢了会有什么问题呢?我们先看下面的表格,I2C其实也有fast mode的形式,据说I2C的频率也会有到5Mhz的,图表中我只看到400Kbit/s,我们在表格的最右面已经看到对上升时间的要求随着频率(或者叫速率)的提高,也越来越苛刻。

    我们来用一张图来表达,当上升时间太慢会产生什么样的问题,图中SCL信号如果Tr够快的话,就是红色的信号,而Tr不达标太慢的话,那么就会是蓝色的信号。

    5 |% F, |* J+ n8 V* L6 G' i; f, K

    1 _' S- R1 b# d: s
    不难看出,蓝色线越过绿色的threshold的时间太短,导致接收端不能正确识别出高电平,当然接收端也就不能正确latch SDA的数据了。
    $ \5 ?0 d  U& T3 o1 f+ k8 }

    好的,现在我们明白了I2C信号的上升沿是有要求,尽管只是Latch,但是对边沿仍然有要求,而且只对上升沿,下降沿因为很快,所以无需担心。下面我们来讨论什么情况下会让I2C的Tr太慢导致问题呢?请参考上面有一张RC充电的公式以及下面这张图, 我们看到t=RC, 也就是两个因素:

    9 U+ C- t" X2 C+ Z# V

    1.电阻值、2.电容值
      _3 q4 t# {; i; |% w# \

    , |* S3 X* P- c+ ^( U- }# D


    9 k1 Z' m  V8 S" q

    首先来说电容值,这个是我们改变不了的,如前面所说大板子面积大,总线上的设备多,走线非常复杂,导致各种芯片的输入电容相加,再加上又长又复杂的走线带来的杂散电容,我们是无法改变的,除非重新设计板子,加双向buffer,但是打工的工程师都知道,老板不允许啊。


    : ^4 w0 B" r2 X2 R7 \  ^, s

    我们能改变的其实就是电阻了,我们先来看下面示意图,通过适当调整电阻值,我们可以获得比较合理的上升时间,满足接收芯片的要求并有一定的margin就可以了。


    ' x0 l4 P/ a5 L+ K  X8 E3 X/ o


    - Q8 {: v9 o! {5 A! x

    但是电阻值的改变是需要精心计算的,不能太小也不能太大,而是要合理,我个人建议分为两步走:

    ! `; F, E7 h: l- {

    1.先确定最大值:取值太大的话,会导致两个后果,一是芯片接收端驱动能力不足,而是上升时间不够,下面的两个公式分别对应这两个现象,我们去其中更加小的值。
    3 b2 ^+ q6 @' o7 |/ ~( u; d2 Z
    ' q% R; t% b" u/ V$ U; a
    2.再确定最小值:电阻取值太小的话,会导致Vol太大,芯片低电平下不来,我们举个极端的例子,就是上拉电阻为0时,不能产生低电平,下面的两个公式都是一个意思,一个精确考虑了电流,一个精确考虑电压,思路都是一样的。
    ; V; v4 O' G& P

    , v; @4 _$ m2 ?# c$ e( n# u5 T3 a

    最后揭晓一下前面我在C公司遇到的问题,经过很多实验,我们证明了I2C设备确实对信号的上升时间有要求,尽管只是电平触发的Latch。很多事情当你遇到了,历经苦难地解决了,才能记得清楚牢靠,也最能理解。希望工程师们在解决一个问题后,不要忙着开心欢喜,而是要多做总结,这样才能真正变成自己的经验。


    ! x6 {9 z- y! F, Y, O# _7 J

    注:本文为EDA365电子论坛原创文章,未经允许,不得转载。

    ; p2 i5 I2 f( e* u7 X

    本帖被以下淘专辑推荐:

    该用户从未签到

    3#
    发表于 2019-7-2 11:25 | 只看该作者
    非常好的知识,支持

    该用户从未签到

    4#
    发表于 2019-11-19 18:18 | 只看该作者
    各位,有john大神的联系方式吗,很想认识一下,我邮箱2929219135@qq.com

    该用户从未签到

    5#
    发表于 2019-12-18 20:35 | 只看该作者
    谢谢资料分享
  • TA的每日心情
    开心
    2023-6-8 15:40
  • 签到天数: 2 天

    [LV.1]初来乍到

    6#
    发表于 2020-3-28 07:16 | 只看该作者
    学习学习

    “来自电巢APP”

  • TA的每日心情
    开心
    2023-11-2 15:14
  • 签到天数: 34 天

    [LV.5]常住居民I

    7#
    发表于 2020-5-9 23:46 | 只看该作者

    该用户从未签到

    8#
    发表于 2020-5-10 10:44 | 只看该作者
    很好,写的好????????

    “来自电巢APP”

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 14:19 , Processed in 0.187500 second(s), 28 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表