微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > 学习官方uart dma例程的一点疑问

学习官方uart dma例程的一点疑问

时间:10-02 整理:3721RD 点击:

在学习uart dma的时候,想让它一直收发,可是如果不把UDMASetupTransfer放在while(1)里面,就会一直回显停不下来,为什么每次运行都要UDMASetupTransfer才能正常呢?  可以只配置一次,来实现一直收发么?

主函数

while(1){
	bRxDone = false;

    //
    // Setup DMA transfer for UART A0
    //
    UDMASetupTransfer(UDMA_CH8_UARTA0_RX,
                      UDMA_MODE_BASIC,
                      8,
                      UDMA_SIZE_8,
                      UDMA_ARB_2,
                      (void *)(UARTA0_BASE+UART_O_DR),
                      UDMA_SRC_INC_NONE,
                      (void *)ucTextBuff,
                      UDMA_DST_INC_8);

    //
    // Enable Rx DMA request from UART
    //
    MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_RX);

    //
    // Wait for RX to complete
    //
    while(!bRxDone)
    {

    }

    //
    // Setup DMA transfer for UART A0
    //
    UDMASetupTransfer(UDMA_CH9_UARTA0_TX,
                      UDMA_MODE_BASIC,
                      8,
                      UDMA_SIZE_8,
                      UDMA_ARB_2,
                      (void *)ucTextBuff,
                      UDMA_SRC_INC_8,
                      (void *)(UARTA0_BASE+UART_O_DR),
                      UDMA_DST_INC_NONE);

    //
    // Enable TX DMA request
    //
    MAP_UARTDMAEnable(UARTA0_BASE,UART_DMA_TX);
}

中断函数:

static void UARTIntHandler()
{
    //
    // Check if RX
    //
    if(!bRxDone)
    {
	//
	// Disable UART RX DMA
	//
        MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_RX);

	//
	// Siganl RX done
	//
        bRxDone = true;
    }
    else
    {
	//
	// Disable UART TX DMA
	//
        MAP_UARTDMADisable(UARTA0_BASE,UART_DMA_TX);
    }

    //
    // Clear the UART Interrupt
    //
    MAP_UARTIntClear(UARTA0_BASE,UART_INT_DMATX|UART_INT_DMARX);
}

还有一个问题就是中断函数里面的else为什么没有触发过? 不是在数据传输完毕之后触发么?

感谢解答!

建议参考uart_dma的例程测试,同时关于uDMA的一些简单解释

DMA传输模式

基本模式用于外设和存储器之间DMA传输;自动模式用于存储器和存储器之间软件DMA传输;

乒乓模式用于外设和存储器之间的连续DMA传输,乒乓模式需要主和备用两个通道控制,

系统使用主和备用两个通道控制交替进行DMA传输;

分集模式包括存储和外设分集模式,分集模式将两个及两个以上数据块利用DMA传输到一个数据块或外设

//*****************************************************************************

#define UDMA_MODE_STOP          0x00000000

#define UDMA_MODE_BASIC         0x00000001

#define UDMA_MODE_AUTO          0x00000002

#define UDMA_MODE_PINGPONG      0x00000003

#define UDMA_MODE_MEM_SCATTER_GATHER                                          \

                                0x00000004

#define UDMA_MODE_PER_SCATTER_GATHER                                          \

                                0x00000006

#define UDMA_MODE_ALT_SELECT    0x00000001

这个就是基于uart dma的例程 几乎没有变动,只是加了一个while(1)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top