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.

[参考译文] ADS1231:具有 MSP430F5529的 SPI 接口

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1001202/ads1231-spi-interface-w-msp430f5529

器件型号:ADS1231
主题中讨论的其他器件:MSP430F5529

您好!

在我的体重秤设计中、我使用以下代码在 ADS1231和 MSP430F5529之间进行通信。  结果数据如下所示。 如您所见、每个数据点的最后两个字节按预期一致、但第一个字节 会有所不同。 造成这种不一致的原因是什么?  SPI 协议的传输的第一个字节是否有问题? 我们非常感谢您的帮助。

/*
 * main.c
 *
 * Updated on: Oct 22, 2020
 *     Author: Yamen Alimam
 */

#include <msp430.h> 
#include <stdint.h>
#include <stdio.h>

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;                              // hold watchdog timer

    UCB0CTL1 |= UCSWRST;                                   // software reset enable

    P3SEL = BIT1 + BIT2;                                   // configure SPI pins (P3.1 = MISO, P3.2 = SCLK)
    P2DIR |= BIT2 + BIT3;                                  // P2.2 = SPEED, P2.3 = PWDN, outputs
    P2OUT = 0x08;                                          // 10 SPS, active

    UCB0CTL0  = UCMST + UCSYNC + UCMODE_0 + UCMSB;         // master mode, msb first, synchronous
    UCB0CTL1 |= UCSSEL_3;                                  // select SMCLK (1 MHz)
    UCB0CTL1 &= ~UCSWRST;                                  // initialize SPI interface

    int32_t data1, code;
    int16_t data2;
    int8_t data3;

    while (1)
    {
        if((P1IN & 0x08) == 0)
        {
            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x21;
            while (!(UCRXIFG));              // if RX operation is not complete, continue
            data1 = UCB0RXBUF;

            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x22;
            while (!(UCRXIFG));
            data2 = UCB0RXBUF;

            while (!(UCB0IFG & UCTXIFG));
            UCB0TXBUF = 0x23;
            while (!(UCRXIFG));
            data3 = UCB0RXBUF;

            code = (data1 << 16) + (data2 << 8) + data3 + 0x800000;
            code &= 0x00ffffff;
            printf("The code is %lx\n", code);
        }
    }
}

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

    Yamen、您好!

    我看不到端口1的引脚设置。  您正在检查端口1.3上的哪些内容?  您是否还将 DRDY/DOUT 连接到此引脚?  如果是这样、您必须确保正确配置它。

    我还看到您正在将数据从二进制补码转换为单极格式、其中0x800000实际上是0输入。  当您进行这些类型的转换时、我强烈建议您使用逻辑分析仪的示波器来验证您的捕获和转换是否按预期工作。  通过此分析、您还可以验证是否在正确的 SCLK 阶段读取数据。

    当转换完成时、DRDY/DOUT 将从高电平转换为低电平。  如果您轮询引脚以查看是否发生了事件、则应确保在读取最后一个字节后将引脚设置为高电平、否则您可能会在错误的时间开始读取。  要强制 DRDY/DOUT 为高电平、您需要发送额外的时钟(或写入额外的虚拟字节)。  必须在下一个转换更新周期之前从 ADS1231读取所有数据。  确保在 DRDY/DOUT 变为低电平之后尽快读取数据、并且在下一次转换更新之前读取所有数据。

    如果您向我发送了通信的范围截图、我可以帮助我进行进一步分析。  此外、请确保您具有有效的基准电压、并且 PDWN 引脚设置为高电平。  还要验证速度引脚是否未悬空、并在10sps 数据输出速率下设置为低电平。

    此致、

    Bob B

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

    尊敬的 Bob:

    我传输了一个额外的虚拟字节、结果看起来更加一致。 感谢你的帮助。