- 各位好,我在使用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;}//初始化ADS1292Rbool 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;}
|
|
|
|
|