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

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

3天内不再提示

无法读取I2C地址的调试案例

CHANBAEK 来源:硬件系统架构师 作者: Timothy 2023-11-02 18:24 次阅读

引言:调试I2C从器件的第一步就是尝试去读它的地址,如果无法读取地址或者向其发送读写命令却没有收到ACK回馈,都说明与器件通讯失败。常规发生无法读取I2C地址的情况时,第一怀疑点往往是硬件互联出现问题,本节分享一个和软件相关的调试案例。

1.问题背景

一枚视频转换芯片的I2C连接前端MCU上,调试时发现I2C通讯失败,同一总线上的另外两个器件地址均正常。发送读写命令波形也没有ACK反馈,检查过硬件互联和Reset配置,均没有问题。

2.怀疑点和排除过程

总线器件过多

考虑到一个I2C上挂载了三个从器件,分支和节点过多,并且走线也不短,所以怀疑是从器件过多导致Cload过大,无法和远端通讯成功。于是摘掉和另外两个器件的互联电阻,再次尝试,依然无法通讯,并且测量得到的波形质量并不差,如图1-所示,我们向地址0X8A发送命令,却没有ACK回馈,说明并不是总线负载电容问题。

图片

图1-1:向设备发送读写命令波形

复位操作

虽然上电后复位Reset就为高电平,但是尝试在从器件启动后再复位一次,再尝试读取I2C地址,依然无法读到,侧面说明和时序没有关系。为了验证无法通讯是不是器件本身的问题,将其与MCU断开,直接飞线I2C通过盒子连接到上位机,发现可以读到地址,并且读写寄存器均正常,如下图1-2是逻辑分析仪抓取到的波形图,有明显的ACK标志。

图片

图1-2:与上位机通讯抓取的读写波形

排除掉硬件互联和引脚配置以及器件本身的问题,那么只有一个问题就是MCU端的I2C参数配置出现问题。

主器件I2C参数

那么主器件I2C涉及哪些参数呢,总线速度100KHz(标准),400KHz(快速),1MHz(超快速)、Data setup Time、Data hold Time等等这些参数可调,如图1-4抓取上位机和器件通讯成功的波形,测试的Data hold Time大概为560ns,远远大于图1-5器件手册中的10-250ns,说明手册中的此参数标注和实际不符,而MCU端I2C配置的是100ns,所以才通讯失败。

图片

图1-3:与上位机通讯波形时间参数测量

图片
图1-4:与上位机通讯波形时间参数测量

图片

图1-5:器件手册I2C时间参数

3.如何修正

如表1-5联系原厂核对修改后的参数,修改主机I2C设置的Data hold time即可。

图片

图1-6:更正后的时间参数

4.总结

对于支持不同通讯速率的I2C设备,高速率的往往可以兼容低速率的,比如1MHz-I2C的A器件,它可以接收来自100KHz、400KHz、1MHz的速率信息,但是如果与它互联的B器件只支持400KHz,那么B只能接收A发送100KHz、400KHz的信息。而100KHz、400KHz、1MHz的时间参数都有差异,在调试时不仅速率要匹配,与速率相关的时间参数也必须修改以保持兼容,因为芯片里面的I2C收发器ADC转换速率与频率f息息相关,而ADC转换速率就决定着这些时间参数。

图片

图1-7:I2C主从机基本结构

从图1-8可以明显看出,三种速率下的数据保持时间和数据设置时间均有明显的差异,以上述参数为例,Data hold time实际为560ns,说明器件仅支持到快速模式,但实际设置为100ns,而器件并不能支持这么快的采样速度,所以无法识别Bit位,因此仅仅保持SCK一致,通讯也会fail。

图片

图片

图1-8:几种I2C模式的时间参数

另外有的器件支持好几种系统时钟(Syetem Clock),这时候其I2C时间参数可能就以System Clcok为单位,而不是直观的us/ms,如图1-9所示:

图片

图1-9:和系统时间挂钩的I2C参数

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

    关注

    146

    文章

    16019

    浏览量

    343657
  • 调试
    +关注

    关注

    7

    文章

    527

    浏览量

    33625
  • 通讯
    +关注

    关注

    9

    文章

    840

    浏览量

    34370
  • 总线
    +关注

    关注

    10

    文章

    2706

    浏览量

    87222
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1347

    浏览量

    120846
收藏 人收藏

    评论

    相关推荐

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

    引言:I2C作为使用最为广泛的通讯接口,调试各类I2C器件,大家应该都很轻车熟路。一般对于外挂电阻配置器件的I2C地址,例如电阻上拉之后,器
    的头像 发表于 11-22 10:51 600次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>地址</b>跳变问题的<b class='flag-5'>调试</b>案例

    使用I2C通讯EEPROM,无法正确读取数据,请教各位大神。

    这个是使用STM8数据库的I2C通讯,我遇到的问题是,在跟EEPROM通讯的时候,第一次写入数据,一个一个读取的话,能知道写入EEPROM的值是没有错的,但是在连续读取数据的时候,就会出现,上电
    发表于 09-09 09:46

    Micropython TPYBoard I2C的用法

    ,需要读取数据数量,或者缓冲区addr,I2C地址timeout,超时时间i2c.send(send, addr=0x00, *, timeout=5000)send,整数或者缓冲区a
    发表于 05-25 12:14

    I2C组件的数据表如何从从属的子地址读取

    的数据表之后,我无法理解如何从从属的子地址读取i2c_masterreadbuf的卡片(卡片slaveaddress,uint8 * rddata,uint8 CNT,uint8模式
    发表于 08-18 06:20

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

    来说,设备地址应该填满0xB4(0x5a左移位1位=0xb4),然后I2C读/写就可以了。如果填写0x5A,将无法工作。
    发表于 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地址I2c引导加载程序该如何初始化?

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

    ML505视频I2C总线无法与Chrontel CH7301C通信

    0x37和0x50到0x57接收到确认。然后我尝试使用其他9个其他I2C设备ID读取寄存器0x4B(Chrontel CH7301C的设备ID寄存器的地址)。根据Chrontel文档,
    发表于 09-03 08:47

    如何从基于I2C的从设备寄存器读取数据?

    你好,我用I2C读取一个字节在一个无限循环中的从属设备寄存器值。我使用的逻辑是:I2C*START();I2C.MistCurrStaseSube();
    发表于 10-18 08:01

    如何进行I2C读取

    我们正在研究一个项目,我们想用一个CyPress PSOC4 MCU管理VISHY VEML6040 I2C颜色传感器。我们有困难处理结果,我们从传感器得到了什么,所以我开始调试这个问题。起初,我
    发表于 10-29 09:05

    如何从I2C设备读取ID

    “不在乎”的价值观。只有一个设备必须确认这个字节(一个I2C总线从地址)。4。主程序发送一个Re-START条件。备注:一个STOP条件后面跟着一个START条件重置从程序状态,并且不能执行设备ID读取
    发表于 03-10 08:18

    TI提供的I2C例程无法正常运行怎么解决?

    我用的是TI提供的I2C例程,无法正常运行,中断信号不产生,此程序就是在controlsuit中的例程,F28035芯片,我的EEPROM是24C08,器件地址是0xa0,不知为何!此
    发表于 06-10 16:29

    i2c总线接口设备地址0x40读取温度原理

    sht20主要是i2c总线接口设备地址0x40读取温度原理:读取0xe3寄存器地址两个字节读取
    发表于 12-17 08:29

    从NFC上的系统寄存器进行I2C读取操作失败怎么解决?

    ://github.com/stm32duino/ST25DV/tree/master/srcNFCTagInitialise 失败,因为它没有读取 0x17、0x18-0x1f 处的系统信息。ESP - I2C
    发表于 01-03 06:15