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.

[参考译文] TMS320F28386D:优化开启时 DMA 出现故障 SPI

Guru**** 2454530 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1208817/tms320f28386d-faulty-spi-with-dma-when-optimization-is-on

器件型号:TMS320F28386D

大家好

我们在某一产品的主板中使用 TSM320F28386D DSP、该产品还包括一个微处理器和一个 FPGA。 这里使用了两个 SPI 通道作为主设备与上行端口通信、每个通道的周期分别为4ms 和8ms。 两个通道都有两个 DMA 通道、一个用于 SIMO、另一个用于 SOMI、并以25Mbps 的波特率进行传输。

我们使用具有 DMA 支持的 SPI 通信来管理外设缓冲器。 每个 DMA 通道将在定义的突发次数完成后发布一个硬件中断、不过我们发现了这一点  随机地、4ms 周期 RX 中断不会弹出的时间的大约40% 。 相反、它在以下传输开始时调用、这似乎表明缺少一些帧、并且 DMA 传输仍在等待  最后一次突发。 然后、应用程序检测到 错误的 CRC 并执行恢复、为下一次传输做好准备。

一些注意事项:

- 与硬件的路径或电子产品一般是不在表,因为 DSP-up 通信工作正常在相同的条件下,在以前的版本。 此外、 将波特率减半没有影响

-两次传输之间的时间也大幅度增加,没有任何影响。 此外、我们还通过调试和 GPIO 检查了这一点 溢出不会发生

- 关闭优化后、问题似乎得到了解决 。 0级优化用于发生故障的版本和以前的版本。 在大多数情况下、关闭 SPI 驱动程序源文件的优化就足够了、但有时需要从其余驱动程序中删除优化、具体取决于应用程序代码中的内容。 不能选择不使用优化、因为必须使用内联。

- DMA 转储中涉及的所有变量均定义为 volatile。

- SPI 缓冲区管理中使用的所有4个 DMA 通道也用于在传输结束时在变量之间执行1/2一次性内存转储。 转储完成后、它们会被重新配置为 当主器件(UP)开始通信时管理 SPI 缓冲区。 由于我们已检查为下一次传输准备 DMA 通道的功能 是否在开始之前就已成功实现(没有溢出)、因此这不应导致性能故障。

-禁用内联对故障没有影响。 也没有使用--aliased_variables 参数。

-使用的 CCS 版本为12.1.0.00007,编译器版本为 TI v22.6.0.LTS

我们一直在查看"优化 C/C++编译器用户指南"、但到目前为止没有任何效果。 任何类型的建议都将非常感谢。 提前感谢!

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

    Felip,

    打开优化后、似乎您遇到了某种同步问题。

    什么事件触发 DMA 通道? 它是基于 SPI 事件(还是)任何其他计时器事件?

    Unknown 说:
    用于 SPI 缓冲区管理的所有4个 DMA 通道也可用于在传输结束时立即在变量之间执行1/2一次性存储转储。 转储完成后、它们会被重新配置为 当主器件(UP)开始通信时管理 SPI 缓冲区。 由于我们已检查为下一次传输准备 DMA 通道的功能 是否在开始之前就已成功实现(没有超限)、因此这不应导致性能故障。

    所有 DMA 事务是否都是一次性发送? 一次性 DMA 事务会将 DMA 带宽噪声、直到它完成传输中的所有突发。 当您看到此问题时、您是否发生了 DMA 溢出事件?

    此致、

    Manoj

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

    尊敬的 Manoj:

    RX 和 TX 的 DMA 在 FIFO 8级以8字的突发大小触发。 当(n_of_wordss_per_transmit / 8)个突发完成时、HWI 触发并将其 DMA 通道重新配置为使用 SW 触发器的单触发模式、以在两个变量之间执行一次或两次存储器转储。 这些操作完成后、每个 DMA 通道都将配置回其"SPI 触发-无单次触发"状态。 我们已经进行了检查、该检查总是在故障传输开始前进行、因此不会被主机(上行)超限。

    此外、我刚才已检查、目前没有 DMA 通道设置了 OVRFLG。

    弗兰

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

    Fran、

    您是否尝试过减小突发大小和传输大小? 这显然是打开优化时的计时问题。 优化开启时、代码根据相关性而无序执行的顺序。 您需要找出导致此行为的代码部分。  

    此致、

    Manoj

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

    Fran、

    您是否尝试过减小突发大小和传输大小? 这显然是打开优化时的计时问题。 优化开启时、代码根据相关性而无序执行的顺序。 您需要找出导致此行为的代码部分。  

    另一件事是尝试不同的优化级别。

    此致、

    Manoj

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

    您好、Manoj

    这样就解决了问题。 我们将突发大小减半为4、并将传输中的突发数量加倍、以获得相同数量的字数。 谢谢你的建议!

    此致

    弗兰