关于ADS1299参考电压的问题
各位朋友大家好,我最近在调ADS1299和STM32的通信,采用的是如下图所示参考电压接线示意图。按照手册上面写的初始化的,powerdown低电平拉高->延时1s->reset信号->延时1s->SDATAC->写0xe0到CONFIGURE3寄存器->START->RDATAC, 各寄存器读写都正常,就是电压输出总是0x00,而VREFP引脚一直都是-2.5v,无法拉高到2v,我手头有一块ADS1299评估板,在开机后,VREFP迅速从-2.5v拉高到2v,不知道我的程序有什么问题,还有什么没做到的,请大家指教,谢谢。
看下寄存器0X03h bit7是否将内部reference buffer给disable掉了。
configure3的值已经设为0xe0了,第一位置1的话是使用内部参考电压的,是吧。下面是我的程序。
//CS1 HIGH
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);
//CS2 LOW
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET);
//SDATAC
data = SDATAC;
HAL_SPI_Transmit(&hspi2,&data,1,50);
//WRITE 0xE0 TO CONFIG3
address = 0x43;
HAL_SPI_Transmit(&hspi2,&address,1,50);
data = 0x00;
HAL_SPI_Transmit(&hspi2,&data,1,50);
data = 0xE0;
HAL_SPI_Transmit(&hspi2,&data,1,50);
HAL_Delay(1000);
多谢关注,现在Vrefp的电压已经上来了,与Vrefn之间电压为4.5v。但是输出都是0x00,用的是RDATAC模式,能够根据DRDY进入中断,有sclk信号,我在中断里面先采集数据,再采集寄存器的值,从示波器上能看到波形,如下图所示。 在RDATAC模式下是不是检测到了DRDY信号后直接读入27个数据就行了,还要发送RDATA命令吗?
你好,现在VREFP参考电压已经有了,但是现在很奇怪的是,我采用RDATAC模式,每次进入中断,都采不到数据,ads1299输出都是0x00,而可以读出寄存器的数值,但是用RDATA模式的话,就可以读出电压值,请问这是怎么回事,RDATAC模式下,DRDY都有信号产生,和设置的采样频率一样,就是输出都是0x00。
下面是我的程序,请哪位大神麻烦看一下,有什么问题没有,多谢了。
int main(void)
{
uint8_t address,data,i;
volatile uint32_t raw_DATA_32[8]={0,0,0,0,0,0,0,0};
volatile uint32_t temp_32;
uint8_t ADS1299_DATA_RAW1[27];
double ADS1299_VOLTAGE[8];
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI2_Init();
//POWER UP
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,GPIO_PIN_SET);
HAL_Delay(1000);
//RESET
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_Delay(2);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(1000);
//cs1 low
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET);
//SDATAC
data = 0x11;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
//CS2 LOW
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET);
//SDATAC
data = SDATAC;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
//WRITE 0xE0 TO CONFIG3
address = 0x43;
HAL_SPI_Transmit(&hspi2,&address,1,1000);
data = 0x00;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
data = 0xE0;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
HAL_Delay(1000);
address =0x40;
HAL_SPI_Transmit(&hspi2,&address,1,1000);
data=0x17;
HAL_SPI_Transmit(&hspi2,&data,1,50);
HAL_SPI_Transmit(&hspi2,ADS1299Reg_Conituous_Setting,0x18,1000);
HAL_Delay(1000);
address = 0x20;
HAL_SPI_Transmit(&hspi2,&address,1,1000);
data = 0x17;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
HAL_SPI_Receive(&hspi2,ADS1299_REG_2,24,1000); //READ THE REGISTERS DATA TO CHECK
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET); //START PIN SET LOW
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET); //START PIN SET HIGH
data = RDATAC;
HAL_SPI_Transmit(&hspi2,&data,1,1000);
//CS2 HIGH
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET);
while(1)
{
}
}
下面的是中断服务程序。
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn0 */
//uint8_t address,data,i;
//uint8_t reg[0x18];
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi2,ADS1299_DATA_RAW,27,50);
address = 0x20; //READ THE REGISTER DATA TO CHECK
HAL_SPI_Transmit(&hspi2,&address,1,50);
data = 0x17;
HAL_SPI_Transmit(&hspi2,&data,1,50);
HAL_SPI_Receive(&hspi2,ADS1299_REG_2,0x18,50);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_9,GPIO_PIN_SET);
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
}
谢谢大家了