TI论坛
直播中

恐龙之家

9年用户 908经验值
私信 关注
[问答]

求助,关于ADS1118 SPI通信及读取数据的疑问求解


  • 亲们~大家好,我最近在使用一款模数转换芯片ADS1118,现在遇到以下问题,希望可以得到大家的帮助,小弟感激不尽~~
    1.ADS1118和单片机(我用的是MSP430F149)通信要使用SPI通信协议,但我现在不清楚如何读取模数转换之后的数字量,比如说怎么使用SPI中断读取数据?仅仅只用在中断函数体中写 “Data = U0RXBUF” 吗??
    2.单片机执行程序之后与ADS1118进行通信之后,我在SCLK引脚上检测到了时钟信号,与ti提供的说明书上的波形基本一样,(波形图如下)不知道正不正确,请大家帮忙看看~~

    3.但检测 ADS1118 的 DOUT 引脚时却出现这样的波形,不论有没有模拟量输入都是的波形,如下图,这我就费解了...
    最后我的硬件连接图如下:我将AIN0接正电压,AIN1接地这个连接方式有错误吗?
    程序如下(我用的是默认配置,没有修改):(我使用的是IAR Embedded Workbench进行编程的)
    #include
    #define CPU_F ((double)8000000)
    #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
    #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
    #define uchar unsigned char
    #define uint unsigned int
    #define CS_L P2OUT = 0X00
    #define CS_H P2OUT = 0Xff
    #define LED_ON P1OUT = 0xff
    #define LED_OFF P1OUT = 0x00
    char cmd[] = {0x05,0xeb,0x00,0x00},SLV_Data = 0xFF;
    uint a = 0,U0TX_BYTE=1;
    void SPI_WRITE()
    {
    uint i;
    CS_L;
    //while(!U0TX_BYTE);
    for(i=0;i<4;i++)
    {
    TXBUF0 = cmd; // Transmit first character
    //while(!U0TX_BYTE);
    //U0TX_BYTE = 0;
    }
    CS_H;
    }
    int main(void)
    {
    unsigned int i;
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    P1OUT = 0x000; // Setup P1.0 for LED output
    P1DIR |= 0x0ff;
    P2DIR |= 0X0FF;
    P3SEL = 0x00E; // Setup P3 for SPI mode
    P3OUT = 0x020; // Setup P3.4 for Scope trigger and
    P3DIR |= 0x030; // P3.5 for slave initialization
    U0CTL = CHAR + SYNC + MM + SWRST; // 8-bit, SPI, Master
    U0TCTL = SSEL1 + STC; // SMCLK, 3-wire
    U0BR0 = 0x002; // *** = SMCLK/2
    U0BR1 = 0x000;
    U0MCTL = 0x000;
    ME1 = USPIE0; // Module enable
    U0CTL &= ~SWRST; // SPI enable
    IE1 |= URXIE0; // Recieve interrupt enable
    _EINT(); // Enable interrupts
    P3OUT &= ~0x020; // Toggle P3.5: slave reset
    P3OUT |= 0x020;
    i = 50000; // Delay
    do (i--);
    while (i != 0);
    CS_L;

    while (1)
    {
    CS_L;
    //SPI_WRITE(); // Transmit first character
    while ((IFG1 & UTXIFG0) == 0);
    TXBUF0 = 0x05; //给ADS1118发送数据
    TXBUF0 = 0x8B;
    TXBUF0 = 0x00;
    TXBUF0 = 0x00;
    CS_H;
    LPM0; // CPU off
    //while(1);
    }
    } // End Main
    #pragma vector = USART0RX_VECTOR
    __interrupt void SPI0_rx (void)
    {
    CS_L;
    P1OUT = U0RXBUF;
    //P3OUT ^= 0x010; // XOR P3.4 for scope trigger
    while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
    //P1OUT = 0XFF;
    TXBUF0 = 0x05;
    TXBUF0 = 0xeb;
    TXBUF0 = 0x00;
    TXBUF0 = 0x00;
    CS_H;
    }
    恳请大家提供帮助与建议,不胜感激,跪谢Orz


回帖(1)

安德森大

2025-1-14 10:19:45
您好!关于您在使用ADS1118和MSP430F149进行SPI通信时遇到的问题,我会尽量帮助您解答。

1. ADS1118和MSP430F149通信读取数据:
在使用SPI通信协议时,您需要配置好SPI接口,然后在中断服务程序中读取数据。以下是读取数据的基本步骤:

a. 配置SPI接口:设置MSP430F149的SPI接口,包括时钟频率、主从模式等。
b. 发送读取命令:通过SPI发送读取命令给ADS1118,使其开始模数转换。
c. 读取数据:在SPI中断服务程序中,当接收到ADS1118发送的数据时,将数据存储到变量中。

示例代码(仅供参考):

```c
#include

void spi_init(void) {
    // 配置SPI接口
}

void spi_send(uint8_t data) {
    // 发送数据
}

uint8_t spi_receive(void) {
    // 接收数据
}

void spi_read_data(uint16_t *data) {
    // 发送读取命令
    spi_send(0x00); // 示例命令

    // 读取数据
    *data = spi_receive();
}

int main(void) {
    WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗

    spi_init(); // 初始化SPI接口

    uint16_t data;
    spi_read_data(&data); // 读取数据

    while(1) {
        // 循环处理数据
    }
}
```

2. 时钟信号波形:
您提到在SCLK引脚上检测到了时钟信号,与TI提供的说明书上的波形基本一样。如果波形与数据手册中的波形相似,那么您的时钟信号应该是正确的。

3. DOUT引脚波形问题:
关于您提到的DOUT引脚波形问题,可能是由于以下几个原因导致的:

a. SPI接口配置不正确:请检查您的SPI接口配置是否正确,包括时钟频率、主从模式等。
b. 读取数据时机不正确:请确保在SPI中断服务程序中正确地读取数据。
c. ADS1118配置问题:请检查ADS1118的配置是否正确,包括输入通道、采样率等。

建议您根据以上建议进行排查和调整,希望对您有所帮助。如果还有其他问题,请随时提问。
举报

更多回帖

×
20
完善资料,
赚取积分