This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] ADS1115:I2C 在读取非阻塞时读取0xFFFF

Guru**** 2537250 points
Other Parts Discussed in Thread: ADS1115

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1004665/ads1115-i2c-reading-0xffff-when-reading-non-blocking

器件型号:ADS1115

大家好

如果读取过程中断时间超过30ms、ADS1115 I2C 不会从通道(寄存器0)返回任何值。

我正在使用 Linux、有时在读取两个字节期间、在读取第一个字节后、处理器停止读取、并以延迟的方式继续读取第二个字节。

在第一个字节和第二个字节读取之间的读取延迟大于~30ms 的情况下、主器件读取0xFFFF。

通过使用逻辑分析仪分析 SDA 总线、我可以看到在读取第一个字节后、SDA 在周期(<20ms)内仍然为低电平、而不是释放为高电平。

在这种情况下、主器件读取第二个字节并接收0xFFFF。  

重要提示:在延迟期间、主器件不计时、因此在主器件想要再次读取之前、总线上不会发生任何情况。

那么、我的问题是、如果 ADS1115有一些超时限制?  

在读取此 IC 的过程中、是否有人遇到相同或类似的问题?

提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Cristobal、您好!

    我不知道 ADS1115是否内置了某种超时、但我可以对此进行研究。 为了避免这种情况、您是否能够执行2次单独的单字节读取来从寄存器中检索数据、而不是进行单个两字节读取?

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Scott

    感谢您的回复。 要么我无法从应用程序读取两个单字节、那么 Linux 内核仅在他知道需要读取多字节时才会提供 ACK。 我是说、如果我要读取一个字节、那么内核会进行 NACK 操作、当我读取两个字节时、在第一个字节之后、我们会进行 ACK 操作、并在读取第二个字节 NACK 时结束。

    当然、如果我修改内核、我可以告诉他总是执行 ACK、但这不是一个选项、这会影响应用程序与其他 I2C 驱动程序的连接。

    我还可以看到、这个问题仅在我读取寄存器0x00 (数据)时发生。 如果我读取配置寄存器0x01、并在第一个字节和第二个字节之间有延迟、那么它可以正常工作。 那么、我的一个问题是、当新值可用时、SOC 是否会因 ADC 采样而中断?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Cristobal、

    是的、这可能是测量更新的结果。 测试这种情况的一种方法是执行单次测量、并查看是否能够读取两个字节之间的延迟。 根据应用的要求、执行单次测量实际上可能更好、而不是连续输出。 主要缺点是每次单次测量的启动时间很短、但如果不需要高频输出、使用单次模式可以从时序角度简化操作。


    此致、

    Scott