嗨、大家好。
我们使用的是 ADS131M08 ADC。 XTAL1连接到外部石英谐振器、频率为8.192MHz
我们需要每秒读取2000个样本(通过数据就绪引脚在每次中断中读取数据)。
寄存器设置(SPI 8MHz):
I (1327) ads131_read_reg:reg 0x00 val 0x2801 // ID
I (1337) ads131_WRITE_reg:reg 0x03 val 0x3f12 //时钟:使用6个通道、过采样2048
I (1337) ads131_read_reg:reg 0x03 val 0x3f12
I (1347) ads131_WRITE_reg:reg 0x02 val 0x110 //模式:清除状态寄存器中的复位位位位位
I (1347) ads131_read_reg:reg 0x02 val 0x110
中断处理程序:
uint32_t adc_int_counter = 0;
int32_t tempvals [6];
int32_t tempvals2 [6];
static void gpio_isr_handler (void * arg)
{
adc_int_counter++;
extern uint16_t ads131_status;
// function send&read ADS131 frame (3 * 10 byte): STATUS register + converted to signed 32 bit MEASURES for 6 channels
ads131_read_measures (&tempvals[0]);
if (adc_int_counter<10)
ads131_read_measures(& tempvals2 [0]); // additional reading for clear ADC internal FIFO after start
}
nDRDY 信号:
黄色-数据就绪
红色- SPI CS
https://youtu.be/yrjQPvFeUc4
有时 nDRDY 信号会变得不正确(1us 峰值而不是曲折)(状态寄存器值0x13f):
如果每秒仅生成1000个样本(OSR 4096)、则 nDRDY 正确。
如果使用以下处理程序、则信号有效:
static void gpio_isr_handler (void * arg)
{
adc_int_counter++;
extern uint16_t ads131_status;
ads131_read_measures (&tempvals[0]);
if (ads131_status & 0x3f) !=0)
{
ads131_read_measures (& tempvals2 [0]);
adcDataEqual = memcmp(tempvals, tempvals2, sizeof(tempvals)); // !!! STRANGE: WHY DATA IS EQUAL !!!
}
}
校正 nDRDY 信号:
不正确的 nDRDY 信号:
为什么即使在中断中永久读取数据、状态寄存器的 DRDY0-DRDY5位也会再次出现? 为什么二次读取数据等效第一次读取?
为什么只有一个读取中断时 nDRDY 不正确?