3471|2

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于TM4C123BE6P芯片UART0的uDMA接收不成功问题 [复制链接]

问题分析:
      当前,我先使用FIFO完成了UART0的接收与发送配置,现在,我需要将uDMA加入UART0中。根据例程,我开始尝试:
第一步 - 配置uDMA时钟使能
           SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
第二步 - 在UART0的配置中,将UART0_TX与UART0_RX加入uDMA中
           UARTDMAEnable(UART0_BASE, UART_DMA_RX | UART_DMA_TX);
第三步 - 使能uDMA控制器与指定控制列表地址(用户自定义值为Udma_Control_Table)
          uDMAEnable();
          uDMAControlBaseSet(Udma_Control_Table);
ps: 这里,我暂时不需要uDMA错误中断配置,所以,没有进行配置。
第四步 - 定义主发送缓冲区(Udma_Uart0_Xmit_Buf)和主接收缓冲区与备用接收缓冲区(Udma_Uart0_Recv_Buf_A,Udma_Uart0_Recv_Buf_B)
          uchar Udma_Uart0_Xmit_Buf[256] = {0x11};
          uchar Udma_Uart0_Recv_Buf_A[256] = {0x22};
          uchar Udma_Uart0_Recv_Buf_B[256] = {0x33};
第五步 - 配置三个通道,两个采用接收通道的控制参数(PINGPONG模式),一个发送通道的控制参数(BASIC模式);同时,配置他们的通道属性:
         // 接收通道
         uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT,
                                                         UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
                                                         UDMA_ARB_8);
          uDMAChannelControlSet(UDMA_CHANNEL_UART0RX | UDMA_ALT_SELECT,
                                                          UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
                                                          UDMA_ARB_8);
         uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0RX,
                                                                  UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                                                  UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
         uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0RX,
                                                                 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                                                 UDMA_ATTR_HIGH_PRIORITY);
        // 发送通道
        uDMAChannelControlSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT,
                                                       UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
                                                       UDMA_ARB_8);
       uDMAChannelAttributeDisable(UDMA_CHANNEL_UART0TX,
                                                                UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
                                                               UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
      uDMAChannelAttributeEnable(UDMA_CHANNEL_UART0TX,
                                                              UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY);
问题一:这里,有一点不明白,uDMAChannelControlSet库函数中的仲裁大小与UART0中的FIFO深度需要匹配,但是,在UART0中基数为16,假设我设置如下:
    UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8, UART_FIFO_RX4_8);
那触发点不是8个字节吗?同理,在uDMA中的仲裁大小不是也应该设置UDMA_ARB_8(我认为表示的是8个数目),而TI例程中用UDMA_ARB_4,不是很理解,帮忙解释下?

第六步 - 调用uDMAChannelTransferSet和uDMAChannelEnable函数发送数据
             uDMAChannelTransferSet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT,
                                                              UDMA_MODE_BASIC,
                                                              Udma_Uart0_Xmit_Buf, (void *)(UART0_BASE + UART_O_DR),
                                                              sizeof(Udma_Uart0_Xmit_Buf));
             uDMAChannelEnable(UDMA_CHANNEL_UART0TX);

以上操作步骤都实验完成。

问题二:但是,我现在想用uDMA接收数据。上位机通过串口TTL电平发送100个数据下来,进入我的UART0中断Uart0_IntHandle,但是,uDMAChannelModeGet函数在UART0中断获取到的值一直为3,也就是PINGPONG模式,并没有得到例程中的0(STOP),也就是接收一直不完成?不明白。
问题三:对于uDMAControlBaseSet函数,其中的地址是不是只是充当uDMA的临时寄存器,该值的大小,由发送与接收通道控制结构体大小有关系?
希望给予下回答,谢谢;

以下是中断函数代码,对于例程中的中断函数,采用回环控制,但是,数据接收只是单纯的uDMAChannelTransferSet,并没有配置使能接收通道uDMAChannelEnable(UDMA_CHANNEL_UART0RX)语句,这样不是表示该功能是禁止的吗,调用发送好像没有意义,而且这里的发送,我根据源地址与目的地址理解,是将UART0数据寄存器中读取数据,写入我新定义的uDMA接收缓冲地址中,不知道这样理解对吗?
  1. void Uart0_IntHandle(void)
  2. {
  3.     /* 中断状态反馈 */
  4.     uint32 ulIntState;
  5.     uint32 ulModeRx;
  6.     uint32 ulModeTx;

  7.     //! The \e ulIntState parameter is the logical OR of any of the following:
  8.     //!
  9.     //! - \b UART_INT_OE - Overrun Error interrupt
  10.     //! - \b UART_INT_BE - Break Error interrupt
  11.     //! - \b UART_INT_PE - Parity Error interrupt
  12.     //! - \b UART_INT_FE - Framing Error interrupt
  13.     //! - \b UART_INT_RT - Receive Timeout interrupt
  14.     //! - \b UART_INT_RX - Receive interrupt
  15.     ulIntState = UARTIntStatus(UART0_BASE, TRUE);

  16.     /* Clear the interrupt flag */
  17.     UARTIntClear(UART0_BASE, ulIntState);
  18.    
  19.     /* Check the DMA control table to see if the ping-pong "A" transfer is
  20.        complete.  The "A" transfer uses receive buffer "A", and the primary
  21.        control structure. */
  22.     ulModeRx = uDMAChannelModeGet(UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT);
  23.    
  24.     ulModeTx = uDMAChannelModeGet(UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT);

  25.     /* 检查当前中断状态,做出对应的处理方式 */
  26.     switch (ulIntState)
  27.     {
  28.         case UART_INT_RX:
  29.             {
  30.                 Uart0_Recv_IntHandle();
  31.             }
  32.             break;
  33.         case UART_INT_RT:
  34.             {
  35.                
  36.             }
  37.             break;
  38.         case UART_INT_OE:
  39.             {
  40.                
  41.             }
  42.             break;
  43.         case UART_INT_BE:
  44.             {
  45.                
  46.             }
  47.             break;
  48.         case UART_INT_PE:
  49.             {
  50.                
  51.             }
  52.             break;
  53.         case UART_INT_FE:
  54.             {
  55.                
  56.             }
  57.             break;
  58.         default: break;
  59.     }
  60. }
复制代码
如果有什么相关资料可以参考,希望发份资料看看,争取把uDMA搞完。

最新回复

不好意思,我给水军丢脸了,我也搞不定。  详情 回复 发表于 2015-10-28 10:27
 
点赞 关注

回复
举报

1万

帖子

203

TA的资源

管理员

沙发
 
问题现在解决了么?不懂哦,只能给你帮顶下拉~~给你@几位大侠出来看看,希望有谁能给你解决疑问~
@chenzhufly
@lcofjp
@辛昕
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

不好意思,我给水军丢脸了,我也搞不定。  详情 回复 发表于 2015-10-28 10:27
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 

回复

6040

帖子

195

TA的资源

版主

板凳
 
okhxyyo 发表于 2015-10-28 08:44
问题现在解决了么?不懂哦,只能给你帮顶下拉~~给你@几位大侠出来看看,希望有谁能给你解决疑问~
@chenzhu ...

不好意思,我给水军丢脸了,我也搞不定。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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