现在用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。
谢谢。
user5156888:
现在主要的问题时出现不了QRS波:
现在我将寄存器1~11的值配置如下如下:0x02 0xE0 0xF0 0x00 0x00 0x23 0x03 0x00 0x02 0x07 0x0C
还是出现不了QRS波形。
user151383853:
是否参考一下 evm 里的例程代码. 和 TI Designs 的参考设计