各位好,我在使用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;
}