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.

[参考译文] ADS131M04:与 RP2040通信出现问题

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1232779/ads131m04-problem-to-communicate-with-rp2040

器件型号:ADS131M04

您好!

我在通过 SPI 读取和写入的寄存器时遇到问题。  

我按照文档中的建议写入 SPI Protokoll、但重要的是、我读取从 ADC 获得相同的答案。 (请参阅以下图片)

SPI-Master 是 RP2040。  

除此之外、如果我将 CS 线路设置为 GND、我将获得答案、请参阅、如果我将 CS 线路连接到控制器并在通信前后进行切换、我始终从 ADC 获得0。

有什么想法会出什么问题?

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

    尊敬的 Peter:

    您能否将信号分开并获得清晰的时序? 下面是 从 M04 ADC 读取 GAIN 寄存器(0x4地址)的示例。 您可以读取 MODE 或状态寄存器等具有非零默认值的寄存器、以便在下一帧中检查响应。

    此外、您的原理图也有助于解决该问题。

    此致、

    戴尔

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

    尊敬的 Dale:

    原理图中的3、3V 和 GND 均已连接。 PICO 和 ADC 具有相同的电源。

    目前未连接模拟通道。

    如果我尝试读取寄存器0x4、下面的表格显示了最后一次传输的情况、则会出现一张新图片。 都相同。

    最后是用于发送 reg_read 的代码的快照。 该函数每1ms 调用一次

    iTest = wSPI_ReadRegADC(GAIN1_ADDRESS);
    
    WORD wSPI_ReadRegADC(BYTE address)
    {
       BYTE bRecvData[3] = {0};
       BYTE bData[3] = {0};
       WORD iShift = 0;
    
       WORD iCmd = OPCODE_RREG | (((WORD)address) << 7);
       iShift = (iCmd >> 8);
       bData[0] = TCAST(BYTE, iShift);
       bData[1] = TCAST(BYTE, iCmd);
    
       gpio_put(SPI0_CS0_PIN, false);
       spi_write_blocking(spi0, bData, 3);
       if (spi_is_readable(spi0))
       {
          spi_read_blocking(spi0, 0, bRecvData, 3);
       }
       gpio_put(SPI0_CS0_PIN, true);
       return *bRecvData;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    我希望您已经将 ADC 上的引脚19和2短接在一起、正如您提到的" GND 均已连接"。 但是、我在  RP2040板和 M04 ADC 之间没有看到接地连接、他们是否有接地连接? 您是否有 M04 ADC 的物理电路板?

    此外、您继续向 ADC 发送0xA20000命令、从而无法从 ADC 中看到返回的寄存器数据。 正确的过程是在第一个帧中发送0xA20000命令、然后在 第二个帧中发送0x000000、正如我向您显示的时序那样。

    此致、

    戴尔

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

    尊敬的 Dale:

    我想我已经解决了这个问题。 这是不止一个问题。  

    首先、接线正确无误、如数据表所示。

    1. 如果我通过 RP2040切换 CS 引脚、ADC 无法识别。 ->临时解决方案,将 CS 永久连接到 GND。 可能是 RP2040的问题。

    2.我的 SPI-Stream 是 zu short、我只发送4Byte。 但在本例中、ADC 始终需要完整数据流的长度5 * 24位。 (1个响应帧和4个通道帧。 数据表中也提到了、但我漏掉了那个部分。

    3.时间不是最好的。 就像您在帖子中所说的那样。 由于 CS 引脚列表始终位于 GND,因此我必须缩短数据流之间的差距,从而获得错误的答案。 我在 SPI 帧之间做了长时间的休息、现在看起来它可以正常工作。

    谢谢 Dale 的提示,让我在正确的方向. :-)

    但有人对第1点有想法吗?  

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

    尊敬的 Peter:

    对于项目1、 您可能必须检查接地连接、RP2040的输出信号电平、还必须检查/CS 是否在 ADC 引脚上的数字信号之前可用。 如果您设计自己的 PCB 板、该板在同一电路板上包含 ADC 器件和微控制器、这应该不会出现这种问题、因为它将具有良好的接地和信号连接。

    此致、

    戴尔

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

    尊敬的 Dale:

    我明白了。  
    问题是您的临时设置。

    ADC 与 RP2040在分线板上的引脚12 (CS 引脚)之间的连接不良。  

    现在一切都按预期运行。

    感谢 Dale 的回答、以获取一些用于解决该问题的外部思路。