[STM8] 为什么只发送一帧数据的最后一个

[复制链接]
2216|25
 楼主| wuhany 发表于 2021-11-5 23:33 | 显示全部楼层 |阅读模式
STM8L的USART2通过DMA发送
llljh 发表于 2021-11-5 23:36 | 显示全部楼层

还有什么现象?能再详细描述下吗?
 楼主| wuhany 发表于 2021-11-5 23:38 | 显示全部楼层
USART2接收放在接收中断里了,发送数据通过DMA发送。不通过DMA发送时可以正常发送所有数据,可是通过DMA通道发送数据时,只发送了一帧数据中的最后一个字节数据。
liuzaiy 发表于 2021-11-5 23:41 | 显示全部楼层
DMA配置函数看下
 楼主| wuhany 发表于 2021-11-5 23:43 | 显示全部楼层

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);      
}
 楼主| wuhany 发表于 2021-11-5 23:45 | 显示全部楼层
发送数据代码如下:
        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);
 楼主| wuhany 发表于 2021-11-5 23:47 | 显示全部楼层
USART2经过RS232接口和上位机通讯。最初是由USART1通过485和上位机通讯,通过DMA发送一切正常,现在改成USART2通过232后就不行了?
zhaoxqi 发表于 2021-11-5 23:49 | 显示全部楼层
是不是配置的设置问题
 楼主| wuhany 发表于 2021-11-5 23:51 | 显示全部楼层
DMA配置上,从USART1更换为USART2后只更改了DMA通道和外设地址,其他都没变
 楼主| wuhany 发表于 2021-11-5 23:52 | 显示全部楼层
而且程序里我已经没有使用USART1了,找了好久都没发现问题在哪儿。
wyjie 发表于 2021-11-5 23:55 | 显示全部楼层
只发送了一帧数据中的最后一个字节数据。
stly 发表于 2021-11-5 23:57 | 显示全部楼层
嗯,所以怀疑是 DMA 的配置问题
cyclefly 发表于 2021-11-6 13:47 | 显示全部楼层
没进中断,自然是中断配置问题了
zwll 发表于 2021-11-13 16:21 | 显示全部楼层
楼主!您的问题解决没,我现在只能收到后两位数据。。。
renyaq 发表于 2021-11-13 16:27 | 显示全部楼层
我这边DMA没问题,有问题的是485的切换
renyaq 发表于 2021-11-13 16:29 | 显示全部楼层
485 在发送后要把使能端改成低电平,但是这会儿DMA还在发送,所以我这边收到的数据不全
spark周 发表于 2021-11-13 16:31 | 显示全部楼层
有时候是后两位,有时候是任意两位
zhanghqi 发表于 2021-11-13 16:35 | 显示全部楼层
吧那个延时改成15ms以后再拉低就可以收到完成数据包了
 楼主| wuhany 发表于 2021-11-13 16:37 | 显示全部楼层
是的,485要注意一下收发时序,串口发送的数据放到DMA后,因为DMA发送不占用CPU进程,485使能发送后如果过早的使能接收,可能导致发送的数据丢失。
 楼主| wuhany 发表于 2021-11-13 16:39 | 显示全部楼层
知道怎么回事了,多谢大家
您需要登录后才可以回帖 登录 | 注册

本版积分规则

879

主题

10435

帖子

4

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