大家好,我们的电路板设计参考的LCDK138,使用I2C0口与si7005温湿度传感器相连接,slave为7位地址0x40,如下图所示。
自己编写了收发程序,在I2C产生了start条件后,SDA传输了从地址0x40,后面跟随了一位写操作低电平。但是传感器却返回了NACK,如逻辑分析仪所测下图所示。关键是前两天运行程序的时候还可以正确返回ACK来着,今天却不行了,无论是读模式还是写模式都不行。请问产生这样问题的原因可能有哪些?
user4635967:
回复 Tony Tang:
Hi Tony,
感谢您的回复。今天我将RTC模块禁用后,就可以正常的检测到传感器发来的NACK了。由于我对RTC这块不怎么了解,所以不知道是什么原理导致了这样的冲突。
希望我的经历能对遇到同样问题的朋友有一点帮助。
Tony Tang:
回复 user4635967:
你说的RTC是芯片上的RTC,还是外加的RTC芯片?你本身用的是哪款DSP?
user4635967:
回复 Tony Tang:
抱歉之前我没有说清楚。我使用的是芯片上自带的RTC,芯片为不带E版本的OMAPL138。我禁用它的方式是将RTC模块中的CTRL寄存器,RTCDISABLE这一位置1以禁用。
Tony Tang:
回复 user4635967:
可是RTC跟I2C没有关系啊。而且一楼的波形显示确实是Slave没有回应ACK,这跟DSP这边的程序没有关系了。
基于你的图,我做了如下分析。你可以用示波器量一量板子上的I2C信号,我估计应该是SCL受到了干扰。
user4635967:
回复 Tony Tang:
Hi Tony,
今天我用示波器试着量板子上的信号,发现当示波器探头测量SCL管脚时程序即可正常读出湿度数据(程序使用while循环持续的读出湿度数据),此时SCL测得波形如下所示
但是一旦将探头从SCL管脚拿开,程序就会卡在昨天出问题的地方,即在下次循环中发送slave地址后得不到ACK应答。探头位置如下所示:
1.探头测量时程序正常,拿开后程序出错,因此程序错误时无法得知SCL的情况。
2.为什么示波器的探头会影响程序运行的成功与否?
Tony Tang:
回复 user4635967:
这是可以解释的,因为探头接上去是有容性的,对信号会一定的滤波作用,可能把毛刺,干扰信号滤掉了。
虽然你的图片没有放大,但还是可以看出来两个问题:
#1. 信号上升沿有回勾,而且一个上升沿上好像还不只一个,这是绝对不允许的,会影响信号的判断,有可能就会引起一个脉冲判断为2次。
#2. 信号有很大的下冲。
这路I2C完整的电路是啥样子的,为什么会有这个回勾?这就要你们的硬件人员加入进来解决了。
把上拉10K电阻调整一下试试。
顺便给你留个思考题:试问如果产品在运行当中I2C信号受到干扰出了这种情况怎么办?