TI论坛
直播中

李微波

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

利用MSP432P401R与ADS1299进行通信,得不到内部测试讯号的方波,为什么?


  • 我利用MSP432P401R与ADS1299进行沟通,以下是我的代码,输出在示波器上显示RESET、START、CS皆为HIGH,DIN则为一直线的High,DOUT和SCLK为一直线的LOW,我不知道哪裡出问题,不知道是暂存器没设定好,还是上电程序错误导致讯号有问题,得不到内部测试讯号的方波,我没有逻辑分析仪,拜託帮忙只要一下谢谢。

    #include "ti/devices/msp432p4xx/inc/msp.h"#include static uint8_t RXData[];static uint8_t TXData;static char i;#define HZ  3000000UL//3MHZ MCLKint main(void){////////////////////////////////////////////////////SPI////////////////////////////////////////////////////////////////////////    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    //P3->DIR |= BIT0;                        // P3.0 set as output    CS    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_OFS |            // 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///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////    CS_High();    ads1299_initial();    void RESET();    void SDATAC();    __delay_cycles(HZ);    WREG(0x03 + 0x40,0xE0);//Config3    WREG(0x01 + 0x40,0x92);//Config1    WREG(0x02 + 0x40,0xD0);//Config2   0xC0    WREG(0x05 + 0x40,0x05); //channel1 Normal electrode input  0x60    P2->DIR |= BIT6; //Set Start High    //void START();    __delay_cycles(HZ);    //WREG(0x17 + 0x40,0x00);//Config4    void RDATAC();    //__delay_cycles(HZ);    void Testsignal();    RXData = EUSCI_B0->RXBUF;}void spiTx (uint8_t byte){        while(EUSCI_B0->IFG & EUSCI_B_IFG_TXIFG)        {            EUSCI_B0->TXBUF = byte;           // Transmit characters        }}void spiRx (void){    RXData = EUSCI_B0->RXBUF;}void CS_High (void){    P3->DIR |= BIT0; //CS_High}void CS_Low (void){    P3->OUT ^= BIT0; //CS_Low}void ads1299_initial (void){    __delay_cycles(5*HZ);    P2->OUT ^= BIT7;      //RESET Low    __delay_cycles((4*HZ)/1000000);    P2->DIR |= BIT7;      //RESET High    __delay_cycles((20*HZ)/1000000);    CS_High();    __delay_cycles(HZ);}void RESET(void){    CS_Low();    spiTx(0x06);    __delay_cycles((12*HZ)/1000000);    //__delay_cycles(HZ);    CS_High();}void SDATAC(void){    CS_Low();    spiTx(0x11);    CS_High();    __delay_cycles((3*HZ)/1000000);}void WREG(uint8_t _address, uint8_t value){    uint8_t opcode1 = _address + 0x40;    CS_Low();    spiTx(opcode1);    spiTx(0x00);    spiTx(value);    CS_High();}uint8_t RREG(uint8_t _address)//在RDATAC模式下,RREG指令會被忽略(datasheet P35){    uint8_t opcode1 = _address + 0x20;    CS_Low();    spiTx(opcode1);    spiTx(0x00);    //uint8_t abv[] = spiRx(_address);    CS_High();}void RDATAC(void){    CS_Low();    spiTx(0x10);    CS_High();    __delay_cycles((3*HZ)/1000000);}void START(void){    CS_Low();    spiTx(0x08);    CS_High();}void Testsignal(void){    void SDATAC();    __delay_cycles(HZ);    WREG(0x02 + 0x40,0xD0);    WREG(0x05 + 0x40,0x05);    void RDATAC();}


回帖(3)

王聪

2024-12-5 10:18:31
  1.正常的做法是,抓波形,如果IO不按照你操作的拉高或者拉低,检查你对应部分的操作是否正确,看代码看不出来.
2.你这样的语句正确吗?那个void是干什么用的
    ads1299_initial();
    void RESET();
    void SDATAC();
3.测试你写进去一个寄存器,再读出来,数据一样,才说明驱动正确了。
举报

孙榕

2024-12-5 10:18:45
脚位开启的写法错误导致讯号不对
举报

神船大幅

2024-12-5 10:36:37
从您的描述来看,您的代码中可能存在一些问题导致通信不正常。以下是一些建议和可能的问题:

1. 确保ADS1299的引脚连接正确。请检查您的硬件连接,确保RESET、START、CS、DIN、DOUT和SCLK引脚正确连接到MSP432P401R。

2. 检查MSP432P401R的GPIO配置。确保您已经正确配置了MSP432P401R的GPIO引脚,以便与ADS1299进行通信。您需要将RESET、START、CS、DIN、DOUT和SCLK引脚配置为正确的输入/输出模式。

3. 检查SPI通信设置。确保您已经正确配置了MSP432P401R的SPI通信参数,例如时钟频率、CPOL和CPHA等。您可以尝试使用不同的SPI参数,看看是否能够解决问题。

4. 检查ADS1299的初始化代码。确保您已经正确初始化了ADS1299,包括设置正确的寄存器值。您可以参考ADS1299的数据手册,确保您的初始化代码正确。

5. 检查您的代码逻辑。请检查您的代码,确保您已经正确实现了与ADS1299的通信协议。您可以尝试使用简单的测试代码,例如发送一个简单的命令到ADS1299,然后检查DOUT引脚的响应。

6. 使用示波器检查信号。您提到使用示波器检查信号,但是您没有提到检查SPI时钟(SCLK)和数据输入(DIN)引脚的信号。请确保这些引脚的信号正常,以便正确地与ADS1299进行通信。

7. 检查电源和地线。确保您的MSP432P401R和ADS1299都得到了稳定的电源供应,并且地线连接正确。

8. 检查代码中的延时。在与ADS1299通信时,可能需要在某些操作之间添加适当的延时。请检查您的代码,确保您已经添加了必要的延时。

希望以上建议能够帮助您解决问题。如果您仍然无法解决问题,请提供更多的代码和硬件连接信息,以便进一步分析。
举报

更多回帖

×
20
完善资料,
赚取积分