I2C七宗罪(连载)

  

  I2C第七罪

  由于前段时间工作上的事情比较杂乱, 导致第七罪姗姗来迟,既然是大结局,当然就应该让大家更加深刻的来理解I2C.。我们先来复习一下大家共有的对I2C的认知:

  1. I2C的SCL(Clock)总是由Master来驱动;

  2. I2C的SDA (Data)则不同,Master和Slave分别都驱动。

  这两点想必读者都没有什么疑问,因为前面的六宗罪都已经说得比较多了,我们今天要说的是另外一种特殊情况,就是Slave也会去Drive。

  先来看一个例子,我的一个项目发生过这样一件事情,CPU在访问板子上的另外一颗SENSOR时,一直Fail,我们非常仔细检查了时序,都是准确的。

  注意:这里我们发现是有一个知识盲点,导致一直找不到Root Cause。

细心的工程师会在测量过程中发现, SCL上有下图这样的尖尖的毛刺,毛刺有矮的也有高的,于是我们认为SCL上这种尖毛刺会导致Slave的状态机误触发,跑飞了。

  整整一个星期我们都是这么认为的,尝试各种方法试图去消除这个毛刺。

  因为信号从主板通过连接器到子板,我们认为这里的SCL信号很容易受到外部的干扰,比如从空间耦合过来的噪声。

  所以在信号上加电容、加匹配、降低上拉电阻等等,试图滤除毛刺。

  得到的效果是,即便我们滤除的毛刺有改善,可问题依然存在,只是稍有好转。

  虽然说,现在拿着结果来讲故事听起来很轻松,其实那个过程真的很难受,我们接着往下看。

  俗话说三人行必有我师,有个聪明的工程师突然想到I2C有个Clock stretch的机制,来看这张图,我们看到Slave把SCL拉到低,这是什么情况呢?

 先来叙述一下Clock Stretch:

  1.当Master是高速I2C设备,Slave是Low Speed设备时,Master输出的SCL的频率超出了Slave的承受范围,此时Slave跟不上Master的速度怎么办?Slave就要想办法告诉Master。

  大家知道为什么这里会看到右边矮矮的Glitch吗?

  因为Master此时是想驱动SCL高电平,而Slave却拖住SCL不让变为高电平,这个其实是一种想象,实际测试是看不到的,这里是为了方便大家理解。

  2.我们再来看一张图,加深一下理解,Slave会强行把SCL拉低,拖住Master,这和之前我们对I2C的认知是完全相反的,此时Slave 是输出SCL信号,而Master则是检测SCL状态的输入信号。

  举个例子:

  正常情况下Master/Slave都是通过在SDA上的ACK信号来确认一笔操作的成功,如图:

  但是如果Slave来不及怎么办?

  (看下图)Slave直接把SCL信号拖住告知Master:兄弟我还没有准备好,你先等等我啊。

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

  说了那么多I2C stretch,想必大家应该理解了。

  回到最上面我们遇到的CPU和SENSOR之间的I2C问题,我们测量得到毛刺确实是罪魁祸首。

  因为此时CPU和SENSOR进入了Clock Stretch, Sensor拉低了SCL,而CPU Master不断地检测SCL的状态,期待高电平的到来,此时毛刺就误导了CPU,CPU看到尖的毛刺就认为Slave已经松开了SCL,就立刻开始下一步的动作,此时Slave很冤枉了,自己明明拉低了SCL让Master等着,可是这位兄弟怎么这么不听话呢?

  解决的方法很简单,CPU的I2C控制器在进入Clock Stretch时,检测SCL并且判断高电平时有一个De-Glitch的功能,我们之前没有打开,打开后就可以滤除Glitch这样的窄脉冲了。

  简单一点讲,就是当检测到一个SCL的高,用一个计数器继续连续计数,只有发现连续的40个高电平才认为是SCL真的拉高了,否则就认为是毛刺,不予理睬。

  聪明的人很多,我们再来说说最近碰到的另外一件关于Clock Stretching的事情。

  紫色的线有一段半高, 其实原因也简单,就是因为此时Slave拉低SCL,但是Master不支持Clock Stretch,此时就发生了冲突。

  Master不支持Clock Stretch,我们就需要通过软件的方式去模拟,此时有两件事需要实现:

  1. Master要把SCL切换为输入,然后不停检测SCL的状态;

  2. Master在检测SCL状态一定要做De-bounce或者De-Glitch的滤波。

  看完了上面的叙述,想必大家都可以理解原因。可是这样会让软件工程师们很麻烦,那么应该怎样绕开Clock Stretch呢? 聪明的工程师总有自己的办法。

  我们和Slave芯片的Vendor确认,每次Slave在做ACK后,芯片需要最多5ms的Clock Stretch延时。

  我们拿到这个数字后,软件工程师只要注意在Master每次得到ACK后,先等待5ms后再对Slave做下一笔操作。

  在这个5ms期间Master完全不用关心 SCL信号上是高电平和低电平,因为5ms以后Slave肯定松开了SCL,也就是说SCL肯定是高电平了。

  这种方法就避免Master的SCL信号切换为输入,还要不停地检测SCL的状态,最重要的是不需要做软件的De-bounce或者De-Glitch算法。

  自此I2C的七宗罪就结束了,希望这七宗罪可以cover所有硬件设计过程中的I2C问题,到目前我还没有发现有其它超出这七个范围的问题。

第一罪https://www.eda365.com/forum.php?mod=viewthread&tid=187412&highlight=I2C%C6%DF%D7%DA%D7%EF

第二罪https://www.eda365.com/forum.php?mod=viewthread&tid=187961&highlight=I2C%C6%DF%D7%DA%D7%EF

第三罪https://www.eda365.com/forum.php?mod=viewthread&tid=191884&highlight=I2C%C6%DF%D7%DA%D7%EF

第四罪https://www.eda365.com/forum.php?mod=viewthread&tid=197543&highlight=I2C%C6%DF%D7%DA%D7%EF

第五罪https://www.eda365.com/forum.php?mod=viewthread&tid=201223&highlight=I2C%C6%DF%D7%DA%D7%EF

第六罪https://www.eda365.com/forum.php?mod=viewthread&tid=257204&highlight=I2C%C6%DF%D7%DA%D7%EF

I2C Clock Stretch相关推荐

  1. STM32软件 I2C Master (不支持Clock stretch)

    软件 I2C 搞定了. 继续搞案子. 没事换换换,STM32F103C8 换 C6. 给自己找事! Header File <SoftIIC.h> /******************* ...

  2. IIC clock strech【转载IIC七宗罪之IIC clock stretch】

    由于前段时间工作上的事情比较杂乱, 导致第七罪姗姗来迟,既然是大结局,当然就应该让大家更加深刻的来理解I2C..我们先来复习一下大家共有的对I2C的认知: 1. I2C的SCL(Clock)总是由Ma ...

  3. IIC 关于时钟拉伸问题 clock stretch

    转载请标明出处 时钟拉伸(Clock stretching) clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretchin ...

  4. Linux clock子系统【3】-i2c控制器打开时钟的流程分析(devm_clk_get)(consumer侧)

    文章目录 前言 一.硬件流程图 二.晶振设备树描述 三. I2CX时钟设备树描述 四.驱动中获得/使能时钟 4.1 流程源码分析 4.1.1 devm_clk_get(struct device *d ...

  5. I2C的七宗罪——I2C使用中的坑

    I2C的七宗罪--I2C使用中的坑 I2C是使用频率非常高的一种通信西协议,包括时钟SCL和数据SDA两根通信线,对于硬件来说十分简洁高效,下图是每个数据代表的含义和时序图. I2C虽然只有两根线,但 ...

  6. STM32 (十二) I2C

    一.简介 IIC 简介 IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备.多用于主控制器和从器件间 ...

  7. 【STM32】I2C相关函数和类型

    00. 目录 文章目录 00. 目录 01. I2C简介 02. 相关类型 03. 相关函数 04. 结构体封装 05. 预留 06. 附录 07. 声明 01. I2C简介 I2C(内部集成电路)总 ...

  8. 【STM32】I2C详解

    00. 目录 文章目录 00. 目录 01. I2C简介 02. I2C主要特性 03. I2C功能说明 04. I2C中断 05. I2C相关寄存器 5.1 I2C 控制寄存器 1 (I2C_CR1 ...

  9. imx6 i2c分析

    本文主要分析: 1. i2c设备注册 2. i2c驱动注册 3. 上层调用过程参考: http://www.cnblogs.com/helloworldtoyou/p/5126618.html 1. ...

  10. STM8 I2C从机

    宏定义 #define SLAVE_ADDR 0x51 #define I2CSPEED 400000 //i2c速度 stm8l051 i2c从机初始化 /* I2C clock Enable*/C ...

最新文章

  1. Matlab中bwmorph函数的使用
  2. HTML做frame跳转设置响应头,X-Frame-Options header响应头如何配置
  3. 安装ssr_12月23日先锋首测启动,累计登录3天必得SSR!
  4. react技术栈实践
  5. 大型网站的架构演进从一个电商网站开始
  6. mysql binlog查看工具_【使用 Rust 写 Parser】4. 解析 binlog
  7. https://sysdig.com/
  8. 光刻机的“崛起秘密”,第一本ASML的企业成长传记来了!
  9. npm 报错cb.apply is not a function
  10. easyui图标代码
  11. 一次完整的http请求过程是怎样的?
  12. 商鼎云PC端正式亮相—开启内测通告
  13. document.getelementbyid是什么意思
  14. 使用Windows命令行reg控制注册表键值
  15. 【C语言】蓝桥杯/ACM竞赛入门 A+B for Input-Output Practice
  16. 中台战略-第五章、中台建设方法论
  17. OpenCV 透射变换
  18. 如何听广播来学计算机,MAC使用技巧之苹果itunes如何收听国内的广播?
  19. [资源帖]SIGGRAPH2016 下载地址
  20. 用Python ttkbootstrap 带你制作账户注册信息界面

热门文章

  1. Oracle 官网共享账号
  2. 在计算机里打折的符号是哪个,计算器中的符号
  3. excel高级筛选怎么用_Excel高级筛选使用
  4. 计算机dvd驱动错误,修正:一个错误发生在弹出的CD/DVD驱动器在Windows 10
  5. 已取消到该网页的导航
  6. 谷歌浏览器二维码识别插件,解决你二维码识别跳转难题
  7. 华为OD机试题:按区间反转文章片段
  8. VmWare配置网络桥接模式,实现虚拟机联网。
  9. 【转】京东抢购服务高并发实践
  10. August 2007