【问题标题】:DMA to UART transmits only the first byteDMA 到 UART 只传输第一个字节
【发布时间】:2016-01-23 10:26:23
【问题描述】:

我正在开发 MSP430 系列控制器,我有一个缓冲区要通过 DMA 在 UART 上发送。

我正在粘贴我的 DMA 配置和代码 sn-p 以获取更多信息。

DMACTL0 = DMA0TSEL__UCA0TXIFG;
DMA0SA  = &buff;
DMA0DA  = &UCA0TXBUF; 
DMA0SZ  = 64;                      // Block size in bytes
DMA0CTL = DMADT_1 | DMASBDB| DMASRCINCR_1 | DMAIE| DMALEVEL_L; // Rpt, inc
DMA0CTL|= DMAEN;

我正在填写如下数据。

   char buff[64];
   buff[0] = 0x64;
   buff[1] = 0x23;
   buff[2] = 0x65;
   buff[3] = 0x31;

当我启动 DMA 传输时,缓冲区得到了传输,但是当我在终端上检查时,它只显示第一个值 '0x64',而不是其他值。我正在进行块传输,所以在 dma 启动时应该传输整个块。 在中断路由中,我正在重置 dma 标志。

我的中断处理程序。

 __interrupt void DMA_VECTOR_ISR(void)
 {
     DMA0CTL &= ~DMAIFG;
     DMA_Doneflag = 1;
 }

我将这个 DMA_Doneflag 视为布尔型 volatile,并在 tx 完成时重置。

【问题讨论】:

    标签: msp430 dma


    【解决方案1】:

    块传输确实复制了整个块;它相当于以下内容:

    while (!(UCA0IFG & UCTXIFG)) {}  // wait for trigger
    for (i = 0; i < 64; i++)
        UCA0TXBUF = buf[i];
    

    这不是你真正想要的。需要在每个单字节之前等待触发:

    for (i = 0; i < 64; i++) {
        while (!(UCA0IFG & UCTXIFG)) {}
        UCA0TXBUF = buf[i];
    }
    

    这可以通过重复单次传输模式(DMADT_4)来完成。

    您需要DMASRCINCR_3 才能真正通过缓冲区。

    【讨论】:

    • 嗨@CL。 ,感谢您的回复,是的,我已经尝试过那个位,并且我在缓冲区中分配的 4 个字节正在运行,但是,在传输大小后,它停止了,并且我希望传输持续运行,请您指导我进入这个。
    • 你知道你在问题的最后一句中写了什么吗?
    • 请让我清楚,您建议的更改工作正常。但是在终端上我只能看到缓冲区的第一个字节反复出现。缓冲区中的其他数据不传输。为此,我尝试使用DMASRCINCR_3(source inc.),但是过了一段时间,传输停止了。再一次,我必须重置控制器才能开始传输。在我的 dma isr 中,我正在做DMA0CTL &amp;= ~DMAIFG (触发后反转标志)。我在这里弄错了吗?
    • 编辑您的问题以显示中断处理程序。并指定“某个时间”。
    • "some time" 就像在 7 或 8 传输后它停止了。
    猜你喜欢
    • 2019-04-26
    • 2021-10-24
    • 1970-01-01
    • 2022-08-17
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多