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.

[参考译文] TMS570LS3137:检查 DMA 传输是否已完成

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1415258/tms570ls3137-check-for-dma-transfer-completed

器件型号:TMS570LS3137

工具与软件:

您好!

我正在尝试对 SPI 外设(标准 SPI、而不是 MibSPI)上接收到的数据使用 DMA。 这个过程看起来基本上没什么问题、但是当具有多次连续传输时、我注意到块的最后一个帧被传输到下一个目的地。 我已经设置了一个小示例项目、您可以在下面的屏幕截图中看到 src 阵列的第4个元素被发送到 DEST2 阵列而不是  dest 阵列。

我认为这是因为我在前一个传输完全完成之前开始下一个传输(如果我在其正常运行之间添加一些延迟、请参阅 DEST3)。 我尝试了读取 DMA 状态寄存器(GCTRL、 DMASTAT、 PEND、 PTCRL)的不同位、以确认 DMA 传输已完成、但这些位均无法正常运行。 是否有更可靠的方法可以实现这一点?

作为参考、可在此处获取我的示例代码:

e2e.ti.com/.../test_5F00_spi_5F00_dma.zip

谢谢、此致、

亚伦

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

    大家好、Aaron:

    您对该问题是正确的;您需要等待传输完成、然后才能启动下一次传输。

    我随附参考代码及修改内容:

    e2e.ti.com/.../7360.test_5F00_spi_5F00_dma.zip

    以下是修改后的结果:

    ——
    谢谢、此致、
    Jagadish。

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

    您好 Jagadish、

    感谢您提供示例代码、我已经过测试、现在它确实能按预期运行。 我很惊讶、因为我之前实际上也曾尝试读取 BTC 标志以检查块传输结束的确认、但我肯定是错了。

    谢谢、此致、

    亚伦

    编辑:
    注意对于以后不能访问示例代码的其他读者、这是等待 DMA 块传输结束的正确方法:

    while(!(dmaREG->BTCFLAG & (1 << DMA_CH0))); /*Wait Until the block transfer completed*/
    dmaREG->BTCFLAG |= (1 << DMA_CH0);          /*Clear BTC*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意对于将来无法访问示例代码的其它读者、这是等待 DMA 块传输结束的正确方法:

    谢谢 Aaron、您的提问!