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:为 ADS1256设置 SPI 逻辑分析仪

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

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/761887/ads1256-setting-up-the-spi-logic-analyzer-for-ads1256

器件型号:ADS1256

尊敬的 Chris:

很抱歉问得太多。 我想知道您是否可以帮助我完成 ADS1256上 SPI 通信调试的一些基本逻辑分析仪设置?

SCLK -引脚13 (SCK)
DIN -引脚11 (MOSI)
DOUT -引脚12 (MISO)
DRDY -引脚9
CS -引脚10 (CS)
RESET -引脚8 (或拉至高电平?)

对于以下引脚、哪些引脚应设置为触发类型的低电平、上升电平、高电平、下降电平或边沿?

谢谢、

Khoi Ly

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

    您好、Khoi、

    这根本不是问题、我们随时为您提供帮助!

    遗憾的是、我确定您所指的引脚编号是什么;它们与数字信号的 ADS1256引脚编号不同...

    与 ADS1256通信时、请记住、它使用 SPI 模式1 (SCLK 通常为低电平、并且应在 SCLK 的下降沿评估/DIN 和 DOUT)。

    对于逻辑分析仪触发、在捕获您正在捕获的数据时、您在何处触发并不重要。 我通常在/CS 的下降沿触发、以便能够看到整个 SPI 帧。

     

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

    我的道歉,这些引脚并不完全需要向你展示。 它们是 Arduino Uno R3上的引脚。

    我放置了一个名为 DIO7的 Arduino 数字引脚、该引脚在微控制器接收来自 ADS 1256的 ADC 数据(逻辑分析仪上的 DIO7下降沿触发器)之前触发。 CS 引脚始终保持低电平

    digitalWrite (7、HIGH);

    digitalWrite (7、low);
    ADC_val [i]= SPI.transfer (0);
    ADC_val[i]<= 8;//向左移位
    adc_val[i]|= spi.transfer (0);
    ADC_val[i]<= 8;
    adc_val[i]|= spi.transfer (0);

    您是否知道此逻辑分析仪的数据线(MISO)为什么在时钟之前出现脉冲?

    前8位是 B01111111 --- 在第一个 SPI.transfer 中获得0位的唯一方法是、我们在时钟变为高电平之前开始对数据线(MISO)进行计数

    第二个8位是 B11111111  

    第三个8位是 B10111001 --- 同样、最后一个 SPI.transfer 的结束位为1、但您可以看到它是最后一个时钟脉冲之前的一个时钟周期

    我们可以组合这三个8位传输来获得总共24位数据。

    drive.google.com/open

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

    我们的一些 ADC 具有共享 DOUT/nDRDY 引脚、但在发送 SCLK 之前、该器件不应在 DOUT 上有任何脉冲...

    您是否有机会了解了示波器上的 SPI 通信? 大多数逻辑分析仪仅显示数字低/高值、但示波器可以显示模拟电压、在尝试调试信号完整性(SI)问题时可能会用到这些电压。 /DRDY 信号(或其他附近的信号)可能会耦合到 DOUT 走线中并显示为脉冲。

    如果您是从 Arduino 到 ADC 的跳线、请务必保持这些导线较短、并确保附近有一根接地导线! (我通常将接地线绕在其他跳线周围、以使电流环路面积尽可能小、从而避免 SI 问题)。

    此外、您的输入电压是多少、以便我知道您期望的数据值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还没有尝试过示波器、但根据您所说的话、我会假设示波器可以处理数字方波的急角? 换句话说、示波器是否具有足够的带宽来捕获 SPI 信号?

    我想、通过绕接地线、您意味着每个数字信号、我将提供一个带接地线的双绞线?

    我还将研究输入电压。

    也许您对信号完整性的看法是正确的、但我想知道为什么这个问题只发生在 DOUT (MISO)而不是 DIN (MOSI)? 所有 SPI 引脚从 Arduino 连接到试验电路板、然后从试验电路板连接到逻辑分析仪和 ADS1256。

    谢谢、

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

    您好、Khoi、

    根据示波器和探头带宽的不同、您可能无法看到所有高频效应、但我仍然认为这将提供更多有关潜在 SI 问题的见解、尤其是因为逻辑分析仪往往会掩盖噪声、过冲和振铃的影响。 请确保在靠近输入引脚的位置进行探测(ADC 上的 DIN、MCU 上的 MISO)、以便您可以查看在迹线接收端看到的信号 (探测源附近不会告诉您迹线或导线的另一端是否存在 SI 问题)。

    我认为一根接地线(在每组跳线周围)就足够了、只要它靠近所有其他信号线即可。 我通常只需在我的所有 SPI 跳线周围缠绕一根接地线、确保它将每个电路板的接地端连接在一起。 每个信号上的双绞线布线会更理想、但在这种情况下、我不认为有必要。 但是、由于您是从 Arduino 到试验电路板的跳线、然后从试验电路板到另一电路板、因此您可能需要将每组电线缠绕在一起。 如果您可以卸下试验电路板、只需在 Arduino 和测试板之间进行操作、我强烈推荐它!

     

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

    尊敬的 Chris:

    我尝试了您的建议、我认为示波器结果有一些变化
    drive.google.com/open

    黄色是时钟、工作正常

    绿色是 MISO 线、它的行为似乎不是很好。

    时序与逻辑分析仪的结果一致、因此我认为数据解释可能有一些问题、而不是时钟脉冲时序本身。 但是、我想问以下问题吗?

    1. MISO 线路在传输结束时保持高电平是否正常? 示波器表明、最后一个 MISO 脉冲会逐渐衰减、这在我看来是不正确的。 逐渐衰减会导致系统在传输结束后看到 MISO 线路保持高电平。

    2. MISO 线路的起始位置为高于接地的位、然后在脉冲时低于接地的位。 这是正常的吗?

    我有关于 ADS 1256的相关问题:

    1.如何知道 SPI 速度的值? 它取决于微控制器吗? 我应该有什么好的资源来了解一下?

    2. 以下行允许我设置 Arduino Uno 微控制器的状态寄存器

    字节 STATUS_reg = 0x00;//地址(数据表第30页)
    字节 STATUS_DATA = 0x01;// 01h = 0000 0 0 1 =>状态:最高有效位优先、自动校准禁用、模拟输入缓冲器禁用
    //byte STATUS_DATA = 0x07;// 01h = 0000 0 1 1 =>状态:最高有效位优先、自动校准启用、模拟输入缓冲器启用
    SPI.transfer (0x50 | STATUS_reg);// b01010000
    SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
    spi.transfer (STATUS_DATA);//将数据字节写入寄存器
    delayMicroseconds (100);

    Arduino 中的 SPI.transfer 之间存在较小的延迟、可将字节相互分隔。

    如果 ESP32使用上述 SPI.transfer 字节连续发送3个字节的流、该怎么办?传输字节之间没有任何间隙、时钟将连续24次脉冲。 将这些字节写入寄存器是否会遇到问题?  

    drive.google.com/.../view

    谢谢、

    Khoi Ly

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

    您好、Khoi、

    很遗憾、我无法访问您的 Google Drive。 您是否可以将一些示波器屏幕截图附加到您的 E2E 帖子?...请确保使用"插入/编辑媒体"按钮、因为"CTRL-V"粘贴在 E2E 上效果不是很好。

    关于您的问题...

    [引用用户="Khoi Ly10"]1. 您如何知道 SPI 速度的值? 它取决于微控制器吗? 我应该有什么好的资源来了解一下?

    在大多数微控制器中、可通过选择 SPI 外设使用的时钟源或配置时钟分频器来配置 SCLK 频率。 您可以尝试搜索 Arduino 的"SPI"或"SPI 代码示例"。 我知道第三方 Github 项目(此处: https://github.com/baettigp/ADS12xx-Library)、但我没有尝试过。

    ADS1256允许 SCLK 频率最快为 fCLK/2或3.84MHz (对于7.68MHz 时钟)。

    [引用用户="Khoi Ly10"]

    2. 以下行允许我设置 Arduino Uno 微控制器的状态寄存器

    字节 STATUS_reg = 0x00;//地址(数据表第30页)
    字节 STATUS_DATA = 0x01;// 01h = 0000 0 0 1 =>状态:最高有效位优先、自动校准禁用、模拟输入缓冲器禁用
    //byte STATUS_DATA = 0x07;// 01h = 0000 0 1 1 =>状态:最高有效位优先、自动校准启用、模拟输入缓冲器启用
    SPI.transfer (0x50 | STATUS_reg);// b01010000
    SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
    spi.transfer (STATUS_DATA);//将数据字节写入寄存器
    delayMicroseconds (100);

    Arduino 中的 SPI.transfer 之间存在较小的延迟、可将字节相互分隔。

    如果 ESP32使用上述 SPI.transfer 字节连续发送3个字节的流、该怎么办?传输字节之间没有任何间隙、时钟将连续24次脉冲。 将这些字节写入寄存器是否会遇到问题?  

    [/报价]

    某些 ADS1256 SPI 字节传输确实需要延迟(请参阅 ADS1256数据表中的"T6")。 我建议使用 GPIO 控制/CS (避免在每个 SPI 字节后切换/CS 的内置帧同步引脚),并在需要延迟时在 SPI.transfer()调用之间插入延迟。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没关系、我想我已经解决了时钟脉冲的问题。

    关于你对我的问题的答复,我谨遵循以下几点:

    问题1。 我将继续尝试将微控制器上的 SPI 速度提高到3.85MHz、看看何时会由于微控制器而失去通信? 如何知道我的微控制器是否出现瓶颈?

    问题2。 "T6 = DIN 的最后一个 SCLK 边沿到 DOUT 的第一个 SCLK 上升边沿的延迟。" 如果是

    SPI.transfer (0x50 | STATUS_reg);// b01010000
    SPI.transfer (0x00);//第二个命令字节、只写入一个寄存器
    spi.transfer (STATUS_DATA);//将数据字节写入寄存器

    我仅从微控制器发送信号、因此它应该是"从 DIN 的最后一个 SCLK 边沿到下一个 DIN 的第一个 SCLK 上升边沿的延迟"。
    尤其是在使用 RDATA 后、我每通道读取24位数据时。 在这种情况下、它将"从 DOUT 的最后一个 SCLK 边沿到下一个 DOUT 的第一个 SCLK 上升边沿的延迟"。 时钟是否可以连续24次脉冲、我只需获取24位的整个块?

    谢谢、

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

    您好、Khoi、

    1. 如果您遇到信号完整性问题、则最好尝试使用较低的 SCLK 频率、而不是较高的 SCLK 频率。 请注意、运行 SCLK 的速度快于 FCLK/2将超出 ADS1256规格、因此不建议这样做。
    2. 如果处于 SDATAC 模式并使用 RDATA 命令获取数据、则必须在第一个命令字节后包含 T6延迟(请参阅 ADS1256数据表中的图30)。

      但是、如果您处于 RDATAC 模式、则只需发送24个连续时钟即可超时数据、如图32所示。

    我希望这会有所帮助!

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

    尊敬的 Chris:

    感谢您的支持。 我使 ADS1256能够与 ESP32配合使用。 但是、我遇到了以下错误。

    在差分模式下、我测量电源电压从0到3V。 该程序工作正常、我能够在终端监视器中记录原始无符号整数数据。 但是、当我增加/减少 电压时、程序偶尔会中断、该电压的值介于~900、000和~1、000、000之间。

    中断行为如下:当数据日志从~900000增加到~1000000时、数据变为-1、然后变为0。 一旦变为零、我就无法再收集多少数据、除非我复位微控制器。 当我将值从~1、000、000降低到~900、000时、这种行为类似。

    除此之外、代码工作正常

    您是否知道这样的情况? 您对调试有什么建议吗?

    谢谢、

    Khoi Ly

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

    您好、Khoi、

    ADS1256和 ESP32之间是否有良好的接地连接? 这种行为可能由通信中断造成、如果 MCU 和 ADC 接地漂移、可能会导致通信中断。

    我还建议将此行为与 SPI 通信的逻辑分析仪捕获进行比较、以确定您是否确实丢失了与 ADC 的通信、或者 ESP32代码中是否发生了什么情况。

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很确定问题不是因为失去了连接。 因为只要我超过900、000和100、000的值、我就会丢失信号。

    只要我丢失数据、SPI MOSI 实际上会将其稳定为低电平、并且在我重置 ESP32之前无法使其再次工作。

    谢谢、

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

    您好、Khoi、

    您是否有可以共享的设置图像?

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

    这是我的设置。 我认为其中一个问题可能是我必须执行以下步骤:

    SPI.transfer (0x01);//读取数据0000 0001 (01h)//**** 步骤3******
    delayMicroseconds (5);

    ADC_val [i]= SPI.transfer (0);
    ADC_val[i]<= 8;//向左移位
    adc_val[i]|= spi.transfer (0);
    ADC_val[i]<= 8;
    adc_val[i]|= spi.transfer (0);
    delayMicroseconds (2);

    该部件在 Arduino Uno 上完全正常、但在 ESP32上的行为不一致。

    ADS1256_cmd (SPI、cmd);//读取数据0000 0001 (01h)//****** 步骤3******
    ETS_DELAY_us (5);

    ADC_val[i]= ADS1256_read (SPI);
    ADC_val[i]<= 8;//向左移位
    ADC_val[i]|= ADS1256_read (SPI);
    ADC_val[i]<= 8;
    ADC_val[i]|= ADS1256_read (SPI);

    ETS_DELAY_us (2);

    我尝试使用 RDATAC 一次读取全部24位数据、但我得到的结果完全是我的信号读取结果被丢弃。 由于我在每个循环的开头调用 RDATAC、因此每次读取后 SDATAC 是否应该? 如果我要这样做、我必须确保 SDATAC 命令必须在下一个 DRDY 处于低电平时发出、对吧?

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

    也感谢逻辑分析仪屏幕截图!

    在开始循环(和读取数据)之前、您只需调用一次 RDATAC。 在您的循环之后、您可以调用 SDATAC。 此外、为什么在数据读取期间 MOSI 不是低电平?

    如果在读取数据时不重复 RDATAC 命令并保持 DIN 为低电平、是否能获得更好的结果?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Chris:

    因此、在架构方面、我可以在循环之前调用 RDATAC、在循环内部、我将调用 ADS1256_Read (SPI)函数将数据存储到变量中。

    也许、如果这在循环中起作用、我可以设置一个中断/任务来处理此数据收集部分?

    这里的一个问题是、我必须在通道之间进行多路复用。 多路复用如何影响我的 RDATAC? 当我调用 RDATAC 时、它是否适用于所有通道、或者我必须对每个通道调用 RDATAC? 当我切换通道时、我是否需要 SDATAC 并在之后再次调用它?


    当我调用 ADS1256_Read 时、DIN 不是低电平。 我不能完全确定为什么会出现这种情况。 我使用 ESP32中的内置库、它可能会在我不知道的情况下执行一些操作。 但是、由于 SPI 基于同时读取和写入、我可以在读取阶段忽略 DIN、对吧?

    我将给这个机会、看看这是怎么发生的

    Khoi Ly

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

    您好、Khoi、

    通常、您希望 DIN 为"0x00"(即 NOP)、以便 ADC 仅返回数据。 如果 DIN 在数据读取期间形成命令、则可能会中断数据读取操作并获取无效数据。

    当您使用 RDATA 命令时、DIN 是否保持低电平(即、您在 RDATA 字节后发送所有零)?

    对于通道间的多路复用、根本不能使用 RDATAC 模式。 您必须发送 RDATAC、读取数据、发送 SDATAC、更新寄存器设置、然后重复此操作。

    在将数据读取到变量并进行移位时也要小心。 确保将数据转换为正确的数据类型、否则、如果您要移动"uint8_t"、您可能只需尝试对数据执行数学运算即可获得损坏的数据。

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

    尊敬的 Chris:

    我想我可能会发现问题。

    根据数据表中的图30、我将采样率设置为默认值30kHz、并且即使发生中断、也无法在 DRDY 中将 DIN 和 DOUT 设为低电平。

    我尝试使用将 DRATE 设置为1000SPS

    REG =(0x50 | 0x03);CMD = 0x00;数据= 0xA1;// A1H = 10100001 = 1000SPS
    // 0x02 = 0b11 // 0x00 = 0b00 // 0x01 = 0b01
    ADS1256_cmd (SPI、reg);//设置 A/D 数据速率
    ADS1256_cmd (SPI、cmd);
    ADS1256_cmd (SPI、DATA);

    我有三个问题:

    如果 DRATE 设置为1000SPS、这是否意味着我的逻辑分析仪上的 DRDY 也显示1kHz?

    2.我是否如上面的代码所示发送三个单独的字节、或者我是否应该发送一个单个24位流?

    3.第36页的"第2个命令字节:0000 nnnn、其中 nnnn 是要读取的字节数–1"与图35略有冲突。 我想知道第二个命令字节应该是0x00还是0x01?

    我尝试过此代码、但我仍然在逻辑分析仪上看到 DRDY 频率为30kHz。 我想知道原因可能是什么。

    感谢您的帮助、

    Khoi Ly

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

    您好、Khoi、

    如果可以,请尝试避免在每个读取循环中使用任何类型的"printf()"或"print to terminal (打印到终端)"命令。 通常、这些类型的操作需要占用处理器资源、可能会阻止您快速处理下一个/DRDY 中断。

    要回答您的问题...

    1. 是的、只要您从单个 ADC 通道连续读取数据、您就应该会看到/DRDY 下降沿、速率为1kHz。

    2. 同时发送全部三个字节! 如果/CS 在字节之间切换、它将中止 WREG 命令、并且 ADC 的数据速率不会更新。

    3. 我认为图35是正确的...

      在该示例中、正在写入两个寄存器、因此第2个命令字节比寄存器数量少1。

      在代码片段中、您尝试写入单个寄存器、因此您要将第二个命令字节正确设置为零。

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

    非常感谢你的帮助。 我能够获得1kHz DRATE 并修复了 Arduino 代码和 ESP32之间的大量问题。 但是、您能不能帮助我看一下以下逻辑分析仪图像、因为我无法检测到任何明显的东西。

    1) 1)复位至加电

    2) 2)设置状态寄存器(延迟1ms 后)

    3) 3)设置 A/D 控制寄存器(延迟1ms 后)

    4) 4)设置 DRATE (延迟1ms 后)

    5) 5)执行偏移和增益自校准命令

    6)设置多路复用器和通道(无多路复用、我尝试读取 AIN0和 AIN1之间的差分电压)

    7) 7)同步和唤醒(延迟5us 后)

    8) 8) while 循环内部  

    RDATA (逻辑分析仪 CS 启用(4)上有一个可防止 SPI 位重写的噪声信号)

    读取数据流(我检查 T6远高于50 * tFclock)。  

    是否需要在 RDATA 命令和24位 MISO 流之间保持 CS 低电平?

    DRDY 实际上为1kHz、因此我假设任何 WREG 操作也都正确完成。 我不能完全理解为什么最后一幅图中的 MISO 行上没有任何内容。

    谢谢、

    Khoi Ly

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

    您好、Khoi、

    在/CS 变为低电平后(请参阅数据表中的"t3")、在第一个 SCLK 上升沿之前、您应该添加一个延迟。 如果没有这种延迟、ADS1256可能无法注册第一个 SCLK 边沿、通信将不同步。 有时您必须使用 GPIO 来控制/CS、因为某些微控制器不会对内置 SPI 控制信号时序提供太多控制。

    此外、DOUT 信号看起来不正确。 DOUT 应在 SCLK 的上升沿转换、并保持其电平直到下一个上升沿。 您显示的脉冲行为不正常。 目前、您好像观察到一个与 DOUT 容性耦合的信号。

    关于您的问题...是的、/CS 需要在发送"RDATA"命令后保持低电平。 只有在您为数据计时后、它才会返回高电平。

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

    你是对的。 在 RDATA 和24位 MISO 之间的整个时间内 CS 处于低电平是问题的原因。

    我的代码现在可以在 ESP32和 ADS1256之间正常工作。 我计划为未来的人在 ESP32和 ADS1256之间使用开源代码。

    谢谢、

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

    我很高兴您能够解决此问题、很高兴您能分享您的代码! 谢谢!