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.

[参考译文] ADS112C04:通过 I2C 读取数据时出现问题

Guru**** 2586265 points
Other Parts Discussed in Thread: ADS112C04

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/922439/ads112c04-problems-with-data-read-via-i2c

器件型号:ADS112C04

你(们)好

我使用具有1.8V 外部基准 电压的 ADS112C04 ADC 和一个微控制器来测量 OPA 的输出。 如果我通过 I2C 写入一些寄存器来配置 ADC、一切都正常(!DRDY 引脚在连续模式下切换等)。 但是、如果我读取转换后的数据、它们是垃圾的(每个通道上始终大约0.5V、并且在它们被设置为 GND 的通道上)、并且 ADC 在末尾将 SDA 线路保持在低电平(uC 发送一个停止条件、SCL 线路从上拉变为高电平、 但 SDA 不会变为高电平)。

图片显示了我的读取过程:

字节:从地址(写入模式)

2.字节:读取数据命令

3.字节从地址(读取模式)

4.和5. 字节:来自 ADC 的数据(垃圾)

结束:无停止条件、ADC 在 SDA 线上保持低电平

有人知道我的错误是什么?

谢谢

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

    您好、Raphael、

    欢迎来到 E2E 论坛!  了解您为 ADS112C04使用的寄存器设置以及所选的输入电压和通道会有所帮助。  原理图也很有用。

    返回的数据为十进制的0x41D0或16848。  如果您使用的是1.8V 外部基准和增益为1、则单个代码的值为+/- 1.8V/2^16 = 54.93uV。  返回的值是代码数乘以1个代码的值、对于本示例、该值为925.49mV。  由于我不知道实际输入电压是多少或它是如何连接的、因此我无法判断它是否接近、但它大于500mV。  因此、我认为您的计算中存在误差。

    此外、您必须确保 ADC 的输入电压处于测量的输入范围内。  如果您正在进行单端测量(相对于 AGND 的测量)、并且您使用的是单极模拟电源(AVSS 连接到 AGND)、则还必须禁用并绕过 PGA。

    至于 SDA 在通信结束时保持低电平、这是一个由微控制器执行的读取操作、该微控制器将 SDA 保持在低电平、而不是 ADS112C04。  这很可能是由于微控制器未发送 STOP 命令导致的。

    此致、

    Bob B

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

    Bob、您好、感谢您的快速响应。

    我的原理图:

    I2C 命令与它们一起工作(寄存器设置、从器件地址和命令字节):

    //寄存器0:输入= AIN1、基准= GND、增益= 1、PGA 禁用并被旁路
    I2C_send2Byte (0b10000000、0b01000000、0b10001);
          
    //寄存器1:1kS/s、正常模式、连续转换、外部基准、温度传感器被禁用
    I2C_send2Byte (0b10000000、0b01000100、0b11000010);
          
    //开始连续转换
    I2C_send1Byte (0b10000000、0b00001000);       

    //接收 MSB 和 LSB 并将它们复制到一个 uint16_t 变量中(0b10000001 =从地址+读取位)
    uint16_t data = i2c_receive2Byte (0b10000001、0b00010000);

    所有模拟通道上的输入电压均为0至1.75V (无负电压)

    [引用用户="Bob Benjamin "]

    返回的数据为十进制的0x41D0或16848。  如果您使用的是1.8V 外部基准和增益为1、则单个代码的值为+/- 1.8V/2^16 = 54.93uV。  返回的值是代码数乘以1个代码的值、对于本示例、该值为925.49mV。  由于我不知道实际输入电压是多少或它是如何连接的、因此我无法判断它是否接近、但它大于500mV。  

    [/报价]

    我有点困惑:1.8V/2^16 = 27.46uV。 我返回了0.4627V。 为什么您计算了0.9254V? 我测量16848值的 Input 位于 GND 上、因此我期望值接近0。

    [引用用户="Bob Benjamin "]

    至于 SDA 在通信结束时保持低电平、这是一个由微控制 器执行的读取操作、该微控制器将 SDA 保持在低电平、而不是 ADS112C04。  这很可能是由于微控制器未发送 STOP 命令导致的。

    [/报价]

    我最后发送一个 STOP 命令、这也是我感到困惑的原因。

    此致

    拉斐尔

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

    您好、Raphael、

    单个代码的 LSB 或值为+/-VREF/Gain/Full 比例范围(FSR)。 +/-等效于值的2倍。  因此、对于1.8V 基准、LSB = 2 * 1.8V / 1 / 2^16 = 54.93uV。  请参阅 ADS112C04数据表中的公式8。

    对于寄存器1、您描述了使用连续转换模式、但您的寄存器显示了单次模式( 0b11000010)。    对于连续转换模式、正确的设置将是0b11001010。

    如果微控制器未正确完成停止条件,我将验证函数  i2c_receive2Byte()是否正常工作。  ADS112C04仅在接收数据时进行 ACK 操作、而在发送数据时不进行 ACK 操作。  该 ACK 将来自微控制器。  因为微控制器没有有效地停止、因为它应该是程序中不正确的东西。  通常、微控制器会否定接收到的最后一个字节、然后进入停止条件。  因此、当微控制器发送 ACK 时、接收函数内的功能似乎期望读取另一个字节而不是停止。

    此致、

    Bob B