主题中讨论的其他器件: ADS124S08EVM
工具/软件:
晚安、团队、
我正在处理一个需要从传感器连续读取数据的工程。 要从传感器读取数据、我使用的是 ADS124S06。
ADS124S06_Handle adc1 = {
.hspi = &hspi1,
.cs_port = ADC1_CS_GPIO_Port,
.cs_pin = ADC1_CS_Pin,
.start_port = ADC1_START_GPIO_Port,
.start_pin = ADC1_START_Pin,
.reset_port = ADC1_RST_GPIO_Port,
.reset_pin = ADC1_RST_Pin
};
bool ADS124S06::WriteRegister(ADS124S06_Handle *dev, uint8_t reg, uint8_t data) {
uint8_t cmd[3]= {0};
cmd[0] = (WREG | (reg & 0x1F)); //WREG = 0x40
cmd[1] = 0x00;
cmd[2] = data;
cs_low(dev);
bool ok = HAL_SPI_Transmit(dev->hspi, cmd, 3, ADS_TIMEOUT) == HAL_OK;
cs_high(dev);
return ok;
}
void ADS124S06::Init(ADS124S06_Handle *dev)
{
HAL_GPIO_WritePin(dev->reset_port, dev->reset_pin, GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(dev->reset_port, dev->reset_pin, GPIO_PIN_SET);
WriteRegister(dev, 0x03, 0x00); // GAIN: PGA=1, 20SPS
WriteRegister(dev, 0x02, 0x54); // I/p MUX: AIN5-AIN4 0x54
WriteRegister(dev, 0x04, 0x14); // DataRAte : 20SPS, osc-4.096MHz
WriteRegister(dev, 0x05, 0x0A); // REF : internal 2.5V On always.
WriteRegister(dev, 0x06, 0x00); // IDACMAG
WriteRegister(dev, 0x07, 0xFF); // IDACMUX
WriteRegister(dev, 0x08, 0x00); // VBIAS
WriteRegister(dev, 0x09, 0x10); // SYS
WriteRegister(dev, 0x0A, 0x00);
WriteRegister(dev, 0x0B, 0x00);
WriteRegister(dev, 0x0C, 0x00);
WriteRegister(dev, 0x0D, 0x00);
WriteRegister(dev, 0x0E, 0x00);
WriteRegister(dev, 0x0F, 0x40);
WriteRegister(dev, 0x10, 0x00);
WriteRegister(dev, 0x11, 0x00);
}
使用上述参数初始化 ADS124S06 之后、我将读回寄存器。
void ADS124S06::ReadRegisters(ADS124S06_Handle *dev) {
uint8_t txData[20];
uint8_t rxData[20];
/*Prepare RREG command*/
txData[0] = RREG; //RREG = 0x20
txData[1] = 0x11;
for (int i = 2; i < 20; i++) {
txData[i] = 0xFF;
}
/* Pull CS low to start communication*/
cs_low(dev);
HAL_SPI_TransmitReceive(dev->hspi, (uint8_t*) txData, (uint8_t*) rxData, 20,
100);
cs_high(dev);
}
我将按预期获取所有寄存器值。 一切顺利到这里。
phReadings ADS124S06::ReadData(ADS124S06_Handle *dev) {
uint8_t tx_buf[1];
static bool st = true;
tx_buf[0] = RDATA; // 0x12
cs_low(dev);
if (st) {
HAL_SPI_Transmit(dev->hspi, tx_buf, 1, 100);
st = false;
}
HAL_SPI_Receive(dev->hspi, rx_buf, 3, 100);
cs_high(dev);
return calculate_voltage(rx_buf, 2.495, 1);
}
现在、我尝试使用 START_PIN 在连续模式下读取数据(通过硬件,未使用启动命令“0x08")“)
将 DRDY_PIN 配置为中断模式(下降沿触发)。 只要 DRDY_PIN 变为低电平 、ADC1_DRDy 标志就会为高电平。
我开始对话一次、并使用 ReadData 函数连续读取数据(循环中每 100ms 运行一次)。
能够读取几个读数的值、之后 DRDY_PIN 始终处于高电平 、这会导致 ADC1_DRDy 标志为低电平、现在我无法读取数据。
如果我再次复位控制器、我能够读取几次读数的数据、然后重复上一个问题。
该怎么办? 请帮帮我。
提前感谢。
