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

