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-SPI EP:TMS570LC4357 MibSPI DMA 传输限值和大数据 (12KB) 传输澄清

Guru**** 2864540 points

Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1628048/tms570lc4357-ep-tms570lc4357-mibspi-dma-transfer-limit-and-large-data-12kb-transmission-clarification

器件型号: TMS570LC4357-TMS570LC4357 EP
主题中讨论的其他器件: HALCOGEN

您好、

我正在使用 TMS570LC4357-DMA、并尝试将 MibSPI 与 EP 一起用于仅发送操作。

我提到了 HALCoGen 示例 (example_mibspiDma)、其中传输大小限制为 128 个字。 我知道这可能与 MibSPI RAM/转移组大小有关。

我的要求是使用 DMA 连续传输约 12KB 的数据。

我有以下问题:

1.是否由于每个传输组的 MibSPI RAM 大小而限制了 128 字?
2.为 12KB 这样的大数据传输配置 DMA 的正确方法是什么?
-我是否应该使用帧计数将传输分成多个块?
3.在这种情况下,元素计数和帧计数应如何配置?
-例如,如果使用 128 个字块,设置是正确的:
元素计数= 128
帧计数= TOTAL_WORDS/128?
4、是否有任何建议的方法(如乒乓缓冲或转移群链),以实现高效的大数据传输?

我的用例是仅传输、我希望更大限度地减少 CPU 干预。

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

    尊敬的 Vasu:

    能否请参阅以下类似要求主题:

    (+) TMS570LS3137:带 DMA 和长传输的 TX/RX MibSpi — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    --
    此致、
    Jagadish。

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

    你好 jagadish gundavarapu ,

    感谢您的反馈。 我已经浏览了参考主题和技术参考手册、但我仍然对在 TMS570LC4357-DMA 上使用 EP 进行的大型数据传输存在一些困惑。  我的要求是使用 MibSPI 和 DMA(仅限 TX)传输约 12KB 的数据。 我知道 MibSPI 的缓冲区大小有限(例如,每个传输组 128 个字)、示例代码也使用 128 个元素。

    但是、我不希望使用 DMA 通道链接(即从另一个 DMA 通道触发一个 DMA 通道)、因为:
    1.我的数据大小相对较大 (12KB),和
    2.该设备具有有限数量的 DMA 通道(32 个),我还需要为其他外设保留这些通道。

    从 TRM 中、我看到 DMA 支持非常大的传输大小(高达数百 MB)、因此我想了解如何配置单个 DMA 通道来处理该问题。

    具体而言、我有以下问题:

    1.使用元素计数和帧计数配置单个 DMA 通道来处理整个 12KB 传输是否正确?

    2.如果我配置:
    -元素计数= 128(以匹配 MibSPI 缓冲区大小)
    -帧计数=(12kB/128 个元素)

    将传输拆分为由 DMA 自动处理的多个帧的正确方式是否正确?

    3.在这种配置中,DMA 是否会按顺序自动传输所有帧,而无需 CPU 干预或通道链?

    4.这是推荐用于大型 MibSPI DMA 传输的方法吗?还是应该考虑任何限制或更好的方法?

    我的用例是仅传输、我希望在高效处理大型数据的同时尽量减少 CPU 参与。

    任何澄清或配置示例都会很有帮助。

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

    尊敬的 Vasu:

    对延迟的回复表示歉意。

    我没有直接示例、但您可以尝试以下步骤。

    DMA 配置路径:

    1. 是的、您可以使用元素计数和帧计数配置单个 DMA 通道来处理整个 12KB 传输。

    2. 您的配置方法正确:

      • 元素计数= 128(匹配 MibSPI 缓冲区大小)
      • 帧计数=(12kB/128 个元素)= 96 帧(假设 1 个元素= 1 个字节)
      • 如果元素是 16 位字、则需要 48 帧(12KB/256 字节)
    3. 是的、DMA 将自动按顺序传输所有帧、而无需 CPU 干预或通道链。 这是 TMS570 中基于帧的 DMA 架构的主要优势。

    实现详细信息:

    对于 MibSPI 传输、请考虑以下要点:

    1. 缓冲区管理:MibSPI 的缓冲深度有限。 配置时:

      • 将 DMA 传输触发设置为在 MibSPI TX 缓冲器达到特定电平时发生
      • 这可以确保 DMA 保持缓冲区被填充、但不会使缓冲区溢出
    2. 传输模式:将块传输模式用于:

      • DESTMODE = 0(不修改地址)
      • SRCMODE = 1(地址在每次传输后递增)
      • 这会在通过源缓冲区递增的同时一直向同一 MibSPI 数据寄存器写入数据
    3. 中断配置

      • 如果在整个传输完成时需要通知、请配置 FTC(帧传输完成)中断
      • 这样就避免了需要轮询 DMA 状态

    示例配置代码:

    // Configure DMA channel for MibSPI transfer
    void configureDmaForMibSpi(uint32 *sourceBuffer, uint32 bufferSizeBytes) {
        // Calculate frame count based on element size (assuming 4 bytes per element)
        uint32 elementCount = 128;  // Match MibSPI buffer size
        uint32 frameCount = bufferSizeBytes / (elementCount * 4);
        
        // Configure DMA channel
        dmaSetCtrlPacket(
            DMA_CH_MIBSPI_TX,       // DMA channel for MibSPI TX
            sourceBuffer,           // Source address (your data buffer)
            (uint32*)&mibspiREG1->TDAT[0], // Destination (MibSPI data register)
            elementCount,           // 128 elements per frame
            frameCount,             // Number of frames to transfer
            DMA_SRCINC_1 | DMA_DSTINC_0 | DMA_SIZE_32 | DMA_TTYPE_FRAME
        );
        
        // Enable DMA channel
        dmaReqAssign(DMA_CH_MIBSPI_TX, DMA_REQ_MIBSPI1_TX);
        dmaSetPriority(DMA_CH_MIBSPI_TX, DMA_PRIORITY_HIGH);
        dmaEnableInterrupt(DMA_CH_MIBSPI_TX, DMA_FTC); // Frame Transfer Complete interrupt
        dmaEnable(DMA_CH_MIBSPI_TX);
        
        // Configure MibSPI to trigger DMA when TX buffer is half empty
        mibspiREG1->INT0 |= (1 << 17); // Enable TX DMA request
    }

    --
    此致、
    Jagadish。

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

    Hijagadishgundavarapu 、感谢您的答复。我尝试根据您的建议、在多缓冲模式下配置 MibSPI 与 DMA、并且我附加了我的配置快照。 但是、DMA 传输仍然无法按预期工作。您能否查看配置并告诉我是否存在任何不匹配问题或是否漏掉了任何内容?

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

    尊敬的 Vasu:

    对延迟的回复表示歉意!

    【常见问题解答】TMS570LC4357:Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    请参阅下面上面链接中突出显示的示例、这些都是 TI 方面经过测试的示例。

    --
    此致、
    Jagadish。

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

     Jagadish gundavarapu 

     我有一个有效的解决方案使用软件分块模式、该模式以 8 个单独的块(每个块 128 个字)处理数据,并且效果很好 — 所有 1024 个字都可以正确地从 TXDATA 传输到 RXDATA。但是、当我尝试使用硬件帧链模式通过对所有 8 个帧进行单个 DMA 设置来更高效地完成此操作时、我只传输了前 128 个字。 RXDATA 的其余部分保持为零。 我尝试了各种 DMA 配置更改、但无法使帧链模式正常工作。 在帧链模式下、我将 DMA 设置为 8 个帧(每个帧 128 个字)、启用 MibSPI DMA 事件、让硬件自动处理链接。 但似乎只有第一个帧成功完成、后续的帧无法处理。是否有其他人在 TMS570LC43 上的 MibSPI 帧链 DMA 模式下遇到了此问题? 我是否缺少已知限制或特定配置? 我已附加我的主文件。 第二件事是当我尝试下载 1884.LS31x_DMA_Chaining.zip 代码时、我得到了“你没有查看这个目录或页面的权限“。 你能为我提供代码可能是我得到的解决方案(我得到了这个代码从 RM48 SPI2 使用 DMA )   thread.e2e.ti.com/.../2656.HL_5F00_sys_5F00_main.c

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

    尊敬的 Vasu:

    对延迟的回复表示歉意。

    我从未对 MibSPI 通道进行通道 DMA 链接。

    我做了 DMA 链接以进行存储器到存储器传输并进行了测试;下面是相应的示例:

    e2e.ti.com/.../2045.DMA_5F00_Channel_5F00_Chaining_5F00_Test_5F00_LS3137.zip

    --
    此致、
    Jagadish。