0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

I2C地址跳变问题的调试案例

CHANBAEK 来源:硬件系统架构师 作者:Timothy 2023-11-22 10:51 次阅读

引言:I2C作为使用最为广泛的通讯接口,调试各类I2C器件,大家应该都很轻车熟路。一般对于外挂电阻配置器件的I2C地址,例如电阻上拉之后,器件的地址就会固定下来不再变动,但是今天给大家分享一个自己的调试案例,即I2C地址跳变问题。

1.问题背景

该器件对外一起只有四个引脚:SDA、SCL、INT、RESET,其中对外输出中断引脚INT兼具器件地址设定功能,将INT上拉至VDDIO,地址为0X8A,INT无上拉,地址为0X88。

图片

图3-1:控制线部分原理图

在上电启动之后,连续运行Linux地址查询命令,如图3-2所示,查询地址为0X45(7位地址,按8位即0X8A)。

图片

图3-2:读取地址为0X45

断电再重启,然后运行查询命令,如图3-3所示,会偶发检测到地址跳变为0X44(0X88)。

图片

图3-3:重新下电上电后读取地址

此时正确地址应该是0X45,所以偶发检测地址跳变为0X44说明器件上电初始对INT处的配置发生了误判。

2.怀疑点和排除过程

前端设备的高低电平影响

因为INT引脚是兼具I2C地址配置,如果INT存在初始拉低等情况,就会影响器件判断地址,在Application里面讲到:TP2912A通过在复位期间捆扎INT引脚来提供两个设备地址,0x88或0x8A。引脚上的上拉电阻器使设备地址为0x8A,如果电阻器不存在,则内部下拉电阻器的设备地址将为0x88。在选择设备地址时要注意,在判断复位期间,一些前端芯片可以强制驱动INT信号的逻辑低或高。在这种情况下,设备地址的检测可能是错误的,因为前端芯片驱动的逻辑电平与上拉或下拉电阻器无关,如果无法避免这些情况,则如果设备地址选择正确,则可以通过读取寄存器0xfe中的设备ID来实现软件工作。

图片

图3-4:推荐INT Mode下读取地址程序

最开始测量INT点的电平,大约1.4V,所以其实INT引脚一直是高电平没有问题,然后断开INT与SOC的连接,继续上下电读地址,依然有I2C地址跳变问题存在,并且断开后单独测量SOC端的INT,为低电平0V,说明SOC没有配置这个引脚,没有使用到INT功能(软件端也确认过),所以排除前端设备影响INT的配置。

引脚耦合

引脚耦合这个理论上存在,但是实际中很难遇到,并且高达1.8V和0V的压差,耦合能量达到这么多几乎不可能,所以理论上排除引脚耦合问题。

上拉阈值临界

手册上的VDDIO是3.3V,并没有标注1.8V可以使用,使用1.8V是FAE的建议,也为了和前端SOC电平适配,所以是否1.8V处于一个临界上拉阈值导致器件判断失真。为了验证这一疑点,将INT上拉电阻取消,此时INT处于悬空(同时断开前级),地址应该固定为0X44,但依然存在地址跳变,说明也不是上拉阈值临界,注意这里的INT悬空并不等同于下拉到GND。

时序排查

考虑到是上下电过程中触发地址误判,不断电情况下地址不会变动,所以会不会存在这样一种时序情况:在VDDIO还在上电的过程中,器件就开始读INT的配置,此时电压临界。测量器件上电时序如下图3-5 ,其中C1是DVDD(1.2V),C2是RESET,C3是1.8V,C4是XTI(27MHz晶振输入)。

图片

图3-5:关键信号上电时序

从图中可以看到,在XTI还在起振时,DVDD还处于上升阶段,此时芯片逻辑核心可能还没有开始工作,逻辑核心影响了器件读I2C地址。Application里面也提到了这一时序要求:由于POC(上电序列)功能在上电/断电事件期间在芯片内部操作,因此对每个电源树的上电和断电序列没有要求,复位应在晶体振荡器稳定后至少10个周期保持低电平,如图3-6所示:

图片

图3-6:Application推荐Reset操作

为了验证这一猜想,首先触发一次0X44地址,然后不断电,给RESET一个复位拉低,然后再读地址,看地址是否会恢复到0X45,当然这里也可以使用手动复位,将RESET引脚手动接一下GND。

图片

图3-7:不断电验证地址恢复

如图3-7所示,触发之后0X44变为0X45,验证有效,说明和猜想一致,最终确定是时序的问题。

3.如何修正

修正也很简单,如图3-8所示,前端SOC在上电之后10ms将Reset拉低,拉低时间≥10us。

图片

图3-8:复位时间预估

4.总结

I2C地址跳变的问题比较难遇到,因为大多数器件是独立配置地址,如果是GND配置,自然不会考虑时序问题,但如果是上拉配置,就需要注意电压时序问题,在系统起来之前,配置电压就应该完全到位,如果有类似的情况或者电压无法调整,此时Reset不失为一种可靠的方法,不断电的情况下复位系统逻辑,器件就会重新去读地址然后写入寄存器,另外这一步需要放置主程序运行之前,否侧运行中地址变化会发生通讯中断。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • 引脚
    +关注

    关注

    16

    文章

    1044

    浏览量

    48966
  • 通讯接口
    +关注

    关注

    2

    文章

    77

    浏览量

    16066
  • I2C器件
    +关注

    关注

    0

    文章

    2

    浏览量

    6489
收藏 人收藏

    评论

    相关推荐

    I2C规范,I2C总线原理

    I2C规范,I2C总线原理1 序言
    发表于 04-09 18:34

    I2C 随机读 地址的问题

    I2C 随机读 操作过程 开始--发送器件地址(写)--ack--发送字节地址--ack--开始--发送器件地址(读)--ack--接受数据--no ack--停止 我的问题是 发送两
    发表于 12-05 08:59

    I2C

    各位这个bus address 0x51 0x50是不是从机的地址啊?我看I2C的协议里面的地址是7bit的,那最后一位为0,代表主机向从机写数据,最后一位为1,代表主机从从机读数据,是这样的吗?   谢谢大侠解答
    发表于 06-24 01:28

    I2C只发送地址

    你好,我想从我的PIC32 MZ中使用I2C作为主控器。我使用的是和声样本共现,我只看到第一个地址字节。我从来没有看到缓冲区的其余部分。有人以前有过这个问题吗?谢谢。 以上来自于百度翻译 以下
    发表于 10-15 16:19

    I2C总线万能程序C语言

    ; SomeNOP();//数据线保持高,时钟线从高到低一次I2C通信开始SDA=0; SomeNOP(); SCL=0
    发表于 12-03 17:18

    关于I2C设备地址(7位)的误解

    I2C Extend 软件中,存在设备设置(7位或10位),当选择7位时,然而发现要使I2C读/写工作,应左移1位I2C地址(左移LSB为0)。这没关系,因为在
    发表于 01-08 09:33

    LIS2DH错误的I2C地址

    对象(LIS3DH只有3个额外的ADC通道......):相同的寄存器,相同的设置和理论上相同的I2C地址,(当SA0 = 0时为0x18) ,当SA0 = 1时为0x19。因此,我希望能够轻松移植我
    发表于 03-08 07:52

    如何调试I2C和RTC

    951行)。我担心其中一个中断例程会导致I2C事务被搞乱,但我不知道该在哪里查找如何调试。我附上了我的项目。我错过了一些基本的关于这些模块如何相互作用?谢谢,安得烈
    发表于 03-18 15:25

    I2C地址左移1位的原因

    I2C读写中,新人会比较困惑,为什么I2C地址要左移1位?
    发表于 07-23 08:00

    I2C 总线协议图解

    ,SPI和uart为双工。2I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(地址通过物理接地或者拉高,可以从
    发表于 08-01 16:12

    具有灵活I2c地址I2c引导加载程序该如何初始化?

    你好,我使用的I2C引导装载器工作得很好。直到现在,我还在I2C组件设置中设置了奴隶地址(0x08),因为我总是使用相同的地址。但现在我想从代码(在本例0x09)中设置
    发表于 09-02 14:01

    i2c通信协议

    从设备通信。一条i2c总线上如果挂载多个i2c从设备,i2c总线通过器件地址来区别不同的i2c从设备。器件
    发表于 03-06 16:15

    I2c通信怎么设置寄存器地址

    tm4c123 launchpad作为master时i2c写操作要先输出device address,再给一个RegisterAddress,然后才能写i2c读操作也要给定这两个地址
    发表于 04-07 13:17

    I2C设备地址关系的相关资料推荐

    转自:I2C设备、读写地址的关系文章目录结论MPU6050手册MPU6050的AD0端口接低电平MPU6050的AD0端口接高电平MPU6050相关问题资料整理结论I2C设备的写地址
    发表于 02-10 07:10

    浅谈STM32硬件I2C的使用

    操作其他I2C寄存器期间使用软件产生时钟延展。2016.02.03 thx:iguesser干扰当总线空闲时,无论是SCL的(电平高低高),还是SDA的
    发表于 04-03 10:55