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.

[参考译文] TMS320F28335:DMA 用法

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1163570/tms320f28335-dma-usage

器件型号:TMS320F28335

我的目标是通过 DMA 将8个 ADC 值的数据包传输到长度为1024的循环缓冲器。 到循环缓冲器的数据传输应该能够在全部8个 ADC 值的任何位置停止、并且被重新路由至第二个缓冲器以循环填充。

我尝试使用8 (16位值)的 BURST_SIZE 和128个突发(8*128=1024)的 TRANSFLE_SIZE。 当我想要切换缓冲区时、我更改了 SRC_beg_ADDR_SHADDR 和 SRC_ADDR_SHADOW。 由于当 transfer_count 为零时这些数据只能读取,因此我向 transfer_count 写入了“零”。 遗憾的是、我注意到我写入 transfer_count 的值被忽略、尽管在文档中被声明为 R/W 值。 因此、在切换之前、DMA 始终继续写入、直至缓冲区结束。 这不是所需的。

您对如何实现这一目标有什么建议吗?

此致、
Bernd

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

    您好、Bernd、

    查看 DMA 状态图、向 transfer_count 写入0应该起作用。
    在写入 transfer_count 寄存器之前、您是否使用了 EALLOW 指令?
    所有 DMA 寄存器写入均受 EALLOW 保护。

    此致、
    Andy

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

    Bernd、

    除了 Andy 所说的内容、 您可以保留影子地址(我认为您是指 DST_ADDR_SHADDR 与 SRC)预加载、等待所有传输完成或 SW 手动设置 TRANSFER_COUNT=0; 假设下一个缓冲区地址始终提前知道(通常只有2个、但此处可能不是这样、不确定)。

    这是一个有趣的例子、通常我们有一个乒乓缓冲器、每次只用总字数填充、这使得 DMA ISR/自动加载到大部分工作中。  这看起来像是上面的形式、可能有一些理由提前停止它、但正如您在8字边界上所说的那样。  我不确定我们之前是否已经尝试过这种方法、但它似乎应该根据文档进行工作。

    最后、稍微思考一下、也许我们想在写入0之前检查 transfer_count 值;如果它为"1"、我只让它完成完整的传输、而不是尝试提早结束传输1突发。  如果 DMA 在0校验发生后但在计数器递减之前以某种方式写入 DMA、我不确定会发生什么情况。  只是一个想法。

    最棒的
    Matthew

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

    您好、Matthew、

    为了写入 transfer_count 寄存器、我使用了 EALLOW 指令。 我刚刚再次测试它、我写入 transfer_count 的值 将被忽略、transfer_count 继续照常递减。

    我还注意 到、通道1中的 transfer_count 开始以小于 transfer_size 的一个开始计数、并且两个 burst long 值为零、因此突发总数确实是 transfer_size、但 Chanel2确实对右侧进行计数。 不过、这使得查找最近写入的样本所在的位置变得复杂。

    作为一种权变措施、由于我未能更改 transfer_count、因此我使用了两个 DMA 通道、因此每个通道都有自己的固定缓冲区、当我停止第一个通道以便我可以处理数据时、我会启动第二个通道、反之亦然。

    我选择的方法似乎并不常见。 我正在尝试构建类似于示波器的数据采集。 我想在找到触发器时记录固定数量的样本、我还想保留一定数量的预触发器样本。

    记录此事件后、我希望数据一直可用、直到数据得到处理。 不过、数据采集应在第二个缓冲区上连续进行、而不会中断。

    您是否有此类应用的一些示例?

    请注意、

    Joseph

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

    Joseph、

    感谢您尝试做的事情的背景。  我需要花些时间来看看是否有一个优雅的解决方案。  

    在回答肯定问题之前、我应该亲自尝试一下;我怀疑 TRM 中有一个错误、即_count 寄存器不可写。  这将由 DMA 加载、其中 transfer_size -1位于 DMA 过程开始时、我认为我们不需要允许 CPU 写入。

    让我看看我能提出什么、并能给您回复。

    最棒的
    Matthew

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

    Joseph、

    我尝试停止 DMA 以查看在该状态下是否可以覆盖传输计数、但这也不允许写入。  我认为你目前的选择将是向前推进的最佳方式。

    最棒的

    Matthew