DMA到UART只传输第一个字节

时间:2016-01-23 10:26:23

标签: msp430 dma

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

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

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我把它作为布尔波动,并在tx完成后重置。

1 个答案:

答案 0 :(得分:0)

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

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才能真正通过缓冲区。