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

描述

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

1.问题背景

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

2.怀疑点和排除过程

总线器件过多

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

I2C

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

复位操作

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

I2C

图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,所以才通讯失败。

I2C

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

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

I2C

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

3.如何修正

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

I2C

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

4.总结

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

I2C

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

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

I2C

I2C

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

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

I2C

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分