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

I2C七宗罪之第七罪

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

    [LV.8]以坛为家I

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

    EDA365欢迎您登录!

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

    x
    本帖最后由 alexwang 于 2021-12-13 11:11 编辑
    8 K- }+ p+ _+ E; D" a- T0 R0 n% S2 S& \8 @% q( r1 p
    I2C七宗罪之第七罪——Clock Stretch
    " |  T0 u. Z4 x, B  ^- I) ]
    / Y9 x0 d) x$ g3 O
    EDA365原创  作者:John版主
    2 g) k7 H& c* V$ m. M
    7 {1 O0 {( g8 w5 s+ b
    由于前段时间工作上的事情比较杂乱, 导致第七罪姗姗来迟,既然是大结局,当然就应该让大家更加深刻的来理解I2C.。我们先来复习一下大家共有的对I2C的认知:
    - c+ e4 q+ d3 {$ x
    1. I2C的SCL(Clock)总是由Master来驱动;
    2. I2C的SDA (Data)则不同,Master和Slave分别都驱动。
    6 o  {0 _$ k) x' P9 p+ o3 X0 a
    8 Y3 U3 k, l& s. R6 |+ r
    这两点想必读者都没有什么疑问,因为前面的六宗罪都已经说得比较多了,我们今天要说的是另外一种特殊情况,就是Slave也会去Drive。
    : h- b( k! ]4 |# `7 ]) M
    先来看一个例子,我的一个项目发生过这样一件事情,CPU在访问板子上的另外一颗SENSOR时,一直Fail,我们非常仔细检查了时序,都是准确的。
    6 E9 Y# v3 }# W6 B& P/ I4 y
    注意:这里我们发现是有一个知识盲点,导致一直找不到Root Cause。
    + t0 p& P2 |  o

    7 o% n" [# {) [
    细心的工程师会在测量过程中发现, SCL上有下图这样的尖尖的毛刺,毛刺有矮的也有高的,于是我们认为SCL上这种尖毛刺会导致Slave的状态机误触发,跑飞了。
    $ b8 M  k0 }8 Z9 B+ g& N
    3 \" J9 ~" g& l% W& n
    整整一个星期我们都是这么认为的,尝试各种方法试图去消除这个毛刺。

    8 ]8 U7 U' S$ q4 h8 k" Q
    因为信号从主板通过连接器到子板,我们认为这里的SCL信号很容易受到外部的干扰,比如从空间耦合过来的噪声。

    . `  u# h1 l  s) _
    所以在信号上加电容、加匹配、降低上拉电阻等等,试图滤除毛刺。

    0 r9 w9 K3 A& c7 e, c' Y+ Q$ E
    得到的效果是,即便我们滤除的毛刺有改善,可问题依然存在,只是稍有好转。
    ' m6 R0 C' B) G& j; t
    ; e3 _, s4 q. e3 C- D
    虽然说,现在拿着结果来讲故事听起来很轻松,其实那个过程真的很难受,我们接着往下看。
    . I6 D2 g- ~# i3 F- j9 q
    8 u! ~2 N1 K' F! l1 V8 v- V( @' F4 O- }; `% O
    俗话说三人行必有我师,有个聪明的工程师突然想到I2C有个Clock stretch的机制,来看这张图,我们看到Slave把SCL拉到低,这是什么情况呢?
    $ N* @, _9 z: Z% k0 K5 v
    先来叙述一下Clock Stretch:

    * I3 K9 X5 S3 k1 G" Q
    1. 当Master是高速I2C设备,Slave是Low Speed设备时,Master输出的SCL的频率超出了Slave的承受范围,此时Slave跟不上Master的速度怎么办? Slave就要想办法告诉Master。
    - f* d# {$ W; N* g% W
    , y% p3 ~$ X3 V% n  t5 K+ o
    7 o* c! I9 W+ z# S! _1 P
    % v9 r: c, T9 M5 q" t
    + m0 p2 C1 V" h; t8 {+ c2 W  ~
    大家知道为什么这里会看到右边矮矮的Glitch吗?
    8 r9 f+ J# q# t0 x& Q1 P  o8 i( y
    因为Master此时是想驱动SCL高电平,而Slave却拖住SCL不让变为高电平,这个其实是一种想象,实际测试是看不到的,这里是为了方便大家理解。

    ) V% P% J* Z: ^3 |7 z, S( M7 K4 R
    2. 我们再来看一张图,加深一下理解,Slave会强行把SCL拉低,拖住Master,这和之前我们对I2C的认知是完全相反的,此时Slave 是输出SCL信号,而Master则是检测SCL状态的输入信号。

    ; J& ?9 }/ H- k- ?# D
    举个例子:

    9 p- g( p, `2 Y7 c& Z! a
    正常情况下Master/Slave都是通过在SDA上的ACK信号来确认一笔操作的成功,如图:
    9 Q* a' w  B' e* K$ ?" \
    但是如果Slave来不及怎么办?

    . i5 f& i2 v& r# y; `! g/ Z6 B8 W
    (看下图)Slave直接把SCL信号拖住告知Master:兄弟我还没有准备好,你先等等我啊。

    6 U5 O# s; ]1 Q7 M
    此时Master要做的事情就是乖乖等着,并且一直检测SCL的状态(输入信号),当Slave松开SCL信号,由于上拉电阻的存在,SCL自然变高,Master检测到SCL变高后,才开始检测ACK信号,然后继续下一步操作。

    7 E$ S3 |. q! v* d$ S
    说了那么多I2C stretch,想必大家应该理解了。
    , T6 H3 Q$ N0 z. D$ v
    回到最上面我们遇到的CPU和SENSOR之间的I2C问题,我们测量得到毛刺确实是罪魁祸首。
    9 }- R6 m! {9 v* U
    : x+ J" |6 f& C- R
    因为此时CPU和SENSOR进入了Clock Stretch, Sensor拉低了SCL,而CPU Master不断地检测SCL的状态,期待高电平的到来,此时毛刺就误导了CPU,CPU看到尖的毛刺就认为Slave已经松开了SCL,就立刻开始下一步的动作,此时Slave很冤枉了,自己明明拉低了SCL让Master等着,可是这位兄弟怎么这么不听话呢?

    ) I9 B& `1 e- A$ `: _2 b

    4 _$ c7 W3 t( u6 R" J6 F5 M
    解决的方法很简单,CPU的I2C控制器在进入Clock Stretch时,检测SCL并且判断高电平时有一个De-Glitch的功能,我们之前没有打开,打开后就可以滤除Glitch这样的窄脉冲了。
    - o9 A4 A8 D7 X$ r  W' \7 V* m. ^
    : }' n: i9 N. ^; G8 x5 p
    简单一点讲,就是当检测到一个SCL的高,用一个计数器继续连续计数,只有发现连续的40个高电平才认为是SCL真的拉高了,否则就认为是毛刺,不予理睬。
    3 [8 U6 b6 I; T6 P7 W7 v. ^% t
    聪明的人很多,我们再来说说最近碰到的另外一件关于Clock Stretching的事情。

    * f9 ^7 V2 ?' e3 n( W
    紫色的线有一段半高, 其实原因也简单,就是因为此时Slave拉低SCL,但是Master不支持Clock Stretch,此时就发生了冲突。
      r% f6 N5 [. ^: {# G# k2 a0 `7 {( F4 Y2 S
    Master不支持Clock Stretch,我们就需要通过软件的方式去模拟,此时有两件事需要实现:
    7 l7 v0 B! o1 m
    1. Master要把SCL切换为输入,然后不停检测SCL的状态;
    2. Master在检测SCL状态一定要做De-bounce或者De-Glitch的滤波。
    : c( v" d  K) \. w2 C. {& r* q
    看完了上面的叙述,想必大家都可以理解原因。可是这样会让软件工程师们很麻烦,那么应该怎样绕开Clock Stretch呢? 聪明的工程师总有自己的办法。
    % U/ \/ n6 S& N' n
    我们和Slave芯片的Vendor确认,每次Slave在做ACK后,芯片需要最多5ms的Clock Stretch延时。
    7 a' U! s& t) B7 Q& F- s+ C% P7 e9 Z- P8 S& x, R6 B6 S
    我们拿到这个数字后,软件工程师只要注意在Master每次得到ACK后,先等待5ms后再对Slave做下一笔操作。
    4 S  \+ U& r" X# R6 a; S3 p0 j
    3 y- q6 m* @3 [+ w( l8 q
    在这个5ms期间Master完全不用关心 SCL信号上是高电平和低电平,因为5ms以后Slave肯定松开了SCL,也就是说SCL肯定是高电平了。
    1 |+ t; r( r) u; b1 V, g6 [# n0 h
    这种方法就避免Master的SCL信号切换为输入,还要不停地检测SCL的状态,最重要的是不需要做软件的De-bounce或者De-Glitch算法。
    1 `1 [4 x) n6 |
    2 y% z- A! J& k
    4 T3 f$ ?+ r2 S& ~
    自此I2C的七宗罪就结束了,希望这七宗罪可以cover所有硬件设计过程中的I2C问题,到目前我还没有发现有其它超出这七个范围的问题。
    出品丨EDA365
    原创作者丨John版主
    排版编辑丨陆妹
    - {% W1 h7 U# U2 a/ X) h% a' `7 ~. Y8 M$ @. d
    注:本文为EDA365电子论坛原创文章,未经允许,不得转载。

    9 Q8 q; ^$ A. k/ ~9 [2 S& s

    本帖被以下淘专辑推荐:

    该用户从未签到

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

    点评

    John大神在EDA365硬件微信群里  详情 回复 发表于 2019-11-19 18:22
  • TA的每日心情
    开心
    2023-5-19 15:05
  • 签到天数: 339 天

    [LV.8]以坛为家I

    3#
     楼主| 发表于 2019-11-19 18:22 | 只看该作者
    yongbudl2015 发表于 2019-11-19 18:20
    6 R4 p2 j$ I! t" N8 q0 y8 G8 l各位,有john大神的联系方式吗,很想认识一下,我邮箱
    # m! {. Y. n7 m
    John大神在EDA365硬件微信群里+ ~6 b9 I: S2 j) d- B" J8 D- l

    该用户从未签到

    4#
    发表于 2019-12-18 20:35 | 只看该作者
    谢谢资料分享

    该用户从未签到

    5#
    发表于 2020-5-12 14:21 | 只看该作者

    该用户从未签到

    6#
    发表于 2020-5-12 19:54 | 只看该作者
    好帖,多多学习

    “来自电巢APP”

    该用户从未签到

    7#
    发表于 2020-5-13 08:26 | 只看该作者
    很好,谢谢!

    “来自电巢APP”

  • TA的每日心情
    开心
    2020-6-4 15:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8#
    发表于 2020-5-18 21:46 | 只看该作者
    看完这七宗罪,让我对I2C的认识加深了不少,这是高手

    该用户从未签到

    9#
    发表于 2021-12-10 19:26 | 只看该作者
    这个图片一直在转圈圈,楼主能看下吗

    点评

    感谢提醒,已更新  详情 回复 发表于 2021-12-13 11:12

    评分

    参与人数 1威望 +5 收起 理由
    alexwang + 5 热心人!

    查看全部评分

  • TA的每日心情
    开心
    2023-5-19 15:05
  • 签到天数: 339 天

    [LV.8]以坛为家I

    10#
     楼主| 发表于 2021-12-13 11:12 | 只看该作者
    xtaens 发表于 2021-12-10 19:26
    * d) P4 Q- p; o* r- f! s这个图片一直在转圈圈,楼主能看下吗

      r# @+ v/ `7 B* D- \4 ]' _感谢提醒,已更新
    * H0 p6 r  \' W1 w1 E9 Z6 J1 L
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2026-4-18 21:52 , Processed in 0.156250 second(s), 34 queries , Gzip On.

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

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

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