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.

ADS1298: 上电初始化失败,ID读取为0,DOUT无输出

Part Number: ADS1298
Other Parts Discussed in Thread: SEGGER, ADS1292R

我是ADS129x的初学者,我尝试使用ads1298读取时无法完成初始化,读取ID寄存器结果为0,任何操作读取返回均为0,示波器测量SCLK为10.8MHz正常时钟信号,MOSI正常输出,但MISO始终为低电平

调试:用小刀断开CLK引脚和GND的连接,故障相同,测试ADS1298的CLK引脚始终为低电平(SCLK正常)

使用开源社区分享的代码驱动无果,这是我的原理图和相关代码,以及所用MCU的资料(GD32F470):

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//...GPIO
delay_1ms(1000);
spistr.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spistr.device_mode = SPI_MASTER;
spistr.frame_size = SPI_FRAMESIZE_8BIT;
spistr.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
spistr.nss = SPI_NSS_SOFT;
spistr.prescale = SPI_PSC_8;
spistr.endian = SPI_ENDIAN_MSB;
spi_init(SPI4, &spistr);
spi_enable(SPI4);
ads12Lead_CS_H;
ads12Lead_START_L;
ads12Lead_RST_H;//DOUT
delay_1ms(600);
CMD_12Lead(SDATAC);
delay_1ms(100);
CMD_12Lead(RESET);
delay_1ms(1);
//delay_1ms(1000);
delay_1ms(1000);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 感谢您的支持,我修改了原有代码,上电复位不成功(自始至终都不成功),VCAP1和VREFP输出0V,VCAP3输出2.32V,DRDY无波动

  • 你寄存器配置是否使能了内部基准电压?默认内部基准电压是没有使能的。

    你示波器测量各供电电压是否都正常?VCAPx 电压与供电电压和基准电压有关,请先确保这两项正常。

    下面连接是关于ADS129x所有的FAQ,其他包括 source code (C/C++/CCS) for the ADS1298 or ADS1298R,希望对你有帮助:

    [FAQ] Common Questions for TI's ADS129x Family of Bio-Potential ADCs

  • 我成功的将ads1298上电并初始化,drdy开始出现脉冲,vcap电压正常,但是无法通过寄存器读取id,发送sdatac和stop却仍在转换(drdy依然存在脉冲),这是我的代码和逻辑分析图,谢谢!

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void init12Lead() {
    spi_parameter_struct spistr;
    rcu_periph_clock_enable(RCU_GPIOF);
    rcu_periph_clock_enable(RCU_SPI4);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_7);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_8);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_9);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    rcu_periph_clock_enable(RCU_GPIOF);
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    gpio_bit_write(GPIOF, GPIO_PIN_6, SET);
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    void init12Lead() {
    spi_parameter_struct spistr;
    rcu_periph_clock_enable(RCU_GPIOF);
    rcu_periph_clock_enable(RCU_SPI4);

    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_8);
    gpio_mode_set(GPIOF, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_7);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_8);
    gpio_af_set(GPIOF, GPIO_AF_5, GPIO_PIN_9);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);

    rcu_periph_clock_enable(RCU_GPIOF);
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    gpio_bit_write(GPIOF, GPIO_PIN_6, SET);

    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
    gpio_mode_set(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_5);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
    gpio_output_options_set(GPIOF, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);

    delay_1ms(1000);
    spistr.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
    spistr.device_mode = SPI_MASTER;
    spistr.frame_size = SPI_FRAMESIZE_8BIT;
    spistr.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;
    spistr.nss = SPI_NSS_SOFT;
    spistr.prescale = SPI_PSC_16;
    spistr.endian = SPI_ENDIAN_MSB;
    spi_init(SPI4, &spistr);
    spi_enable(SPI4);

    ads12Lead_CS_H;
    ads12Lead_START_H;
    ads12Lead_RST_L;
    delay_1ms(1000);
    ads12Lead_RST_H;
    delay_1ms(1000);

    ads12Lead_RST_L;
    delay_us(5);
    ads12Lead_RST_H;
    delay_1ms(1000);

    ads12Lead_START_L;
    ads12Lead_CS_L;
    delay_us(10);
    SPI_Transport_12Lead(SDATAC);
    delay_us(10);
    ads12Lead_CS_H;
    delay_us(10);

    ads12Lead_CS_L;
    delay_us(10);
    SPI_Transport_12Lead(STOP);
    delay_us(10);
    ads12Lead_CS_H;
    delay_us(10);

    ads12Lead_CS_L;
    delay_us(10);

    //delay_1ms(1);
    //a12lead_REG(WREG|CONFIG1,0b10100101);
    //a12lead_REG(WREG|CONFIG2,0b10100101);

    uint8_t did = a12lead_REG(RREG|ID,0x00);
    delay_us(10);
    ads12Lead_CS_H;
    SEGGER_RTT_printf(0, "id=%d\r\n",did);
    /*
    delay_1ms(10);
    a12lead_REG(WREG|CONFIG3, 0xC0);
    delay_1ms(10);
    a12lead_REG(WREG|CONFIG1, 0x86);
    delay_1ms(10);
    a12lead_REG(WREG|CONFIG2, 0x35);
    delay_1ms(10);
    a12lead_REG(WREG|CH1SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH2SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH3SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH4SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH5SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH6SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH7SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|CH8SET, 0x01);
    delay_1ms(10);
    a12lead_REG(WREG|LOFF, 0x06);
    delay_1ms(10);
    gpio_bit_write(GPIOF, GPIO_PIN_5, SET);
    delay_1ms(1000);
    CMD_12Lead(START);
    delay_1ms(10);
    CMD_12Lead(RDATAC);
    delay_1ms(10);
    gpio_bit_write(GPIOF, GPIO_PIN_5, SET);*/
    SEGGER_RTT_SetTerminal(0);
    SEGGER_RTT_printf(0, "12 lead ready\r\n");

    }
    /*
    ADS_START_H;
    ADS_CS_H;
    ADS_PWDN_L;//进入掉电模式
    delay_ms(1000);
    ADS_PWDN_H;//退出掉电模式
    delay_ms(1000);//等待稳定
    ADS_PWDN_L;//发出复位脉冲
    delay_us(5);
    ADS_PWDN_H;
    delay_ms(1000);//等待稳定,可以开始使用ADS1292R
    ADS_START_L;
    ADS_CS_L;
    ADS_SPI(SDATAC);//发送停止连续读取数据命令
    ADS_REG(WREG|CONFIG2,0XA0); //使用内部参考电压
    delay_ms(1000);//等待内部参考电压稳定
    ADS_REG(WREG|CONFIG1,0X02); //设置转换速率为500SPS
    ADS_REG(WREG|CH1SET,0X01); //设置通道1为短路
    ADS_REG(WREG|CH2SET,0X01); //设置通道2为短路
    ADS_START_H;
    ADS_SPI(RDATAC);
    ADS_CS_H;
    */

    /**对ADS1292R内部寄存器进行操作 **/
    uint8_t a12lead_REG(unsigned char com,unsigned data)
    {
    unsigned char i;
    //for(i=0;i<45;i++);
    //delay_us(10);
    SPI_Transport_12Lead(com);
    //for(i=0;i<45;i++);
    //delay_us(10);
    SPI_Transport_12Lead(0X00);
    //for(i=0;i<45;i++);
    //delay_us(10);
    if((com&0x20)==0x20)//判断是否为读寄存器指令
    { SPI_Transport_12Lead(0X00);
    //for(i=0;i<45;i++);
    //delay_us(10);
    }
    return (SPI_Transport_12Lead(data));

    }

    /**通过SPI总线与ADS1292R通信**/
    unsigned char SPI_Transport_12Lead(unsigned char com)
    {
    while (spi_i2s_flag_get(SPI4, SPI_FLAG_TBE) == RESET);//检测发送寄存器是否为空,上一个数据发送完成
    spi_i2s_data_transmit(SPI4, com);//发送数据
    while (spi_i2s_flag_get(SPI4, SPI_FLAG_RBNE) == RESET);//检测接收标志是否非空,发送完成
    return (spi_i2s_data_receive(SPI4)); //返回接收到的数据
    }

x 出现错误。请重试或与管理员联系。