UART使用EDMA3传输的问题

2019-03-26 16:10发布

  #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). 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
cyq1245
1楼-- · 2019-03-26 23:36
< 不知道楼主用的什么芯片,这两天我一直在看串口,学习DSP两个多月了感觉还飘在外面

楼主的FIFO有多大呢?触发水平设的是多少?
我用的752B 64K的FIFO,16个字符或16个内存单元的触发水平;也就每次只能传送一个数据了,看了芯片资料确实有块DMA1传输,但是没用过,只用DMA0传输方式。

希望可以一起交流
杜小许
2楼-- · 2019-03-27 02:48
< 我最近也在弄串口,我用的是SEED—C6416板,我也想设置UART同步EDMA传输,可是配置后根本无法传输,想请教你关于UART的配置。我板子上说UART是用的EXT_INT4,不知道和你的是不一样。

一周热门 更多>