TI论坛
直播中

尤立虔

8年用户 999经验值
擅长:控制/MCU
私信 关注
[问答]

用nordic的nrf52832在调ADS1291遇到的两个疑问求解


  • 现在用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。

    谢谢。

                                     

回帖(2)

卢表镜

前天 11:44
现在主要的问题时出现不了QRS波:
现在我将寄存器1~11的值配置如下如下:0x02 0xE0 0xF0 0x00 0x00 0x23 0x03 0x00 0x02 0x07 0x0C
还是出现不了QRS波形。
举报

李慧

前天 18:08
看起来您在使用Nordic的nRF52832与ADS1291进行通信时遇到了两个问题。我会尝试帮助您解决这些问题。

问题1:读取寄存器0x00时,设备ID读取正常,但设置寄存器0x01~0x0B后,连续读取数据模式下的心电状态数据和心电数据始终不变。

可能的原因及解决方案:

1. 寄存器设置不正确:请检查您设置的寄存器值是否符合ADS1291的数据手册要求。确保您已经正确配置了采样率、增益、滤波器等参数。

2. 通信问题:请检查您的SPI通信是否正常。确保nRF52832与ADS1291之间的SPI连接正确,包括时钟线、数据线、片选线等。您可以尝试使用示波器检查SPI通信波形,以确保数据传输正常。

3. ADS1291配置问题:请确保您已经正确配置了ADS1291的工作模式。在连续读取数据模式下,您需要确保ADS1291已经进入连续采样模式。您可以查阅ADS1291的数据手册,了解如何正确配置工作模式。

问题2:在第一个步骤的...

由于您的问题描述不完整,我无法为您提供确切的解决方案。但是,我可以给您一些建议:

1. 确保您的代码逻辑正确:检查您的代码,确保您已经按照正确的顺序设置了寄存器,并在设置完成后启动了连续读取数据模式。

2. 检查中断处理:请确保您的中断处理函数能够正确处理SPI通信和数据读取。您可以在中断处理函数中添加调试信息,以帮助您了解中断处理过程中发生了什么。

3. 考虑硬件问题:如果软件和通信都没有问题,您可能需要检查硬件是否存在问题。例如,检查ADS1291是否损坏,或者nRF52832的SPI接口是否存在问题。

希望这些建议能帮助您解决问题。如果您需要更多帮助,请提供更详细的信息,以便我能更准确地为您提供解决方案。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分