你好,最近使用ADS1256,后端通过SPI连接STM32获取采样数据。
我想达到的目标是:采样率为30K的单路采样,并通过SPI将数据以每秒30K 24bit的频率输出。
目前遇到的问题是:
1. 发送一次RDATAC命令,连续读取数据,但spi无法以30K的频率获得数据。现象是spi的sclk有波形,且满足时序要求,但DOUT管脚无输出。(10sps时,spi可正常通信)
2. 数据手册 Table 15. Data Settling Delay vs Data Rate,显示在SPS为30k时,需要5个DRDY周期才能获得新的数据(New VIN Data),如果按照这个理解,是不是ADS1256芯片无法提供30k的采样频率(至少用户无法得到每秒30k次的采样数据)?
3. 如果以上理解有误,用什么方式可以满足我的使用需求?
我的使用流程如下:
1. 初始化
// 高位在前Most Significant Bit First,
// 自校准Auto-Calibration Enabled
// 开缓冲 Buffer Enabled
ADS1256WREG(ADS1256_STATUS,0x06);
//放大倍数=1 PGA=1
ADS1256WREG(ADS1256_ADCON,0x00);
//SPS=30k
ADS1256WREG(ADS1256_DRATE, ADS1256_DRATE_30000SPS);
//IO output
ADS1256WREG(ADS1256_IO,0x00);
2. 设置通道(MUX)
//AIN0 AINCOM
ADS1256WREG(ADS1256_MUX, B00001000);
3. 同步(Synchronize the A/D Conversion),WAKEUP(Completes SYNC and Exits Standby Mode)
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
4. 连续读取命令 Read Data Continuously
SPI_WriteByte(ADS1256_CMD_RDATAC);
5. 循环读取数据
While(1)
{
//wait DRDY to Low 每次循环等待DRDY为低后开始读取
while(HAL_GPIO_ReadPin(GPIOB, GPIO_ADS1256DRDY_Pin) == GPIO_PIN_RESET);
while(HAL_GPIO_ReadPin(GPIOB, GPIO_ADS1256DRDY_Pin) == GPIO_PIN_SET);
//recv Data, 3 Bytes
SPI_Recv_Byte(ADSdata, 1);
SPI_Recv_Byte(ADSdata+1, 1);
SPI_Recv_Byte(ADSdata+2, 1);
}