打印
[STM8]

STM8L的USART2通过DMA发送,为什么只发送一帧数据的最后一个...

[复制链接]
834|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cry1109|  楼主 | 2019-8-27 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cry1109 于 2019-8-27 17:29 编辑

USART2接收放在接收中断里了,发送数据通过DMA发送。不通过DMA发送时可以正常发送所有数据,可是通过DMA通道发送数据时,只发送了一帧数据中的最后一个字节数据。DMA配置函数如下:

static void DMA_Config(void)
{
  /* Deinitialize DMA channels */
  DMA_GlobalDeInit();

  DMA_DeInit(DMA1_Channel0);                //USART2 TX 通道

  /* DMA channe0 Tx of USART Configuration */
  DMA_Init( USART_DMA_CHANNEL_TX,              //DMA通道        
                 (uint16_t)TxBuffer,                              //指向要发送数据的内存地址
                 (uint16_t)USART2_DR_ADDRESS,   //外设地址 (USART2 数据寄存器地址)
                 DATA_TO_TRANSFER,                      //待传送数据的大小  DATA_TO_TRANSFER
                 DMA_DIR_MemoryToPeripheral,     //DMA传输方向,内存到外设
                 DMA_Mode_Normal,                            //DMA工作模式
                 DMA_MemoryIncMode_Inc,             //内存增量递增
                 DMA_Priority_High,                            //DMA通道优先级
                 DMA_MemoryDataSize_Byte);        //每次传输1个字节  DMA_MemoryDataSize_Byte

  /* Enable the USART Tx/Rx DMA requests */
  USART_DMACmd(USART2, USART_DMAReq_TX, ENABLE);
  //USART_DMACmd(EVAL_COM1, USART_DMAReq_RX, ENABLE);

  /* Global DMA Enable */
  DMA_GlobalCmd(ENABLE);      
}



发送数据代码如下:
        USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
        //GPIO_SetBits(GPIOC, GPIO_Pin_4);        //enabe RS485 send
        Comm_Data_OK = 1;
        DMA_ClearFlag(DMA1_FLAG_TC0);           //clear send complete flag清除发送完毕标志
        DMA_Cmd(DMA1_Channel0, DISABLE);
        DMA_SetCurrDataCounter(DMA1_Channel0, TxCounter);      //9
        DMA_Cmd(DMA1_Channel0, ENABLE);


USART2经过RS232接口和上位机通讯。最初是由USART1通过485和上位机通讯,通过DMA发送一切正常,现在改成USART2通过232后就不行了?

使用特权

评论回复
沙发
airwill| | 2019-8-27 21:58 | 只看该作者
是不是配置的设置问题

使用特权

评论回复
板凳
cry1109|  楼主 | 2019-8-28 08:57 | 只看该作者
airwill 发表于 2019-8-27 21:58
是不是配置的设置问题

DMA配置上,从USART1更换为USART2后只更改了DMA通道和外设地址,其他都没变,而且程序里我已经没有使用USART1了,找了好久都没发现问题在哪儿。

使用特权

评论回复
地板
airwill| | 2019-8-28 21:33 | 只看该作者
只发送了一帧数据中的最后一个字节数据。所以怀疑是 DMA 的配置问题

使用特权

评论回复
5
15010928398| | 2019-12-4 15:58 | 只看该作者
楼主!您的问题解决没,我现在只能收到后两位数据。。。

使用特权

评论回复
6
15010928398| | 2019-12-5 08:58 | 只看该作者
我这边DMA没问题,有问题的是485的切换,485 在发送后要把使能端改成低电平,但是这会儿DMA还在发送,所以我这边收到的数据不全,有时候是后两位,有时候是任意两位,吧那个延时改成15ms以后再拉低就可以收到完成数据包了。

使用特权

评论回复
7
cry1109|  楼主 | 2019-12-5 12:45 | 只看该作者
15010928398 发表于 2019-12-5 08:58
我这边DMA没问题,有问题的是485的切换,485 在发送后要把使能端改成低电平,但是这会儿DMA还在发送,所以 ...

是的,485要注意一下收发时序,串口发送的数据放到DMA后,因为DMA发送不占用CPU进程,485使能发送后如果过早的使能接收,可能导致发送的数据丢失。

使用特权

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

本版积分规则

40

主题

172

帖子

4

粉丝