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.

[参考译文] TMS570LS1224:在 MibSpi 模式下查找用于将长 DMA 传输到单个缓冲器的示例代码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1326888/tms570ls1224-looking-for-example-code-for-long-dma-transfers-to-single-buffer-in-mibspi-mode

器件型号:TMS570LS1224

尊敬的 e2e 论坛:

我已经成功地在经典模式下使用了 SPI5与 DMA、通过使用 DMA 控制器直接写入/读取 DAT1/BUF 寄存器来驱动 SPI 传输。 我准备"原始"传输、将 DAT1寄存器的全部32位写入数据、这样我就可以包含控制标志来操作 CSHOLD 和 WDEL。 该技术已经在该论坛中介绍过、对于在一次大的 DMA 传输中执行多个 SPI 事务非常有用。

现在我需要再添加一个 SCI、发现 不幸的是、它与 SPI5经典(确切地说是 DMAREQ [30]和[31])共享了其 DMA 请求行。

作为权变措施、 我尝试在 SPI5上启用 MIB 模式、并使用 RXDMA_MAP / TXDMA_MAP 重新映射 DMA 请求行。 但到目前为止、我的传输在第一个字节被传输后会停止;我认为我有一个无效的单触发、ICOUNT 和 RXDMAENA 位组合、如果我能将我的设置与一个有效的示例进行比较会很有帮助。

我找到了一个看起来非常接近我所需要的相关示例:只使用一个 mibRAM 缓冲区配置单个传输组、然后使用 DMA 驱动长传输。

通过两个任务触发具有 DMA 的 MIBSPI -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛。  

遗憾的是、该线程中的 zip 文件不再可用。

您是否知道任何公开的类似示例?

非常感谢、此致、

托马斯

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

    尊敬的 Thomas:

    您可以参考以下主题吗?

    (+)[常见问题解答] TMS570LS3137:具有 DMA 的 TMS570LS3137 MibSPI5 Tx 和 Rx -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    我希望这将有助于解决您的问题。

    --
    谢谢。此致、
    Jagadish。

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

    尊敬的 Jagadish:

    感谢 链接。 很遗憾、此线程有同样的问题、我也无法下载这些文件。

    我尝试过 Chrome、Firefox 和 Edge、结果相同:您无权查看此目录或页面。 我有

    有什么想法、接下来我会尝试什么?

    谢谢、此致、

    托马斯

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

    尊敬的 Thomas:

    您能否压缩项目并附上它。 我将对其进行验证和调试、以便在结束时找出问题的根本原因。

    --
    谢谢。此致、
    Jagadish。

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

    尊敬的 e2e 论坛: 尊敬的 Jagadish:  

    由于保密协议的原因、我无法共享代码。

    我的问题是、当使用 DMA 来驱动一个由单节电池组成的传输组时、单触发位的正确配置引起了混乱。  如果在 TGCTRL[]中启用了单触发器,则只会发生传输的第一个字节;如果 在 DMACTRL[]中启用了单触发器[],则会发生传输,但最后一个字节会无限期重复,有时某些字会重复。 这些位的任何可能组合都会导致错误的结果。 技术参考手册中关于此类设置的工作原理不清楚、我在网上找不到任何有关此问题的示例代码或任何应用手册。

    缺少的见解是、这也要求 MibRAM 控制字中的 BUFMODE 标志设置为跳跃或暂停模式、因此仅在 DMA 引擎更新电芯时才会触发 SPI 传输。

    作为参考(以及其他论坛用户)、这是适用于我的配置:

    /* configure first transfer group for a size of one cell */
    TGCTRL[0] = (0U << 30U)            /* disable one-shot for transfer-group, we will drive this from DMA */
              | (0U << 29U)            /* pcurrent reset disabled */
              | (TRG_ALWAYS << 20U)    /* trigger event: always for software trigger */
              | (TRG_DISABLED << 16U)  /* trigger source: disabled */
              | (0U << 8U);            /* start address is first RAM cell */
            
    /* configure all other transfer groups for zero size */
    for (i = 1; i < 8U; i++)  
    TGCTRL[i] = (0U << 30U)            /* disable one-shot for transfer-group, we will drive this from DMA */
              | (0U << 29U)            /* pcurrent reset disabled */
              | (TRG_ALWAYS << 20U)    /* trigger event: always for software trigger */
              | (TRG_DISABLED << 16U)  /* trigger source: disabled */
              | (1U << 8U);            /* start address is second RAM cell */
    
    TGCTRL[8] = (uint32_t)((uint32_t)1U << 8U);
    LTGPEND = (LTGPEND & 0xFFFF00FFU); /* end is first cell */
    
    /* initialize the first RAM cell */
    mibRAM.tx[0].control = (3U << 13U)  /* buffer mode "Skip Single-Transfer overwrite-protect" to keep sequencer in sync with DMA */
                         | (0U << 12U)  /* chip select hold */
                         | (0U << 10U)  /* enable WDELAY */
                         | (0U << 11U)  /* lock transmission */
                         | (0U << 8U)   /* data format */
                         | (0xFE);      /* chip select CS_0 */
                         
    /* disable the other cells */
    for (i = 1U; i < 128U; i++) mibRAM->tx[i].control = 0U; /* cell disabled */
    
    /* setup the DMA for Transfer Group 0 */
    DMACTRL[0] = (1U < 31U)                 /* enable one-shot mode for DMA */
               | (receive_reqline << 20U)   /* rx internal request line */
               | (transmit_reqline << 16U); /* tx internal request line */
    
    /* switch to DMA large_count mode */
    DMACNTLEN = 0x1U;
    
    /* start transfer group */
    TGCTRL[0] |= (1U << 31U);

    要 开始传输、请执行以下操作:

    /* setup frame count */
    DMACOUNT[0]  = ((transfer_length - 1U) << 16U);                     
    
    /* enable TX & RX DMA bits, this starts the transfer */
    DMACTRL[0]  |= (uint32_t)0x0000C000;    

    据我所知、这里需要 BUFMODE=3h 来保持 DMA 和 MIB 序列发生器同步。

    谢谢、此致、

    托马斯