I2C总线—电平转换

我们先来看一张图,熟悉i2c的人一看,这不是i2c的level shifter电路嘛,在philip的i2c标准里面有,没有啥复杂的。
我们先来解读下这张图,i2c的level shifter是通过nmos管来实现的,有人可能会问,为什么不用pmos呢?一般情况下,只有在外部电源输入端,我们设计inrush电流缓启动或者防反插电路的时候才会用到pmos。
理由很简单, pmos是低电平打开,电源插入瞬间系统其实还没有用于打开mosfet的高电平,所以只能选择pmos, 而nmos体积小,rdson低,在系统内部会更多选择nmos。
我们来举个pmos的用例:
言归正传,我们来继续讨论i2c问题。首先我们要牢牢记住,i2c是open-drain,所以level shifter电路的两边都是上拉电阻rp的,下面讲下这个电路是怎么工作的。
下图是两张i2c的基本操作时序图,分别是master对slave所做的读和写:
我们可以看到, sda一定是双向的,既然是双向的,那么就有四种情况,我们来一一解释level shifter是怎么来cover它们的。(注意:这里面会含有一个facebook的问题,不要忘记自测哦。)
01
第一步,master往slave发数据1
**1) **左边mastersda_1为输出,驱h-3.3v,nmos的vgs=0, 此时nmos关闭;
**2) **右边的slave的sda_2是输入,对外呈现高阻;
**3) **nmos关断和slave为输入,导致sda_2悬空;
**4) **最终sda_2依靠rp2上拉到5v,完成3.3v到5v的转换。
02
第二步,master往slave发数据0
1) 左边mastersda_1为输出,驱low=0,nmos的vgs>0, 此时nmos打开;
**2) **右边的slave的sda_2是输入,对外呈现高阻;
3) nmos打开和slave为输入,导致sda_2=sda_1=0;
**4) **最终sda_2被sda_1拉到0,完成低电平的转换。
03
第三步,slave往master发数据1
1) 右边slave sda_2为输出,驱h-5v;
**2) **左边master sda_1为输入,对外高阻, 被rp1上拉到3.3v;
**3) **nmos 因为vgs=0一直关闭;
**4) **nmos关闭,master sda_1维持3.3v高电平,完成电平转换。
04
第三步,slave往master发数据0
**1) **右边slave sda_2为输出,驱low;
**2) **左边master sda_1为输入,对外高阻, 被rp1上拉到3.3v;
**3) **nmos 因为vgs=0一直关闭;
**4) **nmos关闭,master sda_1为3.3v高电平。
问题来了,我们看到右边的sda_2位low,但是左边的是sda_1位high,那不是失败了嘛,不可能啊,这个电路是好的啊。
我们来看看下一步会发生什么,其实这个问题没有那么难,仔细看看这张图,还是比较容易发现线索的。
我们来揭晓答案: 大家看看上图的nmos下面多了一个二极管,我们把这个二极管叫做body diode,它会在这个时候发挥作用。
**5) **由于左边sda_1为高,右边sda_2为low, body diode导通;
**6) **sda_1被拉低,导致nmos vgs>0 后打开;
**7) **nomo打开后,sda_1和sda_2相当于短在一起;
**8) **最终左边sda_1被右边的sda_2拉低变为low。
我们看到由于体二极管的作用,打开nmos管,使得右边slave输出的l=0顺利到达左边的master sda_1输入端。

热电池产品主体技术和关键性技术综述
利尔达基于LoRa®的人员定位解决方案,为化工园区提供智能安全保障
使用NVIDIA Docker在容器运行时启用GPU
LC串联和并联电路汇总分析
新型智能技术助力家用物联网行业升级,后装市场为市场重心
I2C总线—电平转换
工信部于发布《关于工业大数据发展的指导意见》
超声波雷达流量计流速流量液位三合一
闪迪至尊高速1TB3D版SSD评测 到底值不值得买
灯光需求在升级,灯商的未来到底在于什么?
台积电在南京十二寸厂与设计服务中心正式启动
一加电视产品的真机照曝光,将于9月份在印度正式首发
一加5什么时候上市?一加5最新消息:一加5发布会倒计时,一加5的2大看点分析
电路板上接弹簧的原因
IMP811/IMP812组成的复位电路
四维图新旗下中寰卫星助力黑龙江交通运输创新服务及智慧城市建设
真空断路器合闸失灵原因分析及解决方法
陶瓷生产工艺数字孪生可视化管理平台,推动陶瓷工厂数字化转型新实践
索尼将长期坚持不参与武器开发的原则,不利用人工智能作恶
STM32F407入门开发: GPIO口输出配置