TI论坛
直播中

李平

7年用户 1259经验值
私信 关注
[问答]

利用MSP432P401R(MASTER)初始化ADS1299并尝试读取ID,读出来都是0x00,为什么?


  • 我利用MSP432P401R(MASTER)初始化ADS1299并尝试读取ID,但读出来都是0x00,并且我再CODE裡面只有输入5个byte的资料,却跑出7个byte,我不知道发生什么事
    此图为整体逻辑分析仪讯号图,CH0为MOSI,CH1为MISO,CH2为CLOCK,CH3为DRDY,CS我让他恆保持低态

    以下3张图为第一张图的放大图,从第一个byte依序往下





    /* DriverLib Includes */#include /* Standard Includes */#include #include #define HZ  3000000UL/* Statics */static volatile uint8_t RXData = 0;static uint8_t TXData = 0;uint8_t A = 0;int main(void){    WDT_A->CTL = WDT_A_CTL_PW |             // Stop watchdog timer             WDT_A_CTL_HOLD;     P1->SEL0 |= BIT5 | BIT6 | BIT7;         // Set P1.5, P1.6, and P1.7 as                                             // SPI pins functionality     EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SWRST; // Put eUSCI state machine in reset     EUSCI_B0->CTLW0 = EUSCI_B_CTLW0_SWRST | // Remain eUSCI state machine in reset             EUSCI_B_CTLW0_MST |             // Set as SPI master             EUSCI_B_CTLW0_SYNC |            // Set as synchronous mode             //EUSCI_B_CTLW0_CKPL |            // Set clock polarity low             EUSCI_B_CTLW0_CKPH |            //Phase high             EUSCI_B_CTLW0_MSB;              // MSB first     EUSCI_B0->CTLW0 |= EUSCI_B_CTLW0_SSEL__ACLK; // ACLK     EUSCI_B0->BRW = 0x01;                   // /2,fBitClock = fBRCLK/(UCBRx+1).     EUSCI_B0->CTLW0 &= ~EUSCI_B_CTLW0_SWRST;// Initialize USCI state machine  //   EUSCI_B0->IE |= EUSCI_B_IE_RXIE;        // Enable USCI_B0 RX interrupt /////////////////////////////////////////////////SPI INTERRUPT/////////////////////////////////////////////////////////////////////////////////     __enable_irq();     // Enable eUSCI_B0 interrupt in NVIC module     NVIC->ISER[0] = 1 << ((EUSCIB0_IRQn) & 31);     // Wake up on exit from ISR     SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk;     // Ensures SLEEPONEXIT takes effect immediately     __DSB();     P1->OUT &= ~BIT0;     P1->DIR |= BIT0;                        // Set P1.0 LED     P1->SEL0 |= BIT5 | BIT6 | BIT7;         // Set P1.5, P1.6, and P1.7 as                                             // SPI pins functionality ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     /*TXData = 0x01;                          // Initialize TX data to 0x01     while(1)     {        TXData++;        spiTx(TXData);        spiRx ();     }*/     //CS_Low();     P3->DIR |= BIT0;     P3->OUT ^= BIT0; //CS_Low     __delay_cycles(HZ);     P3->DIR |= BIT5;     P3->OUT =  BIT5;       //CLKSEL High     __delay_cycles(HZ/1000);     P5->DIR |= BIT1;     P5->OUT =  BIT1;       //PWDN High     __delay_cycles(HZ);     P2->DIR |= BIT7;     P2->OUT = BIT7;      //RESET High     __delay_cycles(HZ);     P2->DIR |= BIT7;     P2->OUT ^= BIT7;      //RESET LOW     __delay_cycles(HZ);     P2->DIR |= BIT7;     P2->OUT = BIT7;      //RESET High     __delay_cycles(HZ);     TXData = 0x11;//SDATAC     EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;// Clear TXIFG flag     EUSCI_B0->IE |= EUSCI_B_IE_TXIE;    // Enable TX interrupt     TXData = 0x12;//RDATA     EUSCI_B0->IFG |= EUSCI_B_IFG_TXIFG;// Clear TXIFG flag     EUSCI_B0->IE |= EUSCI_B_IE_TXIE;    // Enable TX interrupt     P2->DIR |= BIT6;     P2->OUT |= BIT6;    //Set Start High     A = spi_bmp183_read8(0x20);     }uint8_t spi_bmp183_read8(uint8_t reg) {  // Make sure transmit buffer is clear  while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_TRANSMIT_INTERRUPT)));  SPI_transmitData(EUSCI_B0_BASE, reg);                 // Transmit register address  __delay_cycles(HZ/1000);  // Send clock pulses.  This will push slave to send data to master on MISO line.  SPI_transmitData(EUSCI_B0_BASE, 0x00);  __delay_cycles(HZ/1000);  SPI_transmitData(EUSCI_B0_BASE, 0x00);  __delay_cycles(HZ/1000);// Make sure transmit buffer is clear  while (!(SPI_getInterruptStatus(EUSCI_B0_BASE,EUSCI_B_SPI_RECEIVE_INTERRUPT)));  RXData = SPI_receiveData(EUSCI_B0_BASE);      // Pick up received byte in SPI receive data register  return RXData;}void EUSCIB0_IRQHandler(void){    if (EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG)    {        EUSCI_B0->TXBUF = TXData;           // Transmit characters        __delay_cycles(HZ/1000);        //EUSCI_B0->TXBUF = 0x20;           // Transmit characters        //__delay_cycles(HZ/100000);        //EUSCI_B0->TXBUF = 0x00;           // Transmit characters        //__delay_cycles(HZ/100000);        EUSCI_B0->IE &= ~EUSCI_B__TXIE;    }}

回帖(3)

魏渝韦

2024-12-5 14:13:36
好象是两个问题,    看芯片波形没有 READY 的脉冲,  mosi 也不见任何波形,  是不是先验证芯片有没有正常工作了?    可以先查查供电连接的问题,   而5byte变成了 7 个byte ,   那是你的软件问题了
举报

陈晓晨

2024-12-5 14:13:44
  DRDY 一直为高,芯片并未正常工作,像是一直处于复位状态。上电时reset和Power down引脚都由低高的变化过程吧?检查下是否都为高电平了。
另外,Start拉高时,DRDY也应由低到高的变化。
举报

糖栗子

2024-12-5 18:03:19
根据您提供的信息,您在使用MSP432P401R(主设备)初始化ADS1299并尝试读取ID时遇到了问题。读取到的ID始终为0x00,而且在代码中只输入了5个字节的数据,但实际却输出了7个字节。以下是一些可能的原因和解决方案:

1. 通信协议错误:请确保您使用的SPI通信协议与ADS1299兼容。检查您的代码,确保SPI初始化和配置正确。

2. 错误的寄存器地址:请检查您是否使用了正确的寄存器地址来读取ADS1299的ID。根据ADS1299的数据手册,ID寄存器的地址是0x00。

3. 错误的数据长度:您提到代码中只输入了5个字节的数据,但实际输出了7个字节。这可能是因为您的代码中存在额外的数据传输。检查您的代码,确保只发送了5个字节的数据。

4. 硬件连接问题:请检查您的硬件连接,确保MSP432P401R和ADS1299之间的SPI接口连接正确。检查MOSI、MISO、SCLK和CS引脚是否正确连接。

5. 逻辑分析仪设置问题:您提到使用了逻辑分析仪来观察信号。请检查逻辑分析仪的设置,确保采样率和触发设置正确。

6. ADS1299配置问题:请检查您的ADS1299配置,确保其处于正确的工作模式。根据ADS1299的数据手册,您可能需要配置一些寄存器来使设备正常工作。

为了解决这个问题,您可以尝试以下步骤:

1. 检查您的代码,确保SPI通信协议和寄存器地址正确。
2. 检查硬件连接,确保所有引脚正确连接。
3. 检查逻辑分析仪设置,确保采样率和触发设置正确。
4. 检查ADS1299配置,确保其处于正确的工作模式。

希望这些建议能帮助您解决问题。如果您需要更多帮助,请提供更多详细信息,以便我们更好地了解您的问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分