我正在尝试使用 DMA 通过 16 位 SPI 对 16 位 ADC 进行采样,并将这些值传输到滤波器。 我的代码还需要访问原始 ADC 数据和过滤后的数据,因此我还使用 DMA 将数值复制到 RAM 中。 我配置了 4 个 DMA 块。
- RAM -> SPI
- SPI -> RAM
- RAM -> 过滤器
- 过滤器 -> RAM
进出 SPI 的 DMA 运行良好,我的代码可以看到 ADC 读数。 但是,DMA 进出过滤器似乎不起作用。 我阅读了文档,甚至尝试了 DMA 向导,我相当肯定我的设置是正确的。
我知道过滤器本身可以工作,因为我可以在软件中使用 Filter_Write16() 和 Filter_Read16()写入和读取数值。 我甚至试过直接向寄存器写入和读出:
Filter_STAGEA16_PTR和
Filter_HOLDA16_PTR。 这样就成功了,我可以看到过滤后的数据。
不工作的是 DMA 到/从过滤器。 这就是我为过滤器配置 DMA 的方法:
#define DMA_To_Filter_BYTES_PER_BURST 2#define DMA_To_Filter_REQUEST_PER_BURST 1#define DMA_To_Filter_SRC_BASE (CYDEV_SRAM_BASE)#define DMA_To_Filter_DST_BASE (CYDEV_PERIPH_BASE)uint16 adc_result;uint8 DMA_To_Filter_Chan;uint8 DMA_To_Filter_TD;DMA_To_Filter_Chan = DMA_To_Filter_DmaIni
tialize(DMA_To_Filter_BYTES_PER_BURST, DMA_To_Filter_REQUEST_PER_BURST, HI16(DMA_To_Filter_SRC_BASE), HI16(DMA_To_Filter_DST_BASE));DMA_To_Filter_TD = CyDmaTdAllocate();CyDmaTdSetConfiguration(DMA_To_Filter_TD, 2, DMA_To_Filter_TD, DMA_To_Filter__TD_TERMOUT_EN);CyDmaTdSetAddress(DMA_To_Filter_TD, LO16((uint32) adc_result), LO16((uint32)Filter_STAGEA16_PTR));CyDmaChSetInitialTd(DMA_To_Filter_Chan, DMA_To_Filter_TD);CyDmaChEnable(DMA_To_Filter_Chan, 1);
对于目标地址,我尝试了
Filter_STAGEA_PTR和
Filter _ STAGEA16_PTR。 都不行。
我还需要注意的是,即使在软件中对滤波器进行写入/读取,我也看不到滤波器的 DMA_Req_A 输出有任何脉冲。
这是我的设置。 PWM 组件在 pwm1 上产生一个上升沿以触发 SPI DMA,然后在 pwm2 上产生一个上升沿以触发滤波 DMA。 状态寄存器可用于触发软件在适当的时候写入/读取滤波器。