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

    文章

    578

    浏览量

    33924
  • 引脚
    +关注

    关注

    16

    文章

    1195

    浏览量

    50416
  • 通讯接口
    +关注

    关注

    2

    文章

    80

    浏览量

    16182
  • I2C器件
    +关注

    关注

    0

    文章

    2

    浏览量

    6548
收藏 人收藏

    评论

    相关推荐

    MM32F013x上实现I2C地址的功能应用

    I2C中,通信是借助设备地址寻址实现的,大致可以分为两类:一对多、多对多通信。在多主机通信时,从机如果想接收多个主机的数据,就需要使用到从机多地址的功能。 本文是针对在MM32F013x上实现
    发表于 01-05 11:43 2099次阅读

    无法读取I2C地址调试案例

    引言:调试I2C从器件的第一步就是尝试去读它的地址,如果无法读取地址或者向其发送读写命令却没有收到ACK回馈,都说明与器件通讯失败。常规发生无法读取
    的头像 发表于 11-02 18:24 2119次阅读
    无法读取<b class='flag-5'>I2C</b><b class='flag-5'>地址</b>的<b class='flag-5'>调试</b>案例

    I2C地址切换电路

    I2C地址切换电路
    发表于 02-22 11:15 1501次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>地址</b>切换电路

    i2c

    单片机i2c总线操作;单片机i2c总线操作;单片机i2c总线操作;
    发表于 05-17 11:09 35次下载

    arduino读取I2C总线上连接设备的地址

    这两天研究了一下I2C总线,发现有好多I2C设备的地址并不知道,当然有的可以在网上查的到,但是如果遇到用过的I2C器件,设备地址被修改过,那
    发表于 11-23 16:58 11.2w次阅读

    mpu6050对应i2c地址是什么_如何读取数据

    本文主要介绍了mpu6050对应i2c地址是什么,并通过stm32的硬件读取mpu6050的数据。MPU6050 的 I2C 地址是 0xD0H(11010000B)。
    发表于 12-11 16:04 2.5w次阅读
    mpu6050对应<b class='flag-5'>i2c</b><b class='flag-5'>地址</b>是什么_如何读取数据

    如何将I2C地址左移1位

      I2C总线读写中,新人会比较困惑,为什么I2C地址要左移1位?这是i2c协议决定的,i2c地址
    发表于 08-05 17:34 4次下载
    如何将<b class='flag-5'>I2C</b>从<b class='flag-5'>地址</b>左移1位

    I2C/SMBus地址转换器

    I2C/SMBus地址转换器
    发表于 04-20 10:44 5次下载
    <b class='flag-5'>I2C</b>/SMBus<b class='flag-5'>地址</b>转换器

    嵌入式linux应用读写i2c示例

    long arg);cmd有I2C_SLAVE,I2C_SLAVE_FORCE,I2C_TENBIT,I2C_SET_SPEED几个选项;I2C
    发表于 11-01 16:57 12次下载
    嵌入式linux应用读写<b class='flag-5'>i2c</b>示例

    硬件I2C与模拟I2C

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但
    发表于 12-28 19:14 81次下载
    硬件<b class='flag-5'>I2C</b>与模拟<b class='flag-5'>I2C</b>

    I2C扫描仪之如何在Arduino上查找I2C地址

    电子发烧友网站提供《I2C扫描仪之如何在Arduino上查找I2C地址.zip》资料免费下载
    发表于 01-31 10:19 2次下载
    <b class='flag-5'>I2C</b>扫描仪之如何在Arduino上查找<b class='flag-5'>I2C</b><b class='flag-5'>地址</b>

    如何提高I2C调试效率?

    一般情况下,我们想要调试这类 I2C 器件,都需要先找一块主控 MCU 板卡,用杜邦线将 I2C 器件连接到板卡上,然后编写 MCU 代码,需包含 I2C 软件驱动以及测试用例,最后将
    发表于 06-08 13:00 1362次阅读
    如何提高<b class='flag-5'>I2C</b><b class='flag-5'>调试</b>效率?

    Android Things I2C地址扫描器

    电子发烧友网站提供《Android Things I2C地址扫描器.zip》资料免费下载
    发表于 06-13 17:02 0次下载
    Android Things <b class='flag-5'>I2C</b><b class='flag-5'>地址</b>扫描器

    I2C debug出现问题怎么解决

    _transfer 返回值为 -6? 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况: I2C 地址错误,解决方法是测量 I2C 波形,确认是否
    的头像 发表于 07-22 15:00 3679次阅读

    I2CI3C的区别有哪些

    线。 I2C 传输速度最高 3.4MHz,I3C 可以 12.5MHz +。 I3C 向下兼容 I2C,但不兼容 10bit 的 I2C
    的头像 发表于 07-22 16:20 6897次阅读
    <b class='flag-5'>I2C</b>和<b class='flag-5'>I3C</b>的区别有哪些