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.

[参考译文] ADS7138-Q1:I2C 通信

Guru**** 2386600 points
Other Parts Discussed in Thread: ADS7138-Q1
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1120071/ads7138-q1-i2c-communication

器件型号:ADS7138-Q1

我尝试通过 I2C、特别是从 GPIO 引脚读取、与 ADS7138-Q1通信。 在 我的原理图中、R1至 ADDR 引脚为33k、因此7位地址应为0x15h。 我使用的器件地址为0x2a (从7位地址向左移位以获取8位地址)。 无论我尝试读取哪个寄存器地址、芯片都会返回0xAE。 我出了什么问题?

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

    Priscilla、您好!

    地址格式听起来是正确的。  

    为了与器件通信、需要包含特定于器件的操作码、这不是特定于 I2C 协议、而是特定于器件功能。 数据表的注释第33页  展示了运算代码列表以及在读取寄存器时如何实现该列表。  

    我建议探测数字总线、这将提供对通信的可视检查、并尝试成功读取一个器件寄存器。 成功完成后、可用于构建其他数据传输。  

    此致

    Cynthia

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

    明白了、谢谢! 是否假定返回的0xAE 值是错误消息?  

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

    根据之前的通信、它可能是错误、或者通道0在手动模式下的转换数据。  我建议将其视为在建立和确认适当通信之前丢弃数据。  

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

    谢谢! 我还有几个问题。

    问题1:

    在  ADS7138-Q1上、AIN0/GPIO0 - AIN3/GPIO3是模拟引脚、AIN4/GPIO4 是数字输入、AIN5/GPIO5 - AIN7/GPIO7是数字输出。 所有数字引脚连接到一个外部上拉电阻器。 例如、假设我要将 AIN6/GPIO6设置为输出高电平。  

    请确认我的理解/操作是否正确:

    写入 PIN_CFG (0x5)以配置模拟/数字引脚:将0xF0写入0x0805

    2.写入 GPIO_CFG (0x7)以配置数字输入/输出:将0x10写入0x0807

    由于所有数字引脚都连接到外部上拉电阻器、因此无需配置 GPO_DRIVE_CFG (0x9)

    写入 GPO_VALUE (0xB)以将 AIN6/GPIO6设置为高电平:将0x20写入0x080B

    5.检查 GPI_value (0xD)以确保 AIN6/GPIO6被拉高:从0x100D 读取0x20 (假设没有其他数字输出被拉高以开始)

    问题2:

    在数据表中、GPI_VALUE "返回包括模拟输入、数字输入和数字输出在内的所有通道的逻辑电平。" 我们期望模拟输入的逻辑电平是多少?

    问题3:

    要读取模拟引脚电压:

    写入 General_CFG 以允许持续更新统计信息:将0x22写入0x0802

    2.读取最大、最小或最近的通道代码(0x60-0xA7)、以将输入值转换为电压

    此时、所有这些模拟值的值都为0

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

    您好!  

    请参阅以下内容中的回答:

    问题1

    1、写入 PIN_CFG (0x5)以配置模拟/数字引脚:将0xF0写入0x0805 >正确。写入0xF0将设置通道7、6、5、4所有 GPIO。 如果您要对寄存器进行 ORing、并且通道7、5、4已设置、则只需通过 ORing 0x40设置通道6。   

    2.写入 GPIO_CFG (0x7)以配置数字输入/输出:将0x10写入0x0807。 >通道4是所需的输入。 输入应设置为低电平、输出设置为高电平、因此、您的值应反相。从0x10到0xE0

    由于所有数字引脚都连接到外部上拉电阻器,因此无需配置 GPO_DRIVE_CFG (0x9)。 >正确

    4. 写入 GPO_VALUE (0xB)以将 AIN6/GPIO6设置为输出高电平:将0x20写入0x080B >不正确、将通道6设置为高电平为0x40  

    5.检查 GPI_value (0xD)以确保 AIN6/GPIO6被拉高:从0x100D 读取0x20 (假设没有其他数字输出被拉高以开始)> 不正确、要设置为高电平的通道6为0x40  

    问题2

    尽管如此、但不应将其用于评估模拟输入。 如果存在模拟信号、则其读数应为高电平。

    问题3

    从尝试读取模拟输入的声音中、您将以自主模式使用器件。  

    写入 General_CFG 以允许持续更新统计信息:将0x22写入0x0802 >常规 CFG 的寄存器地址不正确、它是0x01而不是0x02。为什么还要设置校准位? 这只能在需要时完成、即启动后、温度暴露后。 我建议将0x20写入该寄存器。  

    2.读取最大、最小或最近的通道代码(0x60-0xA7)、以将输入值转换为大于正确的电压

    此致

    Cynthia

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

    感谢您的全面回答!

    关于 问题3、我将按照您的建议将0x20写入0x0801。 然而、寄存器0x60-0x67仍然返回0、尽管在原理图中、引脚 AIN0 - AIN3被拉高至不同的模拟输入。 我还需要启用其他功能吗?

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

    我不确定您的器件配置是否完整、我建议遵循此自主模式流程图、以确认您正在配置所需的所有方面。  

    我还建议通过读回寄存器中的值来确认寄存器是否按预期配置、以匹配预期值。  

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

    我检查了所有值、器件似乎处于手动模式。 在手动模式下、为什么我无法读取模拟输入? 同时、我将尝试将其设置为自主模式、然后重试。

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

    考虑到与之前相同的设置、其中 AIN0-AIN3是模拟引脚、AIN4-AIN7是数字引脚、这是否是读取模拟输入的过程?  

    1. 将引脚配置为 AIN/GPIO (PIN_CFG 寄存器):将0xF0写入0x0805
    2. 校准偏移误差(General_CFG):将0x02写入0x0801
    3. 选择用于定序的模拟输入:将0x0F 写入0x0812
    4. SEQ_START 和 SEQ_MODE:将0x11写入0x0810
    5. 配置警报条件:即使我没有使用它,我也将0x01写入0x0817
    6. 启用模拟输入以触发 ALERT 引脚:即使我没有使用它,我也将0x0F 写入0x0814
    7. 配置模拟输入的采样率(OPMODE_CFG):将0x20写入0x0804
    8. 启用最小/最大记录(genral_CFG):将0x20写入0x0801
    9. 启用数字窗口比较器(General_CFG):将0x10写入0x0801
    10. 使用自动序列模式(SEQUEST_CFG)启动通道序列:将0x10写入0x0801
    11.  检查 MIN_VALUE 和 MAX_VALUE

    使用上面的步骤、我现在可以获得最小/最大值的读数。 但是、我不确定如何解读它们。 在位移并将 MSB 和 LSB 相结合后、我得到一个16位值。 我是否只是将该值转换为模拟输入电压的整数值?

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

    当器件处于手动模式时、最小值/最大值寄存器不会更新。 这些仅在使用自主模式时使用。 使用手动模式时、数据通过 SDO 读取。 因此、启用自主模式后、寄存器应更新。 此外、如果使用自动序列模式也不会更新 Mind 最大值、则在该模式下、数据将通过 SDO 读取。  

    查看您的流程、我建议按照 之前共享的流程图进行正确配置。按照以下重新排列:

    1. 将引脚配置为 AIN/GPIO (PIN_CFG 寄存器):将0xF0写入0x0805
    2. 校准偏移误差(General_CFG):将0x02写入0x0801
    3. 选择用于定序的模拟输入:将0x0F 写入0x0812
    4. 配置警报条件:即使我没有使用它,我也将0x01写入0x0817
    5. 启用模拟输入以触发 ALERT 引脚:即使我没有使用它,我也将0x0F 写入0x0814
    6. 配置模拟输入的采样率(OPMODE_CFG):将0x20写入0x0804
    7. 启用最小/最大记录(genral_CFG):将0x20写入0x0801
    8. 启用数字窗口比较器(General_CFG):将0x10写入0x0801 -- >建议将此步骤和之前的步骤合并到一次传输中、具体取决于写入寄存器的方式(如果是 ORing 或不是 ORing)、您可以清除以前的配置。您可以通过读取来确认寄存器是否正确、 这将导致值0xB0。将0x30写入0x0801  
    9. SEQ_START 和 SEQ_MODE:将0x11写入0x0810 ->这将通过设置 SEQ_START 来开始输入采样、因此也应在这之前配置所有配置。  
    10. 使用自动序列模式(SEQUEST_CFG)启动通道序列:将0x10写入0x0801 ->此行非常混乱、因为它不正确、SEQUEST_CFG 寄存 器是地址 x10而非 x01 (您使用的是0x0801)。 此外、如果尝试写入 SEQUEST_CFG、您已经在上一步中执行了。   
    11.  检查 MIN_VALUE 和 MAX_VALUE  

    此致

    Cynthia