uint16_t fifo_count = (FIFO_COUNTER0 << 8) | FIFO_COUNTER1;
然后就是读取了:
uint8_t data[3];
spi_read(FIFO_DATA, data, 3);
接下来就把FIFO里面的数据还原我们感兴趣的样子:
uint32_t fifo_word = (data[0] << 16) | (data[1] << 8) | data[2];
uint16_t adc_value = fifo_word & 0xFFFF; // 低 16 位为 ADC 数据
uint8_t tag = (fifo_word >> 16) & 0x0F; // 4-bit 通道标签
uint8_t flag = (fifo_word >> 20) & 0x01; // ADC 是否饱和
可能读比写超前,那就读取不到啊,都没数据,所以要判断。
读取数据前,检查 FIFO_COUNTER 确保 FIFO 非空。读完 FIFO 后,清空缓冲区。
void read_fifo_data() {
uint16_t fifo_count = (read_register(FIFO_COUNTER0) << 8) | read_register(FIFO_COUNTER1);
if (fifo_count > 0) {
for (int i = 0; i < fifo_count; i++) {
uint8_t data[3];
spi_read(FIFO_DATA, data, 3);
uint32_t fifo_word = (data[0] << 16) | (data[1] << 8) | data[2];
uint16_t adc_value = fifo_word & 0xFFFF;
uint8_t tag = (fifo_word >> 16) & 0x0F;
uint8_t flag = (fifo_word >> 20) & 0x01;
printf("ADC Value: %u, Channel: %d, Saturation: %d\n", adc_value, tag, flag);
}
}
// 清空 FIFO,避免数据重复
write_register(FIFO_CFG, FLUSH_FIFO);
}
两个芯片没有大区别
[写指令 | 地址] -> [数据]
uint8_t cmd = 0x0B;
uint8_t fifo_data[3];
spi_read(cmd, fifo_data, 3);
uint32_t adc_value = (fifo_data[0] << 16) | (fifo_data[1] << 8) | fifo_data[2];
简单