STM32F4定时器触发DMA SPI–NSS问题



我有一个STM32F417IG微控制器,一个外部16位DAC(TI DAC81404(,它应该生成采样率为32kHz的信号。通过SPI的通信不应涉及任何CPU资源。这就是为什么我想使用定时器触发的DMA将速率为32kHz的数据移位到SPI数据寄存器,以便将数据发送到DAC。

有关DAC的信息每当DAC接收到通道地址和新的对应的16位值时,DAC都会将其输出电压更新为新的接收值。这是通过以下方式实现的:

  1. 将CS/NSS/SYNC–引脚拉低
  2. 发送24位/3字节长的消息,以及
  3. 将CS拉回到高状态消息的前8位除其他信息外,还包含应在何处施加输出电压的信息。下一个和同时的最后一个16位包含新值

有关STM32的信息不幸的是,ST的微控制器NSS引脚出现硬件问题。通过SPI启动通信时,NSS引脚被拉低。现在,只要SPI被启用,引脚就处于低位(。(参考手册第877页(。遗憾的是,这不是和需要在每条消息后提高NSS的设备进行通信的正确方式。"解决方案"是按照手册中的建议手动切换NSS引脚(当主设备与SPI从设备通信时,需要在传输之间取消选择,NSS引脚必须配置为GPIO,或者必须使用另一个GPIO并由软件切换。(

问题如果以普通方式使用DMA,则仅在启动进程时使用CPU。通过每1/3200秒切换两次NSS,这将导致相应的CPU交互。我的问题是,我是否错过了一些东西,以便在没有CPU的情况下实现通信。

如果不是,我现在的目标是将CPU处理时间减少到最低限度。我的计划是用定时器触发DMA。因此,每1/32k秒,SPI的数据寄存器就会充满DAC的24位数据。NSS可以通过定时器中断来切换。我在实现它时遇到了问题,因为我不知道如何使用HAL函数将计时器与SPI的DMA链接起来。有人能帮我吗?

这是一个棘手的问题。使用DAC和微控制器的这种组合可能很难避免每个采样有一个中断。

然而,我会考虑的一种方法是将CS信号创建为计时器输出比较(如PWM(。您可以使用同一定时器的多个通道或链接多个定时器,在CS输出和DMA触发器之间创建延迟。您应该为抖动留出一些空间,因为根据其他情况,DMA可能不会立即响应。不过,这不会影响你的DAC输出信号,因为它只在芯片选择的上升沿输出值(在DAC数据表中称为SYNC(,该值仍然来自你的第一个定时器。

最新更新