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.

ADS1292R读不到ID

Other Parts Discussed in Thread: ADS1292R

各位好,我在使用ADS1292R的过程中遇到几个问题,期望能得到解答,主控是NRF52832,我的原理图和代码贴在下面。

1、我的原理图里CLKSEL悬空了,看手册,使用内部时钟这个引脚必须置1,请问有补救措施吗?(我的方法是从3.3V电源上飞线到CLKSEL,中间串了一个10K电阻)

2、我按照手册40页Figure 44  Initial Flow at Power-Up的流程来写代码,JLINK RTT输出的信息显示读寄存器返回了“NRF_SUCCESS”,但是没有读到ID寄存器的值,不知道问题出在哪。

//SPI驱动程序实例ID,ID和外设编号对应,0:SPIM0  1:SPIM1 2:SPIM2
#define SPI_INSTANCE  0 
//定义名称为spi的SPI驱动程序实例
static const nrf_drv_spi_t spi = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);  
//SPI传输完成标志
static volatile bool spi_xfer_done = false;  
//SPI发送缓存数组,使用EasyDMA时一定要定义为static类型
static uint8_t    spi_tx_buf[9];  
//SPI接收缓存数组,使用EasyDMA时一定要定义为static类型
static uint8_t    spi_rx_buf[9];

//SPI事件处理函数

void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
                       void *                    p_context)
{
  //设置SPI传输完成  
	spi_xfer_done = true;
}
//初始化ADS1292R
bool ADS_Init(void) 
{
		bool status;
	//使用默认配置参数初始化SPI配置结构体
	  nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
	//重写SPI信号连接的引脚配置
    spi_config.ss_pin   = SPI_SS_PIN;
    spi_config.miso_pin = SPI_MISO_PIN;
    spi_config.mosi_pin = SPI_MOSI_PIN;
    spi_config.sck_pin  = SPI_SCK_PIN;
		spi_config.mode = NRF_DRV_SPI_MODE_1;
	//初始化SPI
		ret_code_t err_code1 = nrf_drv_spi_init(&spi, &spi_config, spi_event_handler, NULL);
    APP_ERROR_CHECK(err_code1);
	if(err_code1==NRF_SUCCESS){
				NRF_LOG_INFO("NRF_SUCCESS,SPI_INIT");
		}else if(err_code1==NRF_ERROR_BUSY){
				NRF_LOG_INFO("NRF_ERROR_BUSY,SPI_INIT");
		}else if(err_code1==NRF_ERROR_INVALID_ADDR){
				NRF_LOG_INFO("NRF_ERROR_INVALID_ADDR,SPI_INIT");
		}
	
	//复位引脚置1,等待1s
		nrf_gpio_cfg_output(SPI_RESET_PIN);
		nrf_gpio_pin_set(SPI_RESET_PIN);
		nrf_delay_ms(1000);
	//发送复位脉冲
		nrf_gpio_pin_clear(SPI_RESET_PIN);
		nrf_delay_ms(10);
		nrf_gpio_pin_set(SPI_RESET_PIN);
		nrf_delay_ms(1000);
	//配置用于SPI片选的引脚为输出
	  nrf_gpio_cfg_output(SPI_SS_PIN);
	//配置接收DRDY状态的引脚为输入
		nrf_gpio_cfg_input(SPI_DRDY_PIN,NRF_GPIO_PIN_NOPULL);
	//发送停止连续读命令
		Spi_WriteOneByte(ADS1292R_CMD_SDATAC);
	//配置寄存器
		ADS_Reg_Config();
	//START引脚置1,开启转换
		nrf_gpio_cfg_output(SPI_START_PIN);
		nrf_gpio_pin_set(SPI_START_PIN);
	//读ID控制寄存器
		uint8_t id = ADS_Reg_Read(ADS1292R_REG_ID);
		
	if (id == 0x73) //0x73表示ADS1292R
		{
				NRF_LOG_INFO("ADS1292R found");
				status = true;
		}
		else
		{
				NRF_LOG_INFO("ADS1292R not found, 0X%X",id);
				status = false;
		}

	//恢复连续读模式
		Spi_WriteOneByte(ADS1292R_CMD_RDATAC);
		
		return status;
}

//配置寄存器
void ADS_Reg_Config(){
		ADS_Reg_Write(ADS1292R_REG_CONFIG2,0xA0);//使用内部参考电压2.42V
		nrf_delay_ms(10);//等待内部参考电压稳定
		ADS_Reg_Write(ADS1292R_REG_CONFIG1,0x01);//连续转换模式,采样率250
		
		ADS_Reg_Write(ADS1292R_REG_CH1SET,0x30);//配置通道1
		ADS_Reg_Write(ADS1292R_REG_CH2SET,0x30);//配置通道2
		ADS_Reg_Write(ADS1292R_REG_RLD_SENS,0xEF);//右腿驱动使能
}

//读寄存器
uint8_t ADS_Reg_Read(uint8_t address){
		uint8_t dat ;  //dat用来存读出的寄存器中的值
		ret_code_t err_code;
		spi_tx_buf[0] = address | 0x20;  //两者做或运算得到RREG操作码:001r rrrr, r rrrr表示寄存器起始位置
		spi_tx_buf[1] = 0x00;  //读的寄存器数量-1
    spi_tx_buf[2] = 0x00;

	
		//拉低CS,使能芯片
	  SPI_CS_LOW;
	  //传输完成标志设置为false
		spi_xfer_done = false;
	  //启动数据传输
		err_code = nrf_drv_spi_transfer(&spi, spi_tx_buf, 3, spi_rx_buf,3);
	  APP_ERROR_CHECK(err_code);
		if(err_code==NRF_SUCCESS){
				NRF_LOG_INFO("READ_NRF_SUCCESS");
		}else if(err_code==NRF_ERROR_BUSY){
				NRF_LOG_INFO("READ_NRF_ERROR_BUSY");
		}else if(err_code==NRF_ERROR_INVALID_ADDR){
				NRF_LOG_INFO("READ_NRF_ERROR_INVALID_ADDR");
		}
	
	  //等待SPI传输完成
   while(!spi_xfer_done){};
	  //拉高CS,释放芯片
    SPI_CS_HIGH;
		//接收数组最后一个字节为读取的值
		dat=spi_rx_buf[2];

    return dat;//返回寄存器中的值
}

//写入一个字节
void Spi_WriteOneByte(uint8_t Dat)
{   
	  spi_tx_buf[0] = Dat;
	  spi_xfer_done = false;
	  SPI_CS_LOW;
	  APP_ERROR_CHECK(nrf_drv_spi_transfer(&spi, spi_tx_buf, 1, spi_rx_buf, 0));
    while(!spi_xfer_done);
	  SPI_CS_HIGH;
}