打印

关于DMA方式发送串口数据,232的,出现了很致命的问题

[复制链接]
4484|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
andyxyrong|  楼主 | 2012-2-15 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有在用DMA方式串口发数据的时候出错的吗?比如说我发N个数据,但是接受了几万次以后,会出现错误
比如发送的是
01 02 03 04 05 06 07 08 ,
但是会出现串口收到的是
08 03 04 05 06 07 ,
这种错误有遇到过的吗?
沙发
andyxyrong|  楼主 | 2012-2-15 10:42 | 只看该作者
请教一下版主啊

使用特权

评论回复
板凳
香水城| | 2012-2-15 11:07 | 只看该作者
请教一下版主啊
andyxyrong 发表于 2012-2-15 10:42


没遇到过。

使用特权

评论回复
地板
gxgclg| | 2012-2-15 11:16 | 只看该作者
这个真没遇到过

使用特权

评论回复
5
andyxyrong|  楼主 | 2012-2-15 11:21 | 只看该作者
crcresult = getCRC16(TxBuffer,Uart4_TX_counter);
  TxBuffer[Uart4_TX_counter] =  crcresult & 0xff;
  TxBuffer[Uart4_TX_counter+1] =  (crcresult >> 8) & 0xff;
  Uart4_TX_counter = Uart4_TX_counter+2;
  Uart4_TX_pointer = TxBuffer;//set USART DMA send buffer size
  DMA_Cmd(UART4_Tx_DMA_Channel, DISABLE);           //disable DMA channel
  DMA_DeInit(UART4_Tx_DMA_Channel);  


  DMA_InitTypeDef  DMA_InitStructure;
  
  /* UART4 TX DMA2 Channel (triggered by UART4 Tx event) Config */
  DMA_DeInit(UART4_Tx_DMA_Channel);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = UART4_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = Uart4_TX_counter;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(UART4_Tx_DMA_Channel, &DMA_InitStructure);
  DMA_Cmd(UART4_Tx_DMA_Channel, ENABLE);            //enable DMA channel      //copy received data to output buffer
  
  while(UART4_Tx_DMA_Channel->CNDTR !=0)
           ;
  while(!(DMA2->ISR & UART4_Tx_DMA_FLAG))//INDICATES DMA TRAN COMPLETED
           ;
  while(!(UART4->SR & 0x040))
           ;

  GPIO_ResetBits(GPIOC, GPIO_Pin_12);//rs485 RX enable

使用特权

评论回复
6
andyxyrong|  楼主 | 2012-2-15 11:22 | 只看该作者
上面是我DMA发送的代码,下面是出错的地方
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
8F 03 04 0B C8 0B C9 BE
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
8F 03 04 0B C8 0B C9 BE
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F
01 03 04 0B C8 0B C9 BE 8F

使用特权

评论回复
7
香水城| | 2012-2-15 11:55 | 只看该作者
看现象,不像是发送端出的问题;你能肯定是发送端的问题,而不是接收端的问题? 如何诊断的?

使用特权

评论回复
8
Simon21ic| | 2012-2-15 12:21 | 只看该作者
没看出来“不像是发送端的问题”,只是根据这些情况,不能断定是发送端的问题。
需要逻辑分析仪验证底层数据是否有漏

使用特权

评论回复
9
andyxyrong|  楼主 | 2012-2-15 12:36 | 只看该作者
是因为以前也是出现个这个问题,而且很严重,但是在发送子函数里重新配置了DMA TX, /* UART4 TX DMA2 Channel (triggered by UART4 Tx event) Config */
  DMA_DeInit(UART4_Tx_DMA_Channel);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = UART4_DR_Base;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = Uart4_TX_counter;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(UART4_Tx_DMA_Channel, &DMA_InitStructure);
  DMA_Cmd(UART4_Tx_DMA_Channel, ENABLE);            //enable DMA channel      //copy received data to output buffer
改善了不少,但只是出错的概率小了,并没有完全解决
7# 香水城

使用特权

评论回复
10
香水城| | 2012-2-15 13:52 | 只看该作者
没看出来“不像是发送端的问题”,只是根据这些情况,不能断定是发送端的问题。
需要逻辑分析仪验证底层数据是否有漏
Simon21ic 发表于 2012-2-15 12:21


哈哈,钱兄也来参加讨论了。

同意你的补充,根据这些情况,不能断定是发送端的问题。

使用特权

评论回复
11
andyxyrong|  楼主 | 2012-2-15 14:00 | 只看该作者
版主,你看这个程序有问题吗?会不会有BUG 10# 香水城

使用特权

评论回复
12
香水城| | 2012-2-15 14:37 | 只看该作者
版主,你看这个程序有问题吗?会不会有BUG 10# 香水城
andyxyrong 发表于 2012-2-15 14:00


我没看出来程序是否有问题;也许有问题,但我没看出来。

你每组数据之间间隔多少? 没有发送数据时,那个DMA通道在做什么?

你最好还是按照8楼的建议,从信号线上检查一下问题出在那一端,出问题时线路上是什么状况,比如帧错误、奇偶校验错误、波特率错误等或外界干扰。

使用特权

评论回复
13
seawwh| | 2012-2-16 10:16 | 只看该作者
请问你的发送速率是多少? 可以减速后试验,以判断是否是接收端的问题。

使用特权

评论回复
14
manhuami2007| | 2012-2-16 11:17 | 只看该作者
我也遇到过类似的问题,我的解决方法是DMA设置成不循环模式,打开串口发送完成TC中断,在中断中重新设置并打开DMA发送,就解决了 ,lz可以试试

使用特权

评论回复
15
nongfuxu| | 2012-2-16 11:22 | 只看该作者
关注好贴.

使用特权

评论回复
16
sanliu85| | 2012-2-16 11:27 | 只看该作者
遇到个这样的问题,我是第一次发送就错误,后面的会正常

使用特权

评论回复
17
jxmzzr| | 2012-2-16 18:20 | 只看该作者
我也遇到过,在接收的时候设置标志和效验就解决了。

使用特权

评论回复
18
全品儒| | 2017-4-20 14:36 | 只看该作者
楼上那发送的时候怎么解决啊。我的也是开始的第一个数据不对,之后发送就对了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

41

帖子

0

粉丝