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.

ADS1291读取心电数据的问题

Other Parts Discussed in Thread: ADS1291, ADS1292R

现在用nordic的nrf52832在调ADS1291,遇到如下2个问题:

一 . 用nordic的SDK在调ADS1291,现在遇到的问题有2个:

1. 读取寄存器0x00时,刚开始我是可以读取到设备ID的,设置0x01~0x0B寄存器后,再读取出来,读出来的值与写的值是相等的。

寄存器1~11的值设置如下:0x00 0xE0 0xF0 0x00 0x00 0x2C 0x0F 0x00 0x02 0x03 0x0C。这些寄存器设置好后,开启连续读取数据模式后,

能够进入中断,进入中断后,读取的心电状态数据为0x00,心电数据为0x3000. 一直读取5000个心电数据。心电状态数据和心电数据都是一样的,没有变。

2.在第一个步骤的基础上,

我将寄存器1~11的值设置:

0x00 0xE0 0xF0 0x00 0x00 0x2C 0x0F 0x00 0x02 0x03 0x0C  

改为

0x00 0xA0 0xF0 0x00 0x00 0x24 0x08 0x00 0x6A 0x03 0x0C   :主要是修改下右腿驱动的寄存器

然后再运行,这时候就读取不到设备ID了,即读取寄存器0x00的值不为0x52.

是不是由于设置寄存器后的原因导致的呢?

二.  我在陈诉一下我的流程

1)用jlink的VCC,3.3V给板子供电

2)初始化ADS1291的接口,RESET,START引脚

3)  初始化SPI控制器,没开启DMA,SPI的时钟为500Kbps,MODE1.

4)ADS1291初始化,参照ADS11292R的例子写的。相应延时的地方都有延时。调试的时候发现用SPI连续读取寄存器要稍微延迟一下,否则会有问题。

5)   读取设备ID,只有读到为0x52才往下运行(ADS1291的设备ID为0x52)

6)   设置寄存器地址1~11的值。

7) 开启连续读取数据模式

8) 进中断读取数据。

9) 读取到完5000个数据时,关闭连续读取模式。

注:测试时,我有分别接触手测试和不接触手测试。

三.  下面为我程序的关键细节:

1.SPI使用的是硬件控制器,设置如下:

请问SPI的速率设置多少呢?  要考虑什么地方?

流程如下:

1)SPI引荐控制器初始化 ,如上图

2) 引脚初始化

ADS1X9X_RESET_PIN  引脚设置为输出

延迟4ms

ADS1X9X_START_PIN  引脚设置为输出

延迟4ms

ADS1X9X_RESET_PIN  引脚拉低

延迟4ms

ADS1X9X_START_PIN  引脚拉低

延迟4ms

ADS1X9X_RESET_PIN  引脚拉高

延迟4ms

3)初始化ADS12

ADS1291复位的命令如下:

void ADS1x9x_Reset(void)
{
 unsigned short i;
 
 nrf_gpio_pin_set(ADS1X9X_RESET_PIN);
 nrf_delay_ms(1);
 nrf_gpio_pin_clear(ADS1X9X_RESET_PIN);
 nrf_delay_ms(1);
 nrf_gpio_pin_set(ADS1X9X_RESET_PIN);
 nrf_delay_ms(7);
}

4)  读取0x00~0x12的寄存器

5)  然后再写0x01~0x0B这11个寄存器。

请问0x01~0x0B这11个寄存器的参考配置,请提供一下,我使用的是ADS1292R里面的参考配置好像不行。

如下:

unsigned char  ADS1x9x_Default_Register_Settings[15] = {

    //Device ID read Ony
   0x00,
   //CONFIG1
   0x02,
   //CONFIG2
   0xE0,
   //LOFF
   0xF0,
  //CH1SET (PGA gain = 6)
   0x00,
  //CH2SET (PGA gain = 6)
  0x00,
  //RLD_SENS (default)
  0x2C,
  //LOFF_SENS (default)
  0x0F,    
  //LOFF_STAT
  0x00,
  //RESP1
   0x02,
 //RESP2
  0x03,
 //GPIO
  0x0C
};  

6) 启动连续读取数据的模式

void ADS1x9x_Start_Recording_Data(void)

{

 

if(ADS1x9x_Get_State() == IDLE_STATE)

{

ADS1x9x_Disable_Start(); //Set Start pin to Low

nrf_delay_ms(5);

ADS1x9x_Enable_Start(); // Set Start pin to High

nrf_delay_ms(5);

ADS1x9x_Disable_Start();// Set Start pin to Low

nrf_delay_ms(5);

Start_Read_Data_Continuous(); //RDATAC command - Send 0x10 to the ADS1x9x

nrf_delay_ms(5);

Enable_ADS1x9x_DRDY_Interrupt();// Enable DRDY interrupt

nrf_delay_ms(5);

ADS1x9x_Enable_Start(); // Set Start pin to High

ADS1x9x_Set_State(ECG_RECORDING_STATE);

}

 

}

移植都是参考ADS1292R的套件程序。

7)读取心电数据

当启动连续读取数据模式后,会进入DRDY引脚的中断,然后在中断里面读取心电数据(DRDY引脚设置为下降沿触发中断)。

如下:

void ADS1X9X_DRDY_Int_handle(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)

{

Ads1x9x_spi_xfer_done = false;

nrf_drv_spi_transfer(&Ads1x9x_Spi, NULL, 0, SPI_Rx_buf, 6);

while(!Ads1x9x_spi_xfer_done);

}

8)结束连续读取数据

ADS1x9x_Disable_Start();//// Set Start pin to Low

Disable_ADS1x9x_DRDY_Interrupt(); // Disable DRDY interrupt

Stop_Read_Data_Continuous();// Send 0x11 to the ADS1x9x

只有结束连续读取数据才可以读取寄存器,这个有注意。

9)写寄存器的API

void ADS1x9x_Reg_Write(uint8_t Reg_address, uint8_t udata)

{

 Ads1x9x_spi_tx_buf[0] = (Reg_address | WREG);

 Ads1x9x_spi_tx_buf[1] = 0;

 Ads1x9x_spi_tx_buf[2] = udata;

 Ads1x9x_spi_xfer_done = false;

 APP_ERROR_CHECK(nrf_drv_spi_transfer(&Ads1x9x_Spi, Ads1x9x_spi_tx_buf, 3, Ads1x9x_spi_rx_buf, 0));

 while(!Ads1x9x_spi_xfer_done);

 return;

}

10)读寄存器的API

uint8_t ADS1x9x_Reg_Read(uint8_t Reg_address)

{

uint8_t len = 2;

uint8_t retVal = 0;

Ads1x9x_spi_tx_buf[0] = Reg_address | RREG;

Ads1x9x_spi_tx_buf[1] = 0;                //ҪдµÄÊý¾Ý×ÜÊý-1

Ads1x9x_spi_xfer_done = false;

APP_ERROR_CHECK(nrf_drv_spi_transfer(&Ads1x9x_Spi, Ads1x9x_spi_tx_buf, len, Ads1x9x_spi_rx_buf, 1));

while(!Ads1x9x_spi_xfer_done);

retVal = Ads1x9x_spi_rx_buf[0];

retVal = 0;

Ads1x9x_spi_tx_buf[0] = 0;

Ads1x9x_spi_xfer_done = false;

APP_ERROR_CHECK(nrf_drv_spi_transfer(&Ads1x9x_Spi, Ads1x9x_spi_tx_buf, 1, Ads1x9x_spi_rx_buf, 1));

while(!Ads1x9x_spi_xfer_done);

retVal = Ads1x9x_spi_rx_buf[0];

return retVal;

}

11)写命令的API

void ADS1x9x_SPI_Command_Data(uint8_t Data)

{

 uint8_t len = 1;

 Ads1x9x_spi_tx_buf[0] = Data;

 Ads1x9x_spi_xfer_done = false;

 APP_ERROR_CHECK(nrf_drv_spi_transfer(&Ads1x9x_Spi, Ads1x9x_spi_tx_buf, len, Ads1x9x_spi_rx_buf, len));

 while(!Ads1x9x_spi_xfer_done);

}

原理图如下:

大家如果想讨论,可以加我创建的群讨论:613353675,请输入下TI。

谢谢。