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_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:
您好,DVDD是3.3v,我没有使用示波器,是测量CLK引脚输出吗,这个是不是要先设置config2寄存器,使能CLK?
另外,我的板子没有给芯片预留引线测试,ADS1292r的引脚太小了,用示波器感觉不好接线,我明天试试行不行。
关于时序,上电之前没有信号输入,是否是在上电时,延时要求的时间之后发送reset脉冲即可。
,
honghang lv:
您好,我之前怀疑是我的飞线没有正确连上CLKSEL,因为引脚太小了不好焊,就试了一下把RESET引脚和CLKSEL引脚焊在一起,再飞线到3.3V电源,现在可以读到ID寄存器的值,但是不正确,两次分别读出了0X80和0XC0,这是因为上电时序的原因吗,因为我的RESET现在接了电源,一直是高电平。
,
Amy Luo:
是的,上电时序影响读取的ID寄存器的值,之前有客户出现过这种现象
,
honghang lv:
我现在RESET接电源了,那还可以通过发送RESETopcode来复位吗,这样是否冲突呢?
,
Amy Luo:
RESET管脚是直接接电源吗?建议串一个几K的电阻接电源,如果直接接电源我担心RESET opcode复位时会烧毁芯片
,
honghang lv:
您好,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:
您可以用示波器抓取RESET opcode复位的波形吗,请注意,复位命令在操作码命令的第八个SCLK下降沿生效。复位时,需要18个tCLK周期来完成配置寄存器到默认状态的初始化
您可以用示波器抓取您读取ID寄存器通信时序波形图吗
,
honghang lv:
您好,我已经可以读到ID寄存器和其他寄存器的值了,问题在于SPI速率太高,nrf52832默认的SPI速率是4M,ADS1292R要求读写寄存器时SCLK速率不能高于fCLK的两倍,SPI速率设为250K后就可以了。
,
Amy Luo:
很高兴您的问题得到解决,感谢您的分享