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.
我是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
您好,
建议你查看下面FAQ,希望对你解决通信问题指明方向:
你寄存器配置是否使能了内部基准电压?默认内部基准电压是没有使能的。
你示波器测量各供电电压是否都正常?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)); //返回接收到的数据
}