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