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):

//...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);
    CMD_12Lead(SDATAC);
    delay_1ms(100);
    uint8_t did = a12lead_REG(RREG|ID,0x00);
    SEGGER_RTT_printf(0, "id=%d\r\n",did);
    //...后续操作
    
uint8_t CMD_12Lead(uint8_t cmd){
    uint8_t dat;
    ads12Lead_CS_L;
    delay_us(10);
    dat = SPI_Transport_12Lead(cmd);
    delay_us(10);
    ads12Lead_CS_H;
    return dat;
}

/**对ADS1292R内部寄存器进行操作 **/
unsigned char a12lead_REG(unsigned char com, unsigned data) {
    uint8_t rdata;
    ads12Lead_CS_L;
    delay_us(10);
    SPI_Transport_12Lead(com);
    delay_us(10);
    SPI_Transport_12Lead(0X00);
    if((com & 0x20) == 0x20){
        rdata = SPI_Transport_12Lead(0x00);
      //SEGGER_RTT_printf(0, "REG 0x00\r\n");
    }else{
        rdata = SPI_Transport_12Lead(data);
      //SEGGER_RTT_printf(0, "REG DAT\r\n");
    }
    delay_us(10);
    //for(i = 0; i < 45; i++);
    //if((com & 0x20) == 0x20) { //判断是否为读寄存器指令
    //    a12lead_SPI(0X00);
    //    for(i = 0; i < 45; i++);
    //}
    ads12Lead_CS_H;
    return (rdata);
    //return (a12lead_SPI(data));

}

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

context of .h file
#define ads12Lead_CS_L gpio_bit_write(GPIOF, GPIO_PIN_6, RESET)
#define ads12Lead_CS_H gpio_bit_write(GPIOF, GPIO_PIN_6, SET)
#define ads12Lead_RST_L gpio_bit_write(GPIOF, GPIO_PIN_4, RESET)
#define ads12Lead_RST_H gpio_bit_write(GPIOF, GPIO_PIN_4, SET)
#define ads12Lead_START_L gpio_bit_write(GPIOF, GPIO_PIN_5, RESET)
#define ads12Lead_START_H gpio_bit_write(GPIOF, GPIO_PIN_5, SET)

defines
/*系统命令*/
#define WAKEUP	0X02	//从待机模式唤醒
#define STANDBY	0X04	//进入待机模式
#define RESET	0X06	//复位ADS1292R
#define START	0X08	//启动或转换
#define STOP	0X0A	//停止转换
#define OFFSETCAL	0X1A	//通道偏移校准
/*数据读取命令*/
#define RDATAC	0X10	//启用连续的数据读取模式,默认使用此模式
#define SDATAC	0X11	//停止连续的数据读取模式
#define RDATA	0X12	//通过命令读取数据;支持多种读回。
/*寄存器读取命令*/
#define	RREG	0X20	//读取001r rrrr 000n nnnn  这里定义的只有高八位,低8位在发送命令时设置
#define WREG	0X40	//写入010r rrrr 000n nnnn
/*	r rrrr=要读、写的寄存器地址
	  n nnnn=要读、写的数据*/

/*ADS1298内部寄存器地址定义*/
#define ID			0X00	//ID控制寄存器
#define CONFIG1		0X01	//配置寄存器1
#define CONFIG2		0X02	//配置寄存器2
#define CONFIG3		0X03	//配置寄存器3
#define LOFF		  0X04	//导联脱落控制寄存器
#define CH1SET		0X05	//通道1设置寄存器
#define CH2SET		0X06	//通道2设置寄存器
#define CH3SET		0X07	//通道3设置寄存器
#define CH4SET		0X08	//通道4设置寄存器
#define CH5SET		0X09	//通道5设置寄存器
#define CH6SET		0X0A	//通道6设置寄存器
#define CH7SET		0X0B	//通道7设置寄存器
#define CH8SET		0X0C	//通道8设置寄存器
#define RLD_SENS	0X0D	//右腿驱动选择寄存器
#define LOFF_SENS	0X0F	//导联脱落检测选择寄存器
#define LOFF_STAT	0X12	//导联脱落检测状态寄存器
#define	GPIO	  	0X14	//GPIO控制寄存器
#define WCT1      0x18
#define WCT2      0x19

  • 感谢您的支持,我修改了原有代码,上电复位不成功(自始至终都不成功),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依然存在脉冲),这是我的代码和逻辑分析图,谢谢!

    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));	//返回接收到的数据
    }
    

    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)); //返回接收到的数据
    }