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.

[参考译文] Processor-SDK-AM64X:AM64x

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1068518/processor-sdk-am64x-am64x

部件号:processor-SDK-AM64X

您好,

今天,我在 SDK 08.02.00中测试了 mcspi DMA 示例

我修改了该代码,将该示例用作带有 DMA 的 SPI 从。 该示例有效,但 TX 数据(68字节)将立即传输到软件包 DMA 的目标/源缓冲区

如我在手册中所见(已经测试),总共最多可缓冲256字节。

11.3.1.1.1.1 PDMA0功能

提供每通道缓冲:
–为每个目标信道提供8×128位字深数据 FIFO
–为每个源通道提供8×128位字深数据 FIFO

对于  SPI 从器的必需用例,我们更希望能够处理 TX 数据,直到传输真正发生。  是否有办法避免 PackageDMA FIFO 或将其配置为更小的<= 4字节?

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

    您好,

    您使用的是 Linux SDK 还是 MCU+ SDK?

    谢谢,

    建中

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

    你好,建中,

    我正在使用 MCU+ SDK。 例如 FreeRTOS 实施。

    此致,

    罗伯特

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

    你好,罗伯特,

    正如 AM64x TRM 的下一节所述,写入 TR/RX FIFO 的数据大小取决于可以在 PDMA_PSILCFG_RX_STATICAL_TR (CSL_PSILCFG_REG_STATICAL_TR)中更改的 Y*X,因此可以将数据大小写入 TR/RX FIFO <= 4字节。  

    UDMA_chConfigPdma --> UDMA_chSetPeerReg --> CSL_FMK (PSILCFG_REG_STATIC_TR_Z,pdmaPrms->fifoCnt);

    11.3.1.3.4.4.1 X-Y FIFO 模式通道
    PDMA 通道将保持空闲状态,直到在关联的输入 DMA 请求事件引脚上检测到脉冲。
    检测到脉冲后,DMA 将按顺序发出“X”参数的“Y”参数写入总数
    到为信道指定的数据 FIFO 地址的字节。 DMA 执行的每个写入都将是单个
    “X”元素大小(无大爆发)。 完成指定的事务总数后,将会执行
    信道将返回空闲状态并等待,直至再次触发。 执行的写入传输
    在 Tx 通道化 FIFO 中的数据可用性和给定的情况下,将尽快完成
    其他信道也使用相同的写入单元可能导致的仲裁。

    此致,

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

    您好,Ming,

    我调查了 MCSPI DMA 驱动程序,我的理解是 UDMA_chSetPeerReg 的初始化将最终设置为 CSL_PSILCFG_REG_STATIC_TR 的 X,Y 和 Z。

    如果这是正确的,MCU 和 SDK 08.02.00中的 MSPI 驱动程序的当前实施将为具有的68字节的 MSPI 传输配置这些值
      X = UDMA_PDMA_ES_8位
      Y = 1 (元素计数)
      Z = 68 (法线计数)

    此配置将为可用 FIFO 填充多达256字节的数据。 传输发生前,只能修改其他字节。

    此外,我还修改了 MCSPI UDMA 驱动程序,Mcspi_DMA_UDMA.c,第496行:

    pdmaPrms.fifoCnt = 4U;// NumWords <-旧 值

    但这一变化没有效果。 即使如此,FIFO 也将被完全填满。

    还有其他解决方案吗?

    此致,
    罗伯特

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

    你好,罗伯特,

    我研究了 MCU+ SDK 中的 MCSPI DMA 示例。 这是一个使用 DMA 移动数据的环回示例。 同一示例发送数据(在 gMcspiTxBuffer 中),然后将数据接收到 gMcspirxBuffer。 由于数据通过 MCSPI 内部环回发送和接收到 MCSPI_TRANSFORT()的单个呼叫,PDMA 从内存复制到 MCSPI,PDMA 从 MCPSI 复制到内存,因此很难知道 PDMA 通道 FIFO 状态。 我不确定您如何知道这两个128字节的 FIFO 已一次性全部填充。 根据  11.3.1.3.4.4.1 X-Y FIFO 模式通道,PDMA FIFO 副本为每个 DMA 请求事件的 X*Y。 在上述示例中,每个 DMA 事件都将复制8位数据,PDMA 将被触发68次。 我相信 PDMA TX/RX FIFO 一次只能使用1字节。 在第二种情况下,PDMA 每次复制32位数据68次,因此 PDMA TX/RX FIFO 仅使用4个字节。

    另一方面,我同意您的观点,如果您想在传输前处理 TX 数据,则可能需要将 Z 设为1,因为一旦您将数据置于传输缓冲区和 MSPI 传输请求中, 您必须假设它可以随时退出,特别是当您是 MCSPI 从属设备时。 你真的不知道什么时候 MCSPI 主程序要读它。

    此致,

    明