找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[BSP] PDMA 每次传送都要重新设定吗?

[复制链接]
跳转到指定楼层
楼主
keyway 发表于 2023-12-19 00:20:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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);



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

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

回复 支持 反对

使用道具 举报

板凳
 楼主| keyway 发表于 2023-12-19 20:53:15 | 只看该作者
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:51 | 只看该作者
例程是写的memory to memory之间传输。需要和谁传输就改成和谁传输(芯片支持的类型就行),再填好传输相应的源地址和目标地址即可。




回复 支持 反对

使用道具 举报

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


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

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


这部分该如何操作?

请问一下 例如修改成 PDMA_UART0_TX;
回复 支持 反对

使用道具

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

如何操作,上一次回复里已经截图告诉你了
回复 支持 反对

使用道具 举报

7#
chrishu 发表于 2023-12-21 13:47:40 | 只看该作者
下图是在M487上写的一个应用,通过PDMA的集散模式(两张表)循环将一个数组的数据搬运到UART1的TX.你要用到M031上时注意看一下外设寄存器名字是否一致。



回复 支持 反对

使用道具 举报

8#
匿名  发表于 2023-12-22 09:06:20
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里面?
回复 支持 反对

使用道具

9#
chrishu 发表于 2023-12-22 17:51:23 | 只看该作者
请问一下DMA_DESC对应的结构体是你自己定义的吗?你的next是对应我们例程里的offset吗?
没有看到你的整体配置,从else里看到的是这样表设置的基本模模式,传完就PDMA就停止了。
例程UART_PDMA用的基本模式,所以会重复启动

你可以看一下前面的回复,再结合TRM手册里的详细描述,再去看例程里基本模式和集散模式的配置和使用,可能会更明白一些。
回复 支持 反对

使用道具 举报

10#
匿名  发表于 2023-12-22 18:27:19
chrishu 发表于 2023-12-22 17:51
请问一下DMA_DESC对应的结构体是你自己定义的吗?你的next是对应我们例程里的offset吗?
没有看到你的整体 ...

DMA_DESC 是M460系列的 pdma reg 寄存器里面的啊!
回复 支持 反对

使用道具

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU