#define UART_TX_NUM 1 #define UART_RX_NUM 1
memset(rx_buf,0,sizeof(rx_buf)); memset(c_rx,0,sizeof(c_rx)); memset(tx_buf,0,sizeof(tx_buf));
EDMA3ccRegs->DRA[1].DRAE = (1<<12) |(1<<13);
EDMA3ccRegs->DMAQNUM[1] = 0x00110000 ;
//接收
EDMA3ccRegs->PARAMSET[12].OPT = 0x0010C000; EDMA3ccRegs->PARAMSET[12].SRC = (Uint32)(&(Uart2Regs->RBR)); EDMA3ccRegs->PARAMSET[12].A_B_CNT = _pack2(UART_RX_NUM, 1); EDMA3ccRegs->PARAMSET[12].DST = (Uint32)rx_buf; EDMA3ccRegs->PARAMSET[12].SRC_DST_BIDX = _pack2(1, 0); linkAddr = (Uint16)&(EDMA3ccRegs->PARAMSET[124]); EDMA3ccRegs->PARAMSET[12].LINK_BCNTRLD = _pack2(UART_RX_NUM, linkAddr); EDMA3ccRegs->PARAMSET[12].SRC_DST_CIDX = _pack2(0, 0); EDMA3ccRegs->PARAMSET[12].CCNT = 1;
EDMA3ccRegs->PARAMSET[124].OPT = 0x0010C000; EDMA3ccRegs->PARAMSET[124].SRC = (Uint32)(&(Uart2Regs->RBR)); EDMA3ccRegs->PARAMSET[124].A_B_CNT = _pack2(UART_RX_NUM, 1); EDMA3ccRegs->PARAMSET[124].DST = (Uint32)rx_buf; EDMA3ccRegs->PARAMSET[124].SRC_DST_BIDX = _pack2(1, 0); linkAddr = (Uint16)&(EDMA3ccRegs->PARAMSET[124]); EDMA3ccRegs->PARAMSET[124].LINK_BCNTRLD = _pack2(UART_RX_NUM, linkAddr); EDMA3ccRegs->PARAMSET[124].SRC_DST_CIDX = _pack2(0, 0); EDMA3ccRegs->PARAMSET[124].CCNT = 1;
//发送
EDMA3ccRegs->PARAMSET[13].OPT = 0x0010D000; EDMA3ccRegs->PARAMSET[13].SRC = (Uint32)tx_buf; EDMA3ccRegs->PARAMSET[13].A_B_CNT = _pack2(UART_TX_NUM, 1); EDMA3ccRegs->PARAMSET[13].DST = (Uint32)(&(Uart2Regs->THR)); EDMA3ccRegs->PARAMSET[13].SRC_DST_BIDX = _pack2(0, 1); linkAddr =0xFFFF; EDMA3ccRegs->PARAMSET[13].LINK_BCNTRLD = _pack2(0, linkAddr); EDMA3ccRegs->PARAMSET[13].SRC_DST_CIDX = _pack2(0, 0); EDMA3ccRegs->PARAMSET[13].CCNT = 1;
现在有2个问题:
1.接收部分:一次发送一个字符过来可以正常接收,发送一连串字符过来就只能复制到第一个字符。复制是在EDMA中断中处理的。
c = rx_buf[0];//edma接收到的字符 strcat(c_rx,&c);//复制到c_rx缓冲中。按理说发几个字符就产生几次中断,这是没问题的。发送abcd,复制过来的全是aaaa,这是怎么回事呢?
2.发送部分:我不知道怎么触发。现在不能像平常一样操作uart THR寄存器吧,那相当于没有使用edma.可是往tx_buf里写数据没任何反应。看UART DMA触发部分文档说传输FIFO是空的时候就产生UTXEVT事件,怎么进行清除啊。传输FIFO就是THR寄存器,写FCR控制寄存器清除发送FIFO时没一点反应。
有没有做过UART使用DMA的啊,指点一下啊。非常感谢。下面是文档内容:
Transmit event (UTXEVT): When the transmitter FIFO is empty (when the last byte in the transmitter FIFO has been copied to the transmitter shift register), the UART sends an UTXEVT signal to the EDMA controller. In response, the EDMA controller refills the transmitter FIFO by way of the transmitter holding register (THR). The UTXEVT signal is also sent to the DMA controller when the UART is taken out of reset using the UTRST bit in the power and emulation management register (PWREMU_MGMT).
|