你好,我正在尝试更好地了解 ADC FIFO 的工作原理。我能够使“S32K312 PIT BTCU 并行 ADC FIFO DMA DS3.5 RTD300”示例在 sdk5.0.0 上运行。然后我尝试修改它,因为我有使用不同数量通道的 ADC1 和 ADC0:
ADC0
PaoloRB_0-1742772415846.png
ADC 1
PaoloRB_1-1742772440131.png
我创建了两个具有相同坑源的触发事件和两个 DMA 通道(一个用于 FIFO1,另一个用于 FIFO2)。BTCU设置如下:
PaoloRB_2-1742772519962.png
PaoloRB_3-1742772532333.png
代码编译并调用两个回调函数:
void BctuWatermarkNotif_2(void)
{
result2[0] = (uint16_t) (BctuDmaFifo2[0]&0xFFFF)>>3;
val2[0] = ((浮点型) result2[0]/ adcMax) * (ADC_VREFH - ADC_VREFL);
result2[1] = (uint16_t) (BctuDmaFifo2[1]&0xFFFF)>>3;
val2[1] = ((浮点型) result2[1]/ adcMax) * (ADC_VREFH - ADC_VREFL);
result2[2] = (uint16_t) (BctuDmaFifo2[2]&0xFFFF)>>3;
val2[2] = ((浮点型) result2[2]/ adcMax) * (ADC_VREFH - ADC_VREFL);
}
void BctuWatermarkNotif_1(void)
{
result1[0] = (uint16_t) (BctuDmaFifo1[0]&0xFFFF)>>3;
val1[0] = ((浮点型) result1[0]/ adcMax) * (ADC_VREFH - ADC_VREFL);
result1[1] = (uint16_t) (BctuDmaFifo1[1]&0xFFFF)>>3;
val1[1] = ((浮点型) result1[1]/ adcMax) * (ADC_VREFH - ADC_VREFL);
result1[2] = (uint16_t) (BctuDmaFifo1[2]&0xFFFF)>>3;
val1[2] = ((浮点型) 结果1[2]/ adcMax) * (ADC_VREFH - ADC_VREFL);
result1[3] = (uint16_t) (BctuDmaFifo1[3]&0xFFFF)>>3;
val1[3] = ((浮点型) result1[3]/ adcMax) * (ADC_VREFH - ADC_VREFL);
}
但是 valx[] 数组不包含正确的值,看起来它们正在移动。
这里有一些截图:
我已附上源代码。
您能否提供一些有关如何修复它的信息?
当 adc0 和 1 使用不同数量的通道时,我可以使用单个 FIFO 吗?
先行致谢。
此致问候
Hi@PaoloRB
1.我检查了你的代码,发现水掩码值有误。
请参考下面的修改。
Senlent_0-1742796286800.png
Senlent_1-1742796303992.png
2.当adc0和1使用不同数量的通道时,我可以使用单个FIFO吗?
是的,这可以通过“Adc Target Mask”来完成,例如,在你的情况下,你可以将 i 设置为 0b011,
然后 adc0 和 adc1 将并行工作并在相同的触发源和数据上触发
可以根据需要保存到 fifo1或fifo2。