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.

[参考译文] TMS320F28P650DK:从器件 DMA SPI 传输中的字移位问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1513968/tms320f28p650dk-problems-with-word-shift-in-slave-dma-spi-transmission

器件型号:TMS320F28P650DK
Thread 中讨论的其他器件: SysConfigC2000WARE

工具/软件:

我将 TMS320F28P650DK 器件用作 SPI 外设(从器件)、与系统中的另一个(控制器)微控制器之间发送数据和接收数据。 另一个微控制器生成时钟和芯片选择信号。

我尝试发送大量数据、所以正在进行设置、以便由 DMA 管理进出 SPI 外设的数据流。 作为起点、我希望发送/接收16个16位字、从而将 C2000从器件设置为通过 DMA 使用16位字中的数据。 另一个微控制器生成正确的芯片选择和时钟线路来支持这一点。 下图显示了一个示例传输、对于16个16位字、时钟(C2、紫色)循环256次。

数据传输可以正常进行、但从 C2000 (MISO)进行 DMA 传输的数据的位置看起来像是被一个字包裹在一起。 从 C2000器件传输数据的 i 设置结构为:-

MISO 传输的第一个16位字是 FAN2SPEED 数据(我在实践中通过更改该数据并仅查看第一个字位的变化来检查此情况)。 第二个字是 FAN1TEMP、第三个字是 FAN2TEMP。 应该是传输第一个字的 FAN1SPEED 是传输结束时的第16个字。 它看起来好像已经缠绕了。

我的问题是什么会导致这种行为? 我感觉可能是 FIFO 的设置方式、或者 FIFO 在传输开始前不是空的。 两个 DMA 通道都连续运行、在 SysConfig 中启用。 也许我应该根据来自 SPI 控制器的传入 nCS 或时钟线的活动启动并停止测试?

以下是 SysConfig 中的 *** 外设设置:-

任何想法都是最受欢迎的。

谢谢、Iain

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

    尊敬的 Iain:

    SPI/DMA 操作的最重要设置是具有匹配的 SPI FIFO 级别和 DMA 突发大小、您好像在这里正确配置了该大小(FIFO 级别= DMA 突发大小= 8)。 请注意、 在这些配置下 、如果 TX FIFO 中至少有8个可用位置、SPI 只应触发 DMA 移动数据突发、因此不应覆盖 TX FIFO 中的数据。 即使启用了连续模式、DMA 仍需要从 SPI 接收触发才能实际执行任何操作、因此我不认为这也是您的问题。

    您能否说明对 TX DMA 通道的源地址和目标地址使用哪些配置? 我怀疑 DMA 可能是在内存中的错误位置启动的。  

    此外、您是否已尝试未更改运行 SPI_EX5_loopback_DMA C2000ware 示例以验证硬件设置?  

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您回复我。 TX DMA 通道的源地址和目标地址为:

    我认为这是正确的、但这也是我第一次使用 DMA 进行 SPI 数据传输、所以我可能会产生误解。 我的传输的源地址为 SPITXAddr、在突发中、每次传输的地址都会递增一个字。  

    我在 MISO 中看到的传输数据包(新术语中为 POCI!) 是稳定的、因为数据不会随着时间的推移而改变位置(即、我所看到的数据字锁定在它们在数据包中的位置、只是一个字的偏移量)

    我也将查看示例代码、看看行为是否不同。

    非常感谢、

    Iain

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

    尊敬的 Delaney:

    根据您的上述消息、我尝试更改了 DMA 发送缓冲区指向的地址定义。 原来我有:-

    const void *SPITXAddr = (const void *)&SPI_TX;   // Point DMA Address Transmit Buffer to Transmit Data Buffer

    我尝试将其更改为:

    const void *SPITXAddr = ((const void *)&SPI_TX)-1;   // Point DMA Address Transmit Buffer to Transmit Data Buffer

    我预计这是非常糟糕的做法、而且不可靠、但它确实影响了 POCI 传输数据、正如我希望的那样:

    您可以看到 MISO 发送数据包现在从正确的数据开始、前四个字是 FAN1SPEED、FAN2SPEED、FAN1TEMP 和 FAN2TEMP。 这不是一个修复,但它可能会帮助我们了解正在发生什么。 有趣的是、当我这样做时、如果我尝试将数据写入结构的最后一个字(FAN8TEMP)、它不会出现在我的 MISO 传输中、即 MISO 的最后16位字不能再通过 DMA 写入)

    这是否促使人们对可能存在的问题有任何想法?

    谢谢、  

    Iain

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

    尊敬的 Delaney:  

    好的、我想我现在已经解决了这个问题、并想分享我找到的内容。 我首先将地址定义返回到原始地址:-

    const void *SPITXAddr = (const void *)&SPI_TX;   // Point DMA Address Transmit Buffer to Transmit Data Buffer

    我在其他一些帖子上读到、启用 DMA 通道的时间可能会有所不同。 使用我的原始代码、我选择在 SysConfig 工具中同时启用 RX 和 TX 通道、我想该工具会在早期启用外设。 我曾在 SysConfig 中将 TX DMA 通道更改为最初关闭、然后在我的启动代码中启用中断之前启用该通道:

    这种更改会导致 POCI 上的 DMA 发送中的字位于正确的位置、并且我现在可以正确地写入所有十六个字位置。 我现在唯一的问题是、我想了解为什么这解决了问题、因为我不确定我是否100%理解这一点。 BTW -另一个微控制器可能在 C2000引导时运行 SPI 总线、那么这可能是时序/中断问题?

    有什么想法?!

    感谢您的帮助、

    Iain

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

    尊敬的 Iain:

    您的原始寻址行应该合适;它与软件示例中的代码匹配: const void *destAddr =(const void *) rdata;

    我看到、是的、如果您在 SysConfig 中启动 DMA 通道、那么在 SysConfig 生成的代码中 dma_startChannel ()行之后进入的任何触发器都将在 DMA 通道上启动突发、因为它们将被启用。  SysConfig 将把所有 DMA 初始化都放在生成的代码中的 SPI 初始化之前、请参阅下面的屏幕截图。

    由于 SPI 用作两个 DMA 通道的触发源、我相信  SPI 初始化中的一行会在 SPI 实际能够传输任何内容之前触发 DMA (因为最后一行代码启用了 SPI 模块)。 这基本上就像在未启用模块的情况下写入 SPI TX 缓冲寄存器一样、它不会执行任何操作。  

    您看到新代码的区别在于、在所有 SPI 初始化完成后、DMA 通道都会启用、因此它实际上能够将 DMA 传输到 SPI 寄存器的数据。 这样、DMA 通道在 SPI 模块完全初始化之前无法传输数据。  

    如果回答了您的问题、请支持此回答。 Slight smileμ s

    此致、

    Delaney