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.

[参考译文] TMS570LC4357:在 DMA->SPI 传输完成后、MIBSPI TGENA 不会清除

Guru**** 2394295 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1380547/tms570lc4357-mibspi-tgena-not-clearing-after-dma--spi-transfer-completes

工具与软件:

从开始执行以下操作:

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/996614/rm48l952-understanding-mibspi-dma-data-size

我有类似的设置、其中的 TG 长度1 8位元素、使用帧大小来改变传输长度。 TG 单次触发禁用(DMACTRL 启用)

数据正通过 DMA 从正常的 RAM 到 SPI 总线、再到 TxRAM 缓冲器好-我可以在"范围"上看到这一点。 但我有2个问题:

 TGENA 位 永远不会被清零、且 TGTDx 也保持置位、这意味着传输只发生一次。

2.传输完成后 CS 不会取消置位(CSHOLD 启用,因为我不想在元素之间取消置位)。

DMA Completing (DMA 完成)是否未清除  TGENA? 我是否必须设置一个中断才能实现这一点?

由于传输组中只有1个缓冲区、因此我无法在最后一个缓冲区中禁用 CSHOLD、那么如何解决这个问题呢?

非常感谢。

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

    Paul、你好!

    Unknown 说:
    2. 传输完成后 CS 不会失效(启用 CSHOLD、因为我不希望在元素之间取消置位)。

    如果你想在传输之间控制 CSHOLD ,那么你可以做一件事。

    您可以进行32位传输、而无需从 DMA 进行8位传输。 我的意思是、您也可以在数据传输的同时进行控制信息传输。

    我以前有过此要求、请参阅以下主题一次:

    (2) TMS570LS3137:发送多个24位传输组-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    准确查看上述主题中的以下注释:

    ——
    谢谢、此致、
    Jagadish。

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

    该用例具有可传输任何长度的"通用"接口(例如、用于配置器件)、然后使用另一个具有固定长度的 TG 来进行常规传输。

    我最后尝试了中断方法、清除了 TGENA、并重新设置了 RX/TXDMAENA 位、这就像复位 TG 一样有效。 我现在可以在我的任务中重复传输。 但是、CS 仍然是一个问题。

    我也想到了控制部分转移、但这完全不符合使用 DMA 的要求、因为您必须预先执行该复制。

    RAM 缓冲区的问题在于、它们不会动态重新调整大小、因为它们是按顺序排列的。  

    另一种想法是调整 TG 的大小、并且只使用其中的一部分。 即4个 tg、每个 tg 分配了32个条目。 传输设置为使用最高到极限所需的内容-但是、在周围阅读时却看不到这是否可行。 我看到的所有内容都指向缓冲区长度和事务长度必须相同。 这种方法可行吗?

    非常感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一种想法是调整 TG 的大小、只使用其中的一部分。 i、e 4个 tg、每个 tg 分配了32个条目。

    ...我刚刚意识到这还需要重置 Tx 缓冲区中的控制位以确保给定传输大小的最后一个条目会禁用 CSHOLD。

    嗯。

    编辑:嗯、一个位-能够存储最后传输的大小并恢复那个缓冲区条目、然后为下一次传输设定缓冲区条目。

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

    好的、我认为我的做法看起来是应该的。

    所以、太大的 TG (我要多出4个32个)、

    使用 BUFMODE 3 (跳过)配置 Tx 视图区域、启用 CSHOLD

    每次传输:

    在上一大小传输缓冲区中设置 CSHOLD、为新大小的传输清除

    将 DMA ELCNT 设定为新的传输大小

     针对新的传输大小将 DMACTRL BUFID 设置为最后一个缓冲器(与 CSHOLD 禁用相同)

    设置  DMACTRL Tx/RXDMAENA  

    执行...

    在中断中:

    清除 TGCTRL TGENA  

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

    Paul、你好!

    您的方法对我来说很好。

    ——
    谢谢、此致、
    Jagadish。