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.

[参考译文] ADS131M06:ADC SPI 通信未收到预期结果

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1070202/ads131m06-adc-spi-communications-not-receiving-expected-results

部件号:ADS131M06
“线程:测试”中讨论的其它部件,

根据数据表。 要写入您发送的注册表:
香港时间19时5分

因此,我将我的 TX 缓冲区设置为0x6180,以写入地址为0x03h 的时钟(根据数据表)
IE:0110 0001 1000 0000

制造 N 0不应真正影响此处的任何内容。 当我进行24位的 MCSPI 数据传输时,我会得到一致的0x3fc7f8 (或其他类似结果)返回。

下面是我用来发送这些消息的代码:

void adcWriteReg(
                 unsigned short data, unsigned char wordLength, unsigned char size, MCSPI_Transaction spiTransaction) {
    int32_t             status = SystemP_SUCCESS;
    uint32_t            i;
    int32_t             transferOK;
    unsigned char shiftValue;

    if(wordLength == 16) {
        shiftValue = 0;
    } else if(wordLength == 24) {
        shiftValue = 8;
    } else if(wordLength == 32) {
        shiftValue = 16;
    } else {
    }

    // Setup Buffers
    gMcspiTxBuffer[0] = (data << shiftValue);
    gMcspiRxBuffer[0] = 0U;

    spiTransaction.count    = size / (gConfigMcspi0ChCfg[0].dataSize / APP_MCSPI_WORD);

    transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI0], &spiTransaction);

    if((SystemP_SUCCESS != transferOK) ||
           (MCSPI_TRANSFER_COMPLETED != spiTransaction.status)) {
       DebugP_assert(FALSE); /* MCSPI transfer failed!! */
    } else {
        /* Print Data */
        for(i = 0U; i < size; i++) {
            DebugP_log("( %x -> %x )\n", gMcspiTxBuffer[i],gMcspiRxBuffer[i]);
        }
    }
}

...
adcWriteReg((WREG | CLOCK_ADDR), 24, 1, spiTransaction);
adcWriteReg(CLOCK_CH0_EN | CLOCK_OSR_1024 | CLOCK_PWR_HR, 24, 1, spiTransaction);
...

也许这是 MCSPI 工作方式方面的一个错误,但我已正确设置了所有内容(据我所知):

4引脚模式,TX 和 Rx,D1上的输入,D1上的 TX 启用,d0上的 TX 禁用,传输模式阻止,CS 极性(低),频率25MHz,数据帧大小(24)

有谁能帮助我了解如何发送和接收我希望看到的数据?

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

    你好,迪伦,

    我同意您 对 书面指令的高级假设正确而良好。 我对 MCSPI 不熟悉,但您似乎只是在硬件中配置 SPI 设置,我在那里没有发现任何问题。

    我建议您查看示例代码 https://www.ti.com/lit/zip/sbac254 。 我很快就查看 了您 的代码 ,但看不到任何明显的东西。 但是,我们可以在您看到示例代码的编写方式(我认为,与此代码片段相比,这种编写方式更容易一些)后再次访问。

    作为一个附带问题,您是否已验证这些内容是否有效?  这是 ID 寄存器(地址:0x00)的用途,该空间为只读,前两个字节是已知的。 如果我们正在验证您发送的帧的格式是否正确,我建议您先从“读取”开始,然后再转到“写入”。 这意味着您将有成功的基础,然后再着手改变 SPI 框架的其他部分。

    最佳

    Cole

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

    是的,我已经看了一段时间了,还没有发现任何东西。

    尝试读取时,我收到来自 MCSPI 传输的此输出:

    (a00000 -> 7f8ff1)

    这不是您所期望的(文档显示0x26XX),但我测试了这8次,每次都收到相同的消息。

    进一步澄清了 MCSPI 的工作原理。 它是某些 CCS TI 主板的库构建,我的案例是 LP243AM。

    当您运行 MCSPI_TRANSFER 时,它基本上执行来自 TX 阵列的 N 个元素和输出到 RX 阵列的写入,并相应地设置 CS 引脚。 下面是读取代码的样子。 我假设 ADS 默认为24位字长模式,并已将其配置为24位字长模式。 在我的示波器上,我已确认在 TX 上发送并在 RX 中接收的位模式与上面打印的顺序相同。  

    至于物理硬件,我将8.2MHz 振荡器连接到 CLKIN 引脚,重置引脚连接到3.3V,DVDD 和 AVDD 连接到3.3V,AVGND 和 DVGND 连接到接地(3.3V 和接地引脚由我的主板提供)。 除了与地线连接的 AIN0_N 和 AIN0_P 保持未连接(现在)之外,我将所有 AIN 引脚都保持未连接状态。 我还具有1.23V 的 REFIN (使用从3.3V 输出的分压器)。  

    void adcReadReg( unsigned short addrMask,
                     unsigned char wordLength, unsigned char size, MCSPI_Transaction spiTransaction) {
        int32_t             status = SystemP_SUCCESS;
        uint32_t            i;
        int32_t             transferOK;
        unsigned char shiftValue = wordLength - 16; //Bits to shift based on size.
                                                    //for 24, we shift 8 bits to the left
    
        // Input Message onto buffer.
        gMcspiTxBuffer[0] = ((RREG | addrMask) << shiftValue);
        gMcspiRxBuffer[0] = 0U;
        
        //this is just how many array elements get transferred and roughly is just "size"
        spiTransaction.count    = size / (gConfigMcspi0ChCfg[0].dataSize / APP_MCSPI_WORD);
        
        //transferOK is a whether the thing is successful
        transferOK = MCSPI_transfer(gMcspiHandle[CONFIG_MCSPI0], &spiTransaction);
        
        //This prints the TX and RX buffers
        if((SystemP_SUCCESS != transferOK) ||
               (MCSPI_TRANSFER_COMPLETED != spiTransaction.status)) {
           DebugP_assert(FALSE); /* MCSPI transfer failed!! */
        } else {
            /* Print Data */
            for(i = 0U; i < size; i++) {
                DebugP_log("( %x -> %x )\n", gMcspiTxBuffer[i],gMcspiRxBuffer[i]);
            }
        }
    }
    
    
    void *mcspi_loopback_main(void *args)
    {
        int32_t             status = SystemP_SUCCESS;
        uint32_t            i;
        int32_t             transferOK;
        MCSPI_Transaction   spiTransaction;
    
        Drivers_open();
        Board_driversOpen();
    
        DebugP_log("[ADS131M06] TX-RX example started ...\r\n");
    
        /* Memfill buffers */
        for(i = 0U; i < APP_MCSPI_MSGSIZE; i++)
        {
            gMcspiTxBuffer[i] = 0U;
            gMcspiRxBuffer[i] = 0U;
        }
    
        spiTransaction.args     = NULL;
        spiTransaction.txBuf    = (void *)gMcspiTxBuffer;
        spiTransaction.rxBuf    = (void *)gMcspiRxBuffer;
        spiTransaction.channel  = gConfigMcspi0ChCfg[0].chNum;
        spiTransaction.count    = REG_MCSPI_MSGSIZE / (gConfigMcspi0ChCfg[0].dataSize / APP_MCSPI_WORD);
    
        // Delay because we aren't reading DRDY
        ClockP_sleep(1);
    
        /* Read from ID (hex is just zeros for A) */
        adcReadReg(0x0000, 24, 1, spiTransaction);
    
        // Delay because we aren't reading DRDY
        ClockP_sleep(1);
    
        Board_driversClose();
        Drivers_close();
    
        return NULL;
    }

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

    你好,迪伦,

    不幸的是,我有一些相互冲突的假设需要与你确认。 根据数据表,框架中有多个词:

    我假设你的单词大小是24位,因为这就是你的回答。 我们将有8个字的数据。

    或者,如果是单个写入,所有通道数据和 CRC (如果禁用,则为零),直到我们可以获取寄存器数据:

    现在,有趣的部分来自文本,在 阅读 包含寄存器读取结果的单词时,我们希望0x00填充 LSB 单词:

    您的回答在最近8位和 LSB 中有大约1b 位,因此我无法确定您正在读取寄存器数据的字词。 我猜您是在命令完成后立即读取数据,结果是读取通道0数据。 我本以为 spiTransaction.count 会在以后计数8帧,但我看不到这种情况,因为它似乎完全基于单词大小,而不包括整个帧。

    即使发送了无效命令,它也会被处理为空,因此我们仍会在 LSB 上看到零填充0x00。

    让我知道你的想法。

    最佳

    Cole

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

    是的,我读了这一部分,我试图利用短 SPI 通信来进行基于设置的操作,但所有通道都需要关闭。 无论如何,我会发送一条已读的消息+一堆零,我也会设置 nnnnnnnn =1,这样它可能会在一条消息后向我发送数据,并得到:
    (a00100 -> 7f8ff1)
    (0 -> fe3fc7)
    (0 -> f8ff1f)
    (0 -> e3fc7f)
    (0 -> 8ff1fe)
    (0 -> 3fc7f8)
    (0 -> ff1fe3)
    (0 -> fc7f8f)

    (a00100 -> 7f8ff1)
    (a00100 -> fe3fc7)
    (a00100 -> f8ff1f)
    (a00100 -> e3fc8f)
    (a00100 -> f1fe3f)
    (a00100 -> c7f8ff)
    (a00100 -> 1fe3fc)
    (a00100 -> 7f8ff1)

    或者,其中 nnnnnnnnnn = 0:

    (a00000 -> 7f8ff1)
    (0 -> fe3fc7)
    (0 -> f8ff1f)
    (0 -> e3fc7f)
    (0 -> 8ff1fe)
    (0 -> 3fc7f8)
    (0 -> ff1fe3)
    (0 -> fc7f8f)

    (a00000 -> 7f8ff1)
    (a00000 -> fe3fc7)
    (a00000 -> f8ff1f)
    (a00000 -> e3fc7f)
    (a00000 -> 91fe3f)
    (a00000 -> c7f8ff)
    (a00000 -> 1fe3fc)
    (a00000 -> 7f8ff1)

    有趣的是,所有输入变量都导致了几乎所有相同的输出。第一个消息输出始终相同。

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

    你好,迪伦,

    如  您所述,要进入短 SPI 通信,请禁用通过时钟寄存器(覆盖默认值1b 到0b)的所有信道(CHX_EN)。 我认为我们尚未验证您是否已成功写入设备,因此我不确定我是否可以假设设备有效。  通常,客户将有 一个初始化例程 来利用 短 SPI 通信。  

    有趣的是,你的跟进似乎应该弥补这一点,但这仍然毫无意义。 它们与 现实数据不一致(介于-100mV 或接近2.8V 之间),并且它们与任何明显的寄存器空间不一致。

    此时, 我希望看到 一个逻辑分析器或多通道示波器屏幕截图,该屏幕截图显示 了读命令 DOUT,DIN,SCLK 和 CS 的计时;读取 ID 寄存器应该可以正常。 隔离信号将不起作用(即 我们需要 触发 CS 并检出第一个和第二个字)。

    如果我们都同意设备应该遇到正确的命令(如您之前所述),那么我们就必须开始查看硬件以确定是否有任何问题。

    最佳

    Cole

    编辑:只需向其他读者澄清

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

    是的,我认为这可能是硬件问题。 我订购 了一个新的适配器 :https://www.amazon.com/gp/product/B07MYMX1QS/ ,希望它能让我放入一个新芯片,而不会浪费它(即焊接它)。 示波器的引脚不是很好。 这里有一些图片,但数据输出引脚似乎输出的电压低于应有的电压,并且 CS 引脚在开始采集 SCKL 之前有很长的延迟。 我使用1GSA/s 或200MHz 示波器记录了这些信息,因此读数不会超过我的采样时间。

    莫西语(黄色),莫西语(紫色)。 两个通道上的每 Div V 为1V/div。 莫西似乎给了我3.3V 的信息,但莫西似乎只达到1.25V?

    MOSI (黄色) SCK (紫色)。 奇怪的是,时钟信号似乎在2.5V 至0.8V 之间,我不知道 LPam243是否有信号,但这可能是正常的。

    (前24位从上放大)

    这是一件有趣的事。 味噌(黄色) SCKL (紫色)

    (放大以上)这里最有趣的是我的 CCS 打印了所有邮件的0,但 ADS 打印了所有邮件的这种模式。 对我们来说,这仍然不是一种有意义的模式,但值得注意的是,存在着差异。

    最后,CS (黄色),SCKL (紫色)只是表明选择芯片是有效的,尽管选择芯片的时间似乎在选择芯片之后很长一段时间,之后选择芯片的时间才会在选择 SCKL 开始之前,而选择芯片的时间可能会随着我们的螺旋而变慢。

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

    嗨,迪伦- 当 Cole 不在办公室时,我会尽力提供帮助。

    从最后一点开始,CSN 下降边缘和第一个 SCLK 上升边缘之间的延迟由主机控制器决定。 从 ADC 的角度来看,这种延迟不是问题(事实上,没有足够的延迟通常会导致 问题)。

    关于 SCLK,我更关注在驾驶 SCLK 时观察到的平均高低水平。 如您所见,SCLK 似乎仅在800 mV 和2.4 V 之间切换。但是,设备 预期 逻辑低电压不大于0.2*DVDD =660 mV。 同样,预期逻辑高压至少为2.64 V 或更高。 在最低逻辑高电平和最高逻辑低电平之间,ADC 可能会错过一些 SCLKs。 另一个设备或电路组件是否可能正在加载 SCLK 信号? 您是否可以卸下任何部件(即上拉或串联电阻器)?

    此致,

    瑞安

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

    我完全同意,苏格兰场是一个大问题。 我使用的是 LPAM243X,除 ADC 的引脚外,没有任何针脚连接。 我将执行一些测试,看看是否可以修复,否则我将在 LPAM243X 论坛上发布有关该测试的信息。 我还想知道为什么味噌信号电压非常低,这是正常的吗? SCK 错误会影响这一点吗?

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

    您好,迪伦,

    输出引脚不受 SCLK 振幅影响。 但是,与 SCLK 类似,如果有东西正在加载输出并消耗过多电流,驱动该针脚的内部电路可能会无法产生正确的电压值。 您将在电气特性表中注意到,在绘制~ 1 mA 时测量 V_OL 和 V_OH (请参阅测试条件)。 没有说明这些引脚在电压降之前可以获得多少电流。

    很难准确判断某些图片中的味噌和 SCLK 在做什么。 您是否可以尝试用 SCLK 和味噌捕获一个图像,仅用于24个时钟(即,如果您使用的是24位字大小,则为一个输出字)?

    此外,您是否有 PCB 设置的图片以及可以共享的原理图?  

    此致,

    瑞安

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

    也许我应该为味噌下拉针脚? 这是一个粗略的原理图,右侧是引脚17至32。 尽管电阻器和电容器当前未连接。 味噌几乎直接从被测设备插入 LPAM243上的引脚以进行数据输入。 这可能只是一个电流源问题,因为我正在使用 LPAM243X 上的3.3V 为 ADC 供电,它可能无法提供足够的电流,使主板为被测设备输出足够强的信号? 我还发现 SCKL 电压在未连接任何设备时是相同的,因此至少这是 LPAM243X 问题。

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

    您好,迪伦,

    感谢您的分享。 也许您可以尝试将 ADS131M06电源与 LPAM243X 电源分离。 使用外部台式电源为 AVDD 和 DVDD 提供3.3 V 电压(分别为引脚15和26)。 您是否能够断开+3.3V 电源与 ADC 电路的连接,并通过电缆连接外部电源? 同时确保 ADC 和外部电源之间的接地连接也是共用的。

    此致,

    瑞安

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

    是的,我正在联系您的 LPAM243执行者,以了解时钟的情况,但我可能要运行一个比较器来检查坏时钟信号,如果仅此一个电源无法解决问题,请尝试使用外部电源。 我的打印示意图板上的电源插针易于访问,我只需设置实验室工作台。

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

    你好,迪伦,

    外部供应是否幸运?

    为了获得未来的一些建议,只要您的数字 IO 电压轨像 RC 滤波器一样向下拉,您就应该注意电源正在达到某种电流限制, 这意味着它不能保持恒定电压(您可以换用可提供电流的外部电源),或者用于漏极开路 IOS 的上拉电阻器的电阻可能太低, 这意味 着电阻器从 电源中抽取太多电流(电阻器的值可以增加)。

    当您以定期模式看到这些骤降时,您需要找到与这些信号对线的信号。 在这种情况下,似乎是很周期性的,所以我希望 SCLK 作为联轴器或在 GND 上提供感应回向。 这种感应回向基本上会导致接地(应为0V)晃动,而不会保持0V 恒定。 在这种情况下,如果您看到100毫伏的电压下降到 GND 以下,则必须确认这不是正常行为。 通常通过布局来降低 GND 路径的电感,但较厚的电线,更多的电线或靠近 ADC 或设备电源插针的电线可以帮助解决此问题。

    最佳

    Cole

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

    LPAM243中的 SCKL 只是被破坏了。 我没有另一个主板来判断它是否与我的主板或其设计有关,但波形在1MHz 下的比例是正确的,而不是该 ADC 所需的25MHz。 我目前正在努力获取施密特触发器,以便正确调整时钟的范围,因此我需要一些时间才能找出错误信号的问题。 感谢您的建议,当我正确调整 SCKL 的规模时,我会再做一个线程。