由I2C data信号低电平不到0,再思考I2C及GPIO

这篇具有很好参考价值的文章主要介绍了由I2C data信号低电平不到0,再思考I2C及GPIO。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近做项目测试时发现I2C data信号低电平不能完全到0电平,如下图

由I2C data信号低电平不到0,再思考I2C及GPIO

量测到低电平最大值150mV左右,检查SOC及负载端SPEC,低电平最大值都是VIL max =0.35VDD 对于1.8V的IO 电平,这个电压是0.35x1.8=0.63V 显然150mV<<630mV,不影响逻辑判断,因此从项目的角度考虑,此问题并不影响项目,可以忽略。只是做项目的角度考虑,此问题就可以结束了。

但拍电视也不能在第一集就结束吧,显然还需要继续分析……

但要深究原因,那就又得重新抓起……,那就从新抓起吧,反问:为啥会出现不到0的情况?

最容易想到的是内部MOS有压降,啥情况下有压降,电流大了会有压降,对,所有的MOS在开启时都有Ron,虽然都很小,但在电流大的时候这个压降在所难免,查了下高通IO 电压压降,显示最大50mV,也就是正常GPIO在低电平50mV就是最大。

由I2C data信号低电平不到0,再思考I2C及GPIO

那为啥这里会这么大,原因是I比较大,正常使用GPIO,上拉会选择4.7K-100K,4.7K 算是比较强的上拉了,而这里I2C大部分在2.2K,而这里测试时上拉是1k。因此理论上通路的电流是1.8/1k=1.8mA,正常GPIO驱动电流是2-16mA step 2mA,按理说也是够用。

为了验证是电流能力问题,做了两个实验,

1.将通路电流降低,即将上拉改大,修改到2.2K

2.将通路电流能力提高,即将MOS的电流能力增加修改到4mA.

如上两个验证下来都会降低低电平时的电压,能降到100mV左右。

从软件配置看,默认的I2C电流是2mA,默认GPIO也是2mA.

另外查了下CSDN类似的问题,如下这位仁兄做实验和我的类似,不过他最后将I2C的pad改成了GPIO模式,然后低电平就到0了。

MT6739 Android 8.1 I2C口电平转换低电平无法到0V的解决办法_杨涂涂的博客-CSDN博客_i2c低电平无法拉到0v

基于此:有两个问题

1.为什么GPIO模式能到0,而I2C模式不能到0?

2.I2C 的GPIO能修改为Push-Pull吗?

我们知道GPIO模式pin配置通常是Push-pull(PP),而I2C 配置是OpenDrain(OD),为了说明简单,下文称为PP和OD。

如下是STM32 GPIO框图,Push-pull电路看的很清楚

由I2C data信号低电平不到0,再思考I2C及GPIO

 高通SOC内部电路类似,如下只是降Push-pull和Pull Up这些细节电路用了框表示

由I2C data信号低电平不到0,再思考I2C及GPIO

 先思考第一个问题

第一个问题的描述并不准确,它是基于场景的描述,并没有给出指定的条件,如果修改为:

同样的GPIO MOS(内部N-MOS+P-MOS不变)电路情况下,为什么Push-pull能到0,而OD不能到0?

这样的问题,答案是问题不准确,如果是内部电路不变(至少P-MOS 在PP和OD下是同一个)那么如果PP能到0,OD也能到0(在上升和下降时间很短的情况,如上的波形能看出上升和下降时间都很短)。

只有在上升和下降时间很长时才有可能出现PP能到0,而OD不能到0,因为OD的上升和下降tao=RC,R 更大。而没有外加电容时寄生电容大概是pF 级别,低速电路都可以忽略。但那位仁兄加了MOS后的下降沿看起来很大,并不能完全忽略。

因此回到该场景下,为什么在那位仁兄的SOC上,GPIO的低电平能到0,而I2C的低电平不能到0,还是因为MOS电流能力,I2C的电流默认是2mA,GPIO 他期望的是没有电流限制。没有看到配成GPIO时的电流。

GPIO电路通常是Push-pull电路,即N-MOS和P-MOS都处在开关状态,要么打开要么关闭,那么GPIO又是怎么去控制电流的呢?

我们知道,只有MOS处在可变电阻区时(放大区),电流才能变化,但此时DS之间的压降很大,GPIO肯定不能用这种模式。

猜想:1.内部可能是多个Push-pull电路并联

        2.使用Jfet之类的fet控制,在电流可控区域依然没有压降,这个猜想出现不到1分钟就自我否定了,原因是Jfet在电流可变时也有压降,另外现在的SOC都是CMOS电路,那就说明了是MOSFET构成的。

因此只有1是可能的猜想,为了验证这个猜想,找了很久资料,最终找到确实是并联了PP电路。

如下是它提供的电路

Digital output with programmable current

The current drive of the output pad is an important parameters for low-power application. Using a 2mA current limits the power dissipation but provokes low speed switching. When 2mA and 4mA drivers work simultaneously, a 6mA current is available to charge and discharge the output signal faster, at the cost of a higher power dissipation.

由I2C data信号低电平不到0,再思考I2C及GPIO

 由I2C data信号低电平不到0,再思考I2C及GPIO

由I2C data信号低电平不到0,再思考I2C及GPIO 因此如果是2-16mA 可编程,那么内部应该是2||4||6||8 4个PP电路。而为了减少功耗,默认通常是2mA.

查到这里已经查到了IC设计的基本概念,属于电路设计的上游,由此本职工作要做好,经常会涉及上下游的知识。做好并不容易。

基于此PP能到0,而OD不能到0,本质上内部走的不是同一个电路。

 回到第二个问题:I2C能用PP模式吗?

回想I2C通信过程,大概是maste 发送8bit数据,等待slaver 回复ack,或者反过来,因此在SOC端,发送8bit再读1bit,摘取协议中电路如下。

由I2C data信号低电平不到0,再思考I2C及GPIO

 如主机为PP,从机依然是OD,那么主机发送数据(高低电平)还是按照GPIO传输一样输出,第9bit时不需要输出,此时总线设置为输入,数据走如上标注2的位置,因此也不冲突,这样看,在单主机多从机的情况下,主机发送是可以设置为PP。

但I2C是多主机多从机的通信协议,在多主机时,主机如果都设置为PP,那么存在短路情况,因此肯定不行,协议规定OD是合理的。

由I2C data信号低电平不到0,再思考I2C及GPIO

基于以上这些理解,继续查看之前的波形,发现第9bit 时电平能回到0,而9bit是slave发送给maste的,因此再次判定是SOC内部的N-MOS的驱动不够。

(严格意义上说还有走线阻抗的存在,因为测试时是偏向slave负载端测试的,这样走线的阻抗都计算在了maste端的RS上,但毕竟很小,没深究)

由I2C data信号低电平不到0,再思考I2C及GPIO

因此如上图就是maste发送给slave的数据,如果反过来slave发送数据给maste,那么不能到0的应该只有ack

由I2C data信号低电平不到0,再思考I2C及GPIO

 数据流向及测试位置示意。

由I2C data信号低电平不到0,再思考I2C及GPIO

总结:

1.I2C data 低电平不能到0是由于通路电流较大,GPIO 内部MOS 内阻分到了部分电压,通路电流或者增加通路电流能力都可以降低此电压,通常都在SPEC范围内,可不修改。

基于不到0 的电平可以判断数据的流向。

2.GPIO 内部输出电流能力控制是通过切换或者并联不同的PP电路实现,因此PP模式和OD模式时可能并不是同一个电路,尽管他们都是由同一个pin输出。

3.I2C 修改为Push-Pull的操作,只在单主机上可行,多主机时依然要遵守协议。(这一点可能不准确,有经验的同学帮忙评论留言)文章来源地址https://www.toymoban.com/news/detail-423028.html

到了这里,关于由I2C data信号低电平不到0,再思考I2C及GPIO的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一次严重的I2C信号错误

    制作电池电量计测试板,使用I2C信号与主板通信,中间连接20cm的2.54排线,两侧电平均为3.3V。 主板无法访问电量计芯片。 I2C信号波形如下: 半高电平的问题跟随示波器的通道2,有点匪夷所思,但是对排除信号线路问题有一定帮助。 解决问题的过程中参考了以下文章: 1、

    2024年02月12日
    浏览(43)
  • Linux Kernel 4.19+内核使用GPIO模拟I2C的方法

    1.修改内核配置文件,使内核支持GPIO模拟I2C 2.对应的dts里面增加GPIO模拟I2C的设备树 编译后烧写,会发现/dev下多了一个i2c总线,多出来的那个就是了。

    2024年02月16日
    浏览(51)
  • 嵌入式I2C 信号线为何加上拉电阻(图文并茂)

    IIC 是一个两线串行通信总线,包含一个 SCL 信号和 SDA 信号,SCL 是时钟信号,从主设备发出,SDA 是数据信号,是一个双向的,设备发送数据和接收数据都是通过 SDA 信号。   在设计 IIC 信号电路的时候我们会在 SCL 和 SDA 上加一个上拉电阻。   今天就来分享下,为什么要在

    2024年02月19日
    浏览(51)
  • 什么是I2C,I2C怎么用,从实例波形分析I2C读写

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 今天分享的主题是I2C通信。接下来从I2C是什么,怎么用,以及以时钟外设读写作为实例进行分析。 I2C(Inter-Integrated Circuit) ,也可以叫IIC、I2C,译作集成电路总线,是 两线式串行通信总线 ,用于设备

    2024年01月19日
    浏览(58)
  • I2C知识大全系列四 —— I2C驱动之Linux下的I2C

    Linux 系统定义了 I2C 驱动体系结构。在 Linux 系统中, I2C 驱动由三部分组成,即 I2C 核心 、 I2C 总线驱动 和 I2C 设备驱动 。这三部分相互协作,形成了非常通用、可适应性很强的 I2C 框架。 I2C核心 I2C 核心提供了 I2C 总线驱动 和 设备驱动 的 注册 、 注销方法 , I2C 通信方法

    2024年02月07日
    浏览(58)
  • I2C总线 | I2C总线介绍

    目录 I2C 总线 | I2C 总线介绍 I2C 总线介绍 I2C有如下特点: I2C 总线术语 I2C 总线位传输 IIC总线数据传输 1.字节格式 2.应答响应 IIC 总线寻址方式 1.7位寻址 2.10位寻址 快速和高速模式 1.快速模式 2.高速模式 I2C ( Inter - Intergrated Circuit )总线(也称 IIC 或 I2C )是由 PHILIPS 公司开发

    2024年02月04日
    浏览(57)
  • 【STM32 CubeMX】I2C层次结构、I2C协议

    在STM32 CubeMX环境中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于连接各种外设和传感器。理解I2C的层次结构、协议和硬件结构对于STM32微控制器的开发至关重要。通过STM32 CubeMX提供的图形化配置工具,我们能够更轻松地理解和配置I2C通信,同时深入了解

    2024年02月22日
    浏览(81)
  • 【I2C 通信的工作原理是什么?Arduino 和 I2C 教程】

    在本教程中,我们将了解 I2C 通信协议的工作原理,我们还将使用 Arduino 板和使用该协议的传感器制作一个实际示例。您可以观看以下视频或阅读下面的书面教程。 I2C通信总线非常流行,并被许多电子设备广泛使用,因为它可以很容易地在许多需要主设备与多个从设备甚至多

    2024年02月05日
    浏览(40)
  • I2C用法和MSP430F5299上的I2C

    1. 二线传输; 2. 无中心主机; 3. 软件寻址; 4. 应答式数据传输过程; 5. 节点可带点接入或撤出; 6. IIC的SCL和SDA都需要接上拉电阻,保证空闲状态的稳定性; 由主机发出起始信号和停止信号。 起始信号: 当SCL保持为高电平时,SDA产生一个下降沿,则代表起始信号; 停止信

    2024年02月13日
    浏览(53)
  • I2C协议介绍以及HAL库实现I2C对SHT30温湿度采样

    (1)I2C协议简介 I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信。 12C Bus(IIC, Inter-Integrated Circuit Bus)是由一根数据线SDA用于收发数据,一根时钟线SCL用于通信双方时钟的同步,利用上拉电阻将它们拉成高电平(表示总

    2023年04月24日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包