TI中文支持网
TI专业的中文技术问题搜集分享网站

串口dma接收

您好:

        请问为什么我在使用串口dma接收数据的过程中,定义了4K的一个缓冲区,分为a和b两个区域作为ping-pong区,但是每次都发现dma从a+1024和b+1024的地址开始存数据,而且每1024个字节就进一次中断。谢谢。程序代码如下:

static void usart1_rx_dma_cfg(uint8_t *ping, uint8_t *pong, uint32_t size)

{

ROM_UARTFIFOLevelSet(UART1_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);

//enable the uDMA interface for RX channels.
ROM_UARTDMAEnable(UART1_BASE, UART_DMA_RX);

// Put the attributes in a known state for the uDMA UART1RX channel. These
// should already be disabled by default.
ROM_uDMAChannelAttributeDisable(UDMA_CHANNEL_UART1RX,
       UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
       UDMA_ATTR_HIGH_PRIORITY |
       UDMA_ATTR_REQMASK);

ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT,
     UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
     UDMA_ARB_4);

ROM_uDMAChannelControlSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT,
      UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
      UDMA_ARB_4);

ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT,
         UDMA_MODE_PINGPONG,
         (void *)(UART1_BASE + UART_O_DR),
          ping, size);

// Set up the transfer parameters for the UART RX alternate control
// structure. The mode is set to ping-pong, the transfer source is the
// UART data register, and the destination is the receive "B" buffer. The
// transfer size is set to match the size of the buffer.
ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT,
      UDMA_MODE_PINGPONG,
      (void *)(UART1_BASE + UART_O_DR),
      pong, size);

// Now the uDMA UART RX channels are primed to start a
// transfer. As soon as the channels are enabled, the peripheral will
// issue a transfer request and the data transfers will begin.
ROM_uDMAChannelEnable(UDMA_CHANNEL_UART1RX);

// Enable the UART DMA RX interrupts.
 ROM_UARTIntEnable(UART1_BASE, UART_INT_DMARX);

}

中断函数如下:

uDMAmode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT);

if(uDMAmode == UDMA_MODE_STOP)
{
   g_app.dma.buffHalf = 1;
   recv_app_code_time_clear();
   g_recvState = RECV_CODE;

   ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_PRI_SELECT,
                UDMA_MODE_PINGPONG,
                (void *)(UART1_BASE + UART_O_DR),
                g_app.dma.buff, APP_MDA_BUF_HALF_SIZE);
}

uDMAmode = ROM_uDMAChannelModeGet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT);

if(uDMAmode == UDMA_MODE_STOP)
{
   g_app.dma.buffFull = 1;
   recv_app_code_time_clear();
   g_recvState = RECV_CODE;

   ROM_uDMAChannelTransferSet(UDMA_CHANNEL_UART1RX | UDMA_ALT_SELECT,
   UDMA_MODE_PINGPONG,
   (void *)(UART1_BASE + UART_O_DR),
   &g_app.dma.buff[APP_MDA_BUF_HALF_SIZE], APP_MDA_BUF_HALF_SIZE);
}
以上程序定义的这个g_app.dma.buff[APP_MDA_BUF_SIZE]是4k的一个缓冲区,
程序里面APP_MDA_BUF_HALF_SIZE = APP_MDA_BUF_SIZE/2即将一个连续的4K缓冲区分为两个2k做ping-pong区。
现出现以下问题:
每次接收数据DMA往缓冲区里面存都是从g_app.dma.buff+1024的地址处和g_app.dma.buff[APP_MDA_BUF_HALF_SIZE+1024]地址处开存1K;
MDA只在以上描述的这两个地址处开始版数据,即MDA每次都是从ping区首地址+1024的内存处开始放数据。pong区也是从首地址+1024的地址开始放数据。且没有数据丢失。
请问这是什么原因造成的。为什么MDA把两个缓冲区的前面1k内存不用。

user5208020:

以上程序定义的这个g_app.dma.buff[APP_MDA_BUF_SIZE]是4k的一个缓冲区,程序里面APP_MDA_BUF_HALF_SIZE = APP_MDA_BUF_SIZE/2即将一个连续的4K缓冲区分为两个2k做ping-pong区。现出现以下问题:每次接收数据DMA往缓冲区里面存都是从g_app.dma.buff+1024的地址处和g_app.dma.buff[APP_MDA_BUF_HALF_SIZE+1024]地址处开存1K;MDA只在以上描述的这两个地址处开始版数据,即MDA每次都是从ping区首地址+1024的内存处开始放数据。pong区也是从首地址+1024的地址开始放数据。且没有数据丢失。请问这是什么原因造成的。为什么MDA把两个缓冲区的前面1k内存不用。

赞(0)
未经允许不得转载:TI中文支持网 » 串口dma接收
分享到: 更多 (0)