#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).
此帖出自
小平头技术问答
楼主的FIFO有多大呢?触发水平设的是多少?
我用的752B 64K的FIFO,16个字符或16个内存单元的触发水平;也就每次只能传送一个数据了,看了芯片资料确实有块DMA1传输,但是没用过,只用DMA0传输方式。
希望可以一起交流
一周热门 更多>