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.

[参考译文] AM62A7:R5F — 使用 SDK 为 SPI0 事务设置 GPIO 触发的 DMA

Guru**** 2914610 points

Other Parts Discussed in Thread: AM62A7, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1649482/am62a7-r5f---use-sdk-to-setup-gpio-triggered-dma-for-spi0-transaction

器件型号: AM62A7
主题: SysConfig 中讨论的其他器件

我想利用 AM62A7 中的 R5F MCU 来捕获传感器数据。 由于传感器的数量以及数据采样和到达的频率、我希望在不占用 CPU 并尽可能减少上下文切换的情况下在硬件中尽可能做到这一点。

需要使用 GPIO 引脚上的外部源触发、通过 SPI 以高频 (3.6kHz) 定期采样一个传感器。 以 18 个采样间隔对收集的数据进行处理并复制到共享存储器空间。 该传感器连接到主域 SPI0 通道、但交叉连接到 R5F 控制、与触发 GPIO 引脚类似。 由于 SPI0 属于主域、因此它应该具有 DMSS 功能。 MCU 域外设没有 DMA。

我认为应该有 GPIO 事件来触发 DMA 发送/接收 32 个 16 位字。 在其中 18 个事件之后、DMA 会触发一个完成中断、通知任务处理要复制到共享存储器空间的数据。 我的理解是、DMA 即使在 R5 控制下交叉运行、也仍然可以用于主域外设。 但是、用于触发 DMA 的 GPIO 也必须在主域中。 PKTDMA 不能由 GPIO 直接触发。 相反、我们必须设置 GPIO 以触发 BCDMA、使 PKTDMA 能够与 SPI0 进行通信。

我没有看到任何设置 GPIO 以在 R5F 上为主域外设触发 PKTDMA/PDMA 的示例。 根据我的搜索、以下是需要设置的内容:

  1. SysConfig 将 SPI0 “intriminEnable“配置为“已轮询“、useMcuDomainPeripherals 配置为“错误“。
  2. SysConfig 添加两个 UDMA 实例:一个作为 PKTDMA、另一个作为 BCDMA
  3. SysConfig 将触发 GPIO 添加为“输入“、三角类型添加为“FALL_EDGE“、useMcuDomainPeripherals 添加为“FALSE “。
  4. 通过 SYSFW 路由 GPIO (E18)、方法是将主 GPIOMUX INTROUTER 的源定义为 ID 索引 E18 处的输出 ID、该源已在分配给 R5 的 sciclient_defaultBoardcfg_rm.c 中定义。
  5. 将路由器输出 ID 转换为全局事件编号、即 50176+ID。
  6. 设置和初始化 PKTDMA - Tx 和 Rx 的 2 个通道。 这需要为 MCSPI0 设置相应的 PSI-L 线程、并为 FQ 和 CQ 设置元素计数、环存储器和环大小。 将 BCDMA 设置为具有适当数量的元素计数、振铃内存和振铃大小
  7. 分别使用 UDMA_chConfigTx () 和 UDMA_chConfigRx () 将默认通道配置应用于 PKTDMA、这两者都用于 BCDMA。
  8. 设置 PDMA 元素大小和计数(基于 SPI0 FIFO 大小)并将它们绑定到各自的 PKTDMA。
  9. 设置在发生全局事件时触发的“Kick“传输请求 (TR) BCDMA、以将“1“传输到 Tx PKTDMA 的“Doorbell“物理地址。  将此 TR 配置为无限期循环。 为 Tx PKTDMA 设置 TR、以将固定数据写入 SPI0。 将此 TR 预装到 Tx PKTDMA 的环形内存中的所有插槽中、以便始终可以执行 TR 而无需重新排队。 在触发完成中断之前、设置 Rx PKTDMA TR 以从 SPI0 读取数据、18 次进入存储器。
  10. 设置 UDMA 事件以在 Rx PKTDMA 完成中断时触发、从而运行回调。
  11. 回调将 Rx TR 取消排队并重新排队、并通知任务以获取和处理 18 条数据记录。

这是正确的吗? 如果是、是否有办法在每个步骤中检查设置是否正确完成?  

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

    您好、Yen Danny、

    我们可以按如下方式实现此目的:基于 GPIO 输入触发 DMA。

    数据流:GPIO→BCDMA→PDMA→Destination Memory

    一旦存储器中有可用数据、DMA 回调将发布一个信标。

    任务将等待这个信标信号。 当 DMA 中断回调共享信标信号时、任务将向其发送此数据
    应用用例。

    是的、这是可以实现的。 通过 DMA 从 MCU R5F 内核访问主 SPI。

    目前、具有 DMA 的现有 SPI 示例使用 PKTDMA、它不支持无限 TR(传输请求)加载。

    因此、我们需要首先将 SPI 与 BCDMA 配合使用。 一旦有效、我们就可以将其转换为使用自动触发 DMA。

    您可以参考下面的常见问题解答示例、该示例清楚地说明了如何根据 GPIO 输入触发 DMA。

    由于 MCU+SDK 中不存在这些示例、因此我们需要自行实现。

    是否可以按照与 MCASP 驱动程序类似的方法、首先使用 BCDMA 创建 SPI 示例?

     【常见问题解答】:如何在 AM64X/AM243 和 AM62X 器件上借助 GPIO 触发 DMA? 

    此致、

    Anil.

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

    是否可以按照与 MCASP 驱动程序类似的方法、首先使用 BCDMA 创建 SPI 示例?

    我当然可以尝试。 但我的理解是、BCDMA 不能直接与 SPI 交互。 相反、我必须使用 PKTDMA 通过 PSI-L 线程将数据流式传输到 SPI 或从 SPI 流式传输到 PDMA。 这不是真的吗?

    您能否介绍 MCASP 驱动程序的实现以及具有 DMA 的 SPI 使用 PKTDMA 的现有示例? 是在 R5F 中实现的吗?

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

    你好 Danny Yen、

    可以通过 BCDMA 或 PKTDMA 通道访问到目标存储器的 PDMA。

    在 MCU+SDK 中、我们目前仅支持 PKTDMA。

    但是、一些驱动程序(如 MCASP)仍使用 BCDMA 通道将数据从外设传输到目标存储器。

    您可以参考以下代码。

    此致、

    Anil.