6637|2

15

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

UART使用EDMA3传输的问题 [复制链接]

 

#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).

最新回复

我最近也在弄串口,我用的是SEED—C6416板,我也想设置UART同步EDMA传输,可是配置后根本无法传输,想请教你关于UART的配置。我板子上说UART是用的EXT_INT4,不知道和你的是不一样。  详情 回复 发表于 2013-9-14 21:52

点评

我最近也在弄串口,我用的是SEED—C6416板,我也想设置UART同步EDMA传输,可是配置后根本无法传输,想请教你关于UART的配置。我板子上说UART是用的EXT_INT4,不知道和你的是不一样。  详情 回复 发表于 2013-9-14 21:52
点赞 关注
 

回复
举报

27

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
不知道楼主用的什么芯片,这两天我一直在看串口,学习DSP两个多月了感觉还飘在外面

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

希望可以一起交流
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 楼主georon 的帖子

我最近也在弄串口,我用的是SEED—C6416板,我也想设置UART同步EDMA传输,可是配置后根本无法传输,想请教你关于UART的配置。我板子上说UART是用的EXT_INT4,不知道和你的是不一样。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表