牛卧堂MCU技术交流

标题: PDMA 每次传送都要重新设定吗? [打印本页]

作者: keyway    时间: 2023-12-19 00:20
标题: PDMA 每次传送都要重新设定吗?
Nuvoton 范例

M031_Series_BSP_CMSIS_V3.05.000
SPI_PDMA_LoopTest

main()

.......已经宣告 PDMA

    /*=======================================================================
      SPI master PDMA TX channel configuration:
      -----------------------------------------------------------------------
        Word length = 32 bits
        Transfer Count = DATA_COUNT
        Source = g_au32MasterToSlaveTestPattern
        Source Address = Incresing
        Destination = SPI0->TX
        Destination Address = Fixed
        Burst Type = Single Transfer
    =========================================================================*/
但是Re-trigger又重新宣告PDMA及SPI输出入等驱动???????

                    /* Re-trigger */
                    /* Master PDMA TX channel configuration */
                    /* Set transfer width (32 bits) and transfer count */
                    PDMA_SetTransferCnt(PDMA, SPI_MASTER_TX_DMA_CH, PDMA_WIDTH_32, DATA_COUNT);
                    /* Set request source; set basic mode. */
                    PDMA_SetTransferMode(PDMA, SPI_MASTER_TX_DMA_CH, PDMA_SPI0_TX, FALSE, 0);

                    /* Master PDMA RX channel configuration */
                    /* Set transfer width (32 bits) and transfer count */
                    PDMA_SetTransferCnt(PDMA, SPI_MASTER_RX_DMA_CH, PDMA_WIDTH_32, DATA_COUNT);
                    /* Set request source; set basic mode. */
                    PDMA_SetTransferMode(PDMA, SPI_MASTER_RX_DMA_CH, PDMA_SPI0_RX, FALSE, 0);

                    /* Enable master's DMA transfer function */
                    SPI_TRIGGER_TX_PDMA(SPI0);
                    SPI_TRIGGER_RX_PDMA(SPI0);




作者: chrishu    时间: 2023-12-19 10:29
PDMA传输的操作模式分为基本模式和集散模式
基本模式就是按照描述符表里设置的传输规则将设定个数的数据搬运完成就结束了,会停止。
集散模式是按照第一张表的描述符搬运完指定数据后,会寻找第二张描述符表,按照第二张表的规则搬运,结束后会寻找下一张表,如果最后一张表指向的下一张表是第一张表。那么就可以实现循环搬运一直不停。
SPI_PDMA_LoopTest例程采用的是基本模式,如果想要使用集散模式可以参考PDMA_ScatterGather或PDMA_ScatterGather_PingPongBuffer例程


作者: keyway    时间: 2023-12-19 20:53
chrishu 发表于 2023-12-19 10:29
PDMA传输的操作模式分为基本模式和集散模式
基本模式就是按照描述符表里设置的传输规则将设定个数的数据搬 ...

谢谢说明
PingPongBuffer 是 transfer mode as memory to memory模式
我需求是memory to SPI 或SD card.

作者: chrishu    时间: 2023-12-20 10:56
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输相应的源地址和目标地址即可。





作者: 匿名    时间: 2023-12-21 11:20
chrishu 发表于 2023-12-20 10:56
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输相应 ...


例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输相应的源地址和目标地址即可。

这里的
  1. 再填好传输相应的源地址和目标地址即可。
复制代码


这部分该如何操作?

请问一下 例如修改成 PDMA_UART0_TX;

作者: chrishu    时间: 2023-12-21 13:23
游客 121.29.98.x 发表于 2023-12-21 11:20
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输 ...

如何操作,上一次回复里已经截图告诉你了
作者: chrishu    时间: 2023-12-21 13:47
下图是在M487上写的一个应用,通过PDMA的集散模式(两张表)循环将一个数组的数据搬运到UART1的TX.你要用到M031上时注意看一下外设寄存器名字是否一致。




作者: 匿名    时间: 2023-12-22 09:06
chrishu 发表于 2023-12-21 13:47
下图是在M487上写的一个应用,通过PDMA的集散模式(两张表)循环将一个数组的数据搬运到UART1的TX.你要用到M0 ...

    else
    {
        DMA_DESC[1].CTL = g_u32DMAConfig | PDMA_OP_BASIC;
        // DMA_DESC[1].CTL = g_u32DMAConfig | PDMA_OP_SCATTER;
        /* Configure source address */
        DMA_DESC[1].SA = (uint32_t)&tBuffer[TXBUFSIZE / 2] ; /* buffer 2 */
        /* Configure destination address */
        DMA_DESC[1].DA = (uint32_t)UART0_BASE;
        /* Configure next descriptor table address */
        //DMA_DESC[1].NEXT = (uint32_t)&DMA_DESC[0] - (PDMA->SCATBA); /* next operation table is table 2 */
                DMA_DESC[1].NEXT = 0; /* next operation table is table 1 */
    }

请问一下 DMA_DESC[1].NEXT 这里的写法 是用上面的 还是下面的好一些?
另外 这个配置 不需要每次都配置吧?只需要配置一次即可?
为何 TX 的例程 放到了loop里面?
作者: chrishu    时间: 2023-12-22 17:51
请问一下DMA_DESC对应的结构体是你自己定义的吗?你的next是对应我们例程里的offset吗?
没有看到你的整体配置,从else里看到的是这样表设置的基本模模式,传完就PDMA就停止了。
例程UART_PDMA用的基本模式,所以会重复启动

你可以看一下前面的回复,再结合TRM手册里的详细描述,再去看例程里基本模式和集散模式的配置和使用,可能会更明白一些。
作者: 匿名    时间: 2023-12-22 18:27
chrishu 发表于 2023-12-22 17:51
请问一下DMA_DESC对应的结构体是你自己定义的吗?你的next是对应我们例程里的offset吗?
没有看到你的整体 ...

DMA_DESC 是M460系列的 pdma reg 寄存器里面的啊!
作者: chrishu    时间: 2023-12-25 11:31
游客 183.198.2.x 发表于 2023-12-22 18:27
DMA_DESC 是M460系列的 pdma reg 寄存器里面的啊!

基本模式是直接设置的寄存器。集散模式是自己在内存里定义两张表,每次传完会将下一张表加载到寄存器里,示意图如下:

如之前回复所说,确定用集散模式就参考PDMA_ScatterGather_PingPongBuffer
你说例程是memory to memory的,需要memory 和外设传输,我有截图说明怎么去修改描述符表。

之后你又说不知道怎么操作 例如修改成 PDMA_UART0_TX。也有截图UART TX发送的描述符表如下图:
到此集散模式的描述符表配置已经完全ok了,直接到例程里这么改就可以测试了。






欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/) Powered by Discuz! X3.2