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.

[参考译文] ADS1256:在特定时间读取的寄存器值错误

Guru**** 2538955 points
Other Parts Discussed in Thread: ADS1256

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1024981/ads1256-register-value-read-is-wrong-at-certain-times

器件型号:ADS1256

尊敬的 TI 社区:

我在反复读取 ADS1256中的寄存器值时遇到一些问题。 在我将寄存器设置为特定值后、当我尝试读取寄存器1000次时、大约1%的时间、我得到的值与应该的值不同。 下面是我使用的代码。

另一个问题:为什么我需要在写入和读取寄存器之间添加延迟、以及所需的持续时间是多少? 我唯一能找到的是在发送命令后读取寄存器值所需的 T6。

设备:带 Arduino 框架的 Teensey4.1

const uint8_t regVal = 0x63; // 0110 0011  - AIN6+AIN3-
const uint8_t regAdd = 0x03; // 0x03 -> data rate

// ----------write to register------------
while (digitalRead(DRDY_pin)) {} 
// either check for dataready is low or add some delay.
digitalWrite(CS_pin, LOW);
SPI.beginTransaction(SPISettings(1800000, MSBFIRST, SPI_MODE1));
SPI.transfer(WREG | regAdd);
SPI.transfer(0x00);
SPI.transfer(regVal);
SPI.endTransaction();
digitalWrite(CS_pin, HIGH);

// ----------read from register------------
while (digitalRead(DRDY_pin)) {}
for (int i = 0; i < 1000; i++) {
  digitalWrite(10, LOW);
  SPI.beginTransaction(SPISettings(1800000, MSBFIRST, SPI_MODE1));
  // delayMicroseconds(7);
  SPI.transfer(RREG | regAdd);
  // send 1st command byte, address of the register
  SPI.transfer(0x00); // send 2nd command byte, read only one register
  delayMicroseconds(7);
  regValReceived = SPI.transfer(0xFF); // read data of the register
  SPI.endTransaction();
  digitalWrite(CS_pin, HIGH);

  Serial.print("set value of register ");
  Serial.print(regVal, HEX);
  Serial.print(" ");

  Serial.print(regValReceived, HEX);
  Serial.print(" actual value of register ");

  Serial.print("\n");
  if (regVal != regValReceived) {
    Serial.println("wrong value");
  }
}

此致、

Ashesh

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

    您好、Ashesh、

    您能解释一下"不同价值"是什么意思吗? 这些值有多大不同? 由于温度、漂移、噪声等原因、ADC 输出代码应该会有一些小变化 如果输出代码发生较大的变化、我们可以进一步研究、但我需要查看原理图、寄存器设置和您从 ADC 获取的代码(以及测试设置的一般说明)

    ADS1256中描述了多种延迟、请参阅第6页的时序特性表和图(图1)。 具体而言、在发送4个 tCLKIN 的 RREG 和 WREG 命令之间需要一个小延迟、其中 tCLKIN 是主时钟周期。

    布莱恩

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

    尊敬的 Bryan:

    • 不同值的含义是、例如 I WREG 多路复用器(0x03)到0x63。 当 I RREG 它时、99%的时间、我得到0x63、除外。 但1%的时间、RREG 返回稍微不同的值-一个或两个位翻转。

    0x63 - 0110 0011 (所需的 RREG 并且也获得了99%的 RREG 时间)
    0110 0010 (有时获得 RREG)
    0100 0001 (有时获得 RREG、或在一个两位翻转时出现某种变化)

    请注意、我将讨论 RREG 和 WREG、而不是 ADC 读数。

    • 关于 T4时序、感谢您提供相关信息。 我检查了 RREG 和 WREG、但错过了该表。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ashesh、

    RREG 值是否存在任何错误模式? 例如、它是每50次读回、还是完全随机? 如果存在计时问题、您可能会在定期计时时遇到错误。

    在给出错误值后、您是否需要执行任何操作来使寄存器读取正确的值? 或者、您是否只是随机获取错误的值、然后一切都正常、而无需切换 CS、发出 RESET 命令、重写寄存器等?

    如果是后一种情况、并且假设您遵循了命令之间的正确时序、那么我怀疑数字线路上存在一些噪声或干扰、这会导致寄存器读回时出现位翻转。 实际上、数据是正确的、但在传输过程中会损坏。 确保布局简洁、数字通信线路远离开关电源或高速时钟线路。 此外、请确保您具有一个实心接地层、以避免接地噪声问题。

    布莱恩

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

    您好 Bryan、

    遗憾的是、RREG 没有特定的错误模式。 通常、它每50到100次正确读取一次、但有时会看到一到两次读数分开。

    此外、我无需执行任何其他操作即可获得正确的读数-无 CS 切换、无 RESET 命令和 WREG。 该误差随机发生、也会自动进行分类。

    关于计时、我在上面附加了最小的可重现错误代码。 请告诉我是否应该对其进行任何更改。

    关于噪声、我使用的是此板(波浪形-https://www.waveshare.com/high-precision-ad-da-board.htm)。 我将与我的同事核实可以在这方面做些什么。 我们欢迎您就减少噪音提出意见/建议。

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

    您好、Ashesh、

    作为免责声明、我们可以对该电路板提供极少的支持、因为这不是 TI 产品。 您可能需要将其中一些问题发送给电路板制造商、因为它们不太可能是 ADC 问题。 我猜测(或希望)制造商在释放 PCB 之前对电路板进行某种功能测试、以确保包括 ADC 在内的组件正常工作。 但是、您必须通过 Waveshare 确认这一点。

    要尝试从代码中删除所有"serial.print"命令、而是将 RREG 值存储在 MCU 中、并在循环完成后回读。 我听说过这些打印函数会消耗大量 MCU 资源、并且可能会使及时完成循环变得更加困难。

    我还建议使用逻辑分析仪查看时序。 这将真正告诉您计时是否有效、还将向您展示 ADC 的结果与 MCU 报告的结果。 如果这些不同、则可以排除 ADC 问题。

    布莱恩

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

    尊敬的 Bryan:

    我非常感谢你在这一问题上的帮助。 我将在一周内回来尝试您的建议。 我将告诉您它是怎么发生的。

    此致、