TI中文支持网
TI专业的中文技术问题咨询交流网站

ADS1292R读不到ID

各位好,我在使用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_tspi_tx_buf[9];  
//SPI接收缓存数组,使用EasyDMA时一定要定义为static类型
static uint8_tspi_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;  //读的寄存器数量-1spi_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;
}

Amy Luo:

您好,
感谢您对TI产品的关注!您的DVDD是3.3V吗,3.3V电源上飞线到CLKSEL后,您用示波器可以测量到时钟的输出吗
您的上电时序是否符合数据手册10.1 Power-Up Sequencing
这个上电时序会影响读取ID寄存器的值
另外,您可以附上您SPI读取ID寄存器的值的通信时序波形吗

honghang lv:

回复 Amy Luo:

您好,DVDD是3.3v,我没有使用示波器,是测量CLK引脚输出吗,这个是不是要先设置config2寄存器,使能CLK?
另外,我的板子没有给芯片预留引线测试,ADS1292r的引脚太小了,用示波器感觉不好接线,我明天试试行不行。
关于时序,上电之前没有信号输入,是否是在上电时,延时要求的时间之后发送reset脉冲即可。

honghang lv:

回复 Amy Luo:

您好,我之前怀疑是我的飞线没有正确连上CLKSEL,因为引脚太小了不好焊,就试了一下把RESET引脚和CLKSEL引脚焊在一起,再飞线到3.3V电源,现在可以读到ID寄存器的值,但是不正确,两次分别读出了0X80和0XC0,这是因为上电时序的原因吗,因为我的RESET现在接了电源,一直是高电平。

Amy Luo:

回复 honghang lv:

是的,上电时序影响读取的ID寄存器的值,之前有客户出现过这种现象

honghang lv:

回复 Amy Luo:

我现在RESET接电源了,那还可以通过发送RESETopcode来复位吗,这样是否冲突呢?

Amy Luo:

回复 honghang lv:

RESET管脚是直接接电源吗?建议串一个几K的电阻接电源,如果直接接电源我担心RESET opcode复位时会烧毁芯片

honghang lv:

回复 Amy Luo:

您好,RESET和电源之间串了一个10K电阻,我还是无法正确读出ID寄存器的值。
我的初始化程序流程是:
(RESET,CLKSEL引脚都连接电源,串了10K电阻)
1、发送RESET opcode复位,延时100ms;
2、发送SDATACopcode,延时10ms;
3、配置CONFIG2寄存器和其他寄存器;
4、读ID寄存器;
5、START引脚置1;
6、发送RDATAC opcode。

Amy Luo:

回复 honghang lv:

您可以用示波器抓取RESET opcode复位的波形吗,请注意,复位命令在操作码命令的第八个SCLK下降沿生效。复位时,需要18个tCLK周期来完成配置寄存器到默认状态的初始化

您可以用示波器抓取您读取ID寄存器通信时序波形图吗

Amy Luo:

回复 honghang lv:

很高兴您的问题得到解决,感谢您的分享

赞(0)
未经允许不得转载:TI中文支持网 » ADS1292R读不到ID
分享到: 更多 (0)