打印
[STM8]

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

[复制链接]
1723|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配置函数看下

使用特权

评论回复
5
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);      
}

使用特权

评论回复
6
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);

使用特权

评论回复
7
wuhany|  楼主 | 2021-11-5 23:47 | 只看该作者
USART2经过RS232接口和上位机通讯。最初是由USART1通过485和上位机通讯,通过DMA发送一切正常,现在改成USART2通过232后就不行了?

使用特权

评论回复
8
zhaoxqi| | 2021-11-5 23:49 | 只看该作者
是不是配置的设置问题

使用特权

评论回复
9
wuhany|  楼主 | 2021-11-5 23:51 | 只看该作者
DMA配置上,从USART1更换为USART2后只更改了DMA通道和外设地址,其他都没变

使用特权

评论回复
10
wuhany|  楼主 | 2021-11-5 23:52 | 只看该作者
而且程序里我已经没有使用USART1了,找了好久都没发现问题在哪儿。

使用特权

评论回复
11
wyjie| | 2021-11-5 23:55 | 只看该作者
只发送了一帧数据中的最后一个字节数据。

使用特权

评论回复
12
stly| | 2021-11-5 23:57 | 只看该作者
嗯,所以怀疑是 DMA 的配置问题

使用特权

评论回复
13
cyclefly| | 2021-11-6 13:47 | 只看该作者
没进中断,自然是中断配置问题了

使用特权

评论回复
14
zwll| | 2021-11-13 16:21 | 只看该作者
楼主!您的问题解决没,我现在只能收到后两位数据。。。

使用特权

评论回复
15
renyaq| | 2021-11-13 16:27 | 只看该作者
我这边DMA没问题,有问题的是485的切换

使用特权

评论回复
16
renyaq| | 2021-11-13 16:29 | 只看该作者
485 在发送后要把使能端改成低电平,但是这会儿DMA还在发送,所以我这边收到的数据不全

使用特权

评论回复
17
spark周| | 2021-11-13 16:31 | 只看该作者
有时候是后两位,有时候是任意两位

使用特权

评论回复
18
zhanghqi| | 2021-11-13 16:35 | 只看该作者
吧那个延时改成15ms以后再拉低就可以收到完成数据包了

使用特权

评论回复
19
wuhany|  楼主 | 2021-11-13 16:37 | 只看该作者
是的,485要注意一下收发时序,串口发送的数据放到DMA后,因为DMA发送不占用CPU进程,485使能发送后如果过早的使能接收,可能导致发送的数据丢失。

使用特权

评论回复
20
wuhany|  楼主 | 2021-11-13 16:39 | 只看该作者
知道怎么回事了,多谢大家

使用特权

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

本版积分规则

879

主题

10435

帖子

4

粉丝