[Kinetis] K21 UART DMA TX出现重复发送现象

[复制链接]
molave20a 发表于 2015-2-27 16:25 | 显示全部楼层 |阅读模式
DMA, UART, tc, CD, TE
本帖最后由 molave20a 于 2015-2-27 16:28 编辑

手上一个项目使用K21和GSM模块通过UART DMA通讯,发现UART DMA TX有重复发送现象(概率不大),即发送20byte,实际发送了40byte(前面20byte数据正常,后面是RAM中随后的20byte)。程序在STM32上跑的好好的,应该不是逻辑问题。代码如下:
配置
=============
  1.         UART1->C2 |=(UART_C2_TE_MASK|UART_C2_RE_MASK| UART_C2_TIE_MASK| UART_C2_RIE_MASK  );
  2.         UART1->C5 |=(UART_C5_RDMAS_MASK|UART_C5_TDMAS_MASK);
  3.         SIM->SCGC6|=SIM_SCGC6_DMAMUX_MASK;
  4.         SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;
  5.         //Enable DMA Channel0 for UART1_TX        
  6.         DMAMUX->CHCFG[0] = DMAMUX_CHCFG_SOURCE(DMA_SOURCE_CHANNEL_TX);
  7.         DMA0->TCD[0].SOFF =1 ;
  8.         DMA0->TCD[0].NBYTES_MLNO =DMA_NBYTES_MLNO_NBYTES(1);
  9.         DMA0->TCD[0].SLAST =0 ;
  10.         DMA0->TCD[0].DADDR =(uint32_t)&(UART1->D);
  11.         DMA0->TCD[0].DOFF =0 ;
  12.         DMA0->TCD[0].ATTR =DMA_ATTR_SSIZE(0)+DMA_ATTR_DSIZE(0);
  13.         DMA0->TCD[0].DLAST_SGA=0;
  14.         DMA0->TCD[0].CSR = 0;
  15.         DMA0->TCD[0].CSR|=DMA_CSR_INTMAJOR_MASK;
  16.         DMA0->TCD[0].CSR|=DMA_CSR_DREQ_MASK;
  17.         DMAMUX->CHCFG[0] |=DMAMUX_CHCFG_ENBL_MASK;
  18.         NVIC_Init(DMA0_IRQn,NVIC_PriorityGroup_1,0,0);
  19.         NVIC_EnableIRQ(DMA0_IRQn);

============================
DMA发送:
  1. void DMA_SendData(uint8_t *ptr,uint16_t len)
  2. {
  3.         DMA0->TCD[0].SADDR = (uint32_t)ptr;
  4.         DMA0->TCD[0].CITER_ELINKNO = len;
  5.         DMA0->TCD[0].BITER_ELINKNO = len;
  6.         DMA0->ERQ |= DMA_ERQ_ERQ0_MASK;
  7. }
ccw1986 发表于 2015-2-28 08:44 | 显示全部楼层
谢谢分享
FSL_TICS_Jeremy 发表于 2015-2-28 09:29 | 显示全部楼层
从你的代码上看,应该是正确的,你在帖子中说发生概率不高,
也就说一般都是能正常发送数据的,你有没有发现错误发生现象发生的规律呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部