MSP430FR6047: 我想利用DMA将串口数据发出,但每次只能发送出第一个数据和最后一个数据。

Part Number: MSP430FR6047

  • 您好,

    已经收到了您的案例,调查需要些时间,感谢您的耐心等待

  • 您好

    DMATSEL__UCA0TXIFG的定义是什么,从名称上应该是UCA0 TX触发器,只是想仔细检查一下定义。

    我在用户指南中发现了一个提示,即使用DMA进行传输时无法设置UCA TXIE。请确保您没有在其他地方启用此中断

    dma+UART配置可以参考SDK示例“dma_ex2_repeatedBlockUART”,您可以参考它并比较详细配置。

  • 我并未在其它地方将此中断启用,是想江发送标志作为触发源,#define DMA1TSEL__UCA0TXIFG              DMA1TSEL_15  #define DMA1TSEL_15                      (0x0f00)        /* DMA1TRIG15 */

  • 您好

    DMA触发源看起来定义得很好。

    当我将您的代码与SDK示例dma_ex2_repeatedBlockUART进行比较时,我发现示例中使用了“重复单个”模式。在单模式下,每次触发UART TX信号时,只有一个字节会被移动到UART传输缓冲区。你可以尝试“重复单次”模式。并附上我所指的例子:

  • 我看到示例中将启动触发均放入了看门狗中断,此举的意义是什么?按原理来讲,我设置好触发源之后,启动传输应该按照我设置的触发源去触发的呀

  • 您好

    您指的是 DMA_startTransfer() API 吗?它可以在启用 DMA 传输后立即放置。实际上,我看不到您提到的看门狗中断,我们指的是同一个示例吗?

    请问如果将 DMA transferModeSelect 设置为 “重复单次”模式,它是否有效?

  • 实际上不知道为什么 我在网页上看不到您发的图片

  • 我确认了我的问题点,是因为触发源没有改变导致,我查看芯片手册UCA0TXIFG触发源,芯片里对于这个寄存器位的描述为UCTXIFG is set when UCAxTXBUF empty,即当发送寄存器为空时置位,我配置为上升沿触发,我直接启动DMA不会将此标志位变更为1导致

  • 您好

    此UCTXIFG位不需要手动设置。我们需要做的是启用并启动DMA,DMA将等待触发器将数据从源地址移动到目标地址。对于UART通信,当我们开始UART传输时,在UART TXFIFO中的所有数据传输完毕后,TXFIFO变空。在这种情况下,应该设置UCTXIFG位来触发DMA传输。

    因此,我们需要检查UART数据是否已开始传输,UART TXFIFO是否为空,以及之后是否设置了UCTXIFG位。

  • 我理解您的意思,但是经过我调试发现,UCTXIFG上电后为1,而我配置的DMA选择的是上升沿触发,所以在我需要进行串口数据发送时,我打开了DMA的使能,同时将模块地址发送了除去,这样才能使UCTXIFG产生类似脉冲的信号,将我所需要发送的数据全部发送出去

            RS485_CTRL_SE();  // 使能发送
            bsp_delay_us(1);
            DMA_setTransferSize(RS485_DMA_CHANNEL, txLength - 1);  // 去除模块地址
            DMA_enableTransfers(DMA_CHANNEL_0);  // 使能DMA传输
            EUSCI_A_UART_transmitData(RS485_UART, txBuffer[0]);  // 发送模块地址,并触发DMA传输
    我将发送缓冲区txBuffer[1]作为了DMA的传输源地址,像这样我才能完美实现我想要的不定长数据的DMA串口传输功能