This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2.8377万S:如何使用正确包装的DMA实现循环缓冲器?

Guru**** 2333840 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/581478/tms320f28377s-how-to-implement-a-circular-buffer-with-dma-that-wraps-correctly

部件号:TMS320F2.8377万S

你(们)好

我拥有TI DSP TMS320F2.8377万S,并且希望将SPI模块与DMA通道一起使用。

DMA通道的配置为:

  • 中断已禁用
  • OneShot已禁用
  • 连续残疾
#定义连拍 1. //连拍大小为2个字(2x 16位)
DMACH5BurstConfig (连拍,1.0); //脉冲大小,src步进,目标步进
DMACH5TransferConfig (传输,1,0);//传输大小,src步进, DEST STEP
DMACH5ModeConfig (DMA_SPIATX,PERINT_ENABLE,OneShot_DISABLE,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,十六位,
Chint_end,CHINT_DISABLE); 

DMA通道使用缓冲区,例如256个双字。 连拍大小为2个字。
DMA缓冲区包含某种帧,这些帧的长度并不始终相同。 因此,我在DMA通道每次启动之前计算传输大小。
所以我不会一次处理整个DMA缓冲区。 我只处理帧后的帧。 对于每个帧传输,都将启动新的传输。

我将包装大小设置为(2*256)/2=256,这意味着256次突发后将有一个包装。 这是DMA缓冲区的结束时间。
然后,我将转至后续处理地址。 换行步骤保持在0。

但我的问题是,在每次传输开始时,自动换行计数设置为换行大小(256)。

这也可以在参考手册图4.7 中看到: http://www.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=spruhx5d

我不知道如何正确设置换行大小或DMA通道以将DMA缓冲区用作循环缓冲区。

此致
Phil

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Phil,您好!

    不幸的是,硬件包装功能并不是真正适用于包装尺寸需要大于传输尺寸的情况。 如TRM所说,“要禁用换行功能,请将这些寄存器的值指定为大于transfer_size。”

    我正在尝试寻找其他解决方案,这些解决方案可以防止您不得不在软件中进行包装,但尚未产生很多解决方案。 我猜您需要处理的最大传输大小是完全256个脉冲?

    Whitney
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Whitney

    感谢您的回复。 这也是我提出的。 我只是不能按我想要的方式使用硬件包装功能。

    我没有任何需要处理全部256次突发的传输。传输大小通常低于其一半或三分之一。

    我认为我必须确保在填满DMA缓冲区时不会有"帧"环绕。 但这并不是我当时打算使用的高效循环缓冲处理。 但无论如何,这是可以接受的。

    Phil