请教一个stm32采用dma方式进行485控制切换发送时会自动接收00

2019-12-20 21:30发布

本帖最后由 小溪 于 2014-12-17 19:26 编辑

详细情况是这样的,stm32芯片控制485,接收设置成DMA自动循环方式,发送设置成单次dma方式,没有发送数据时接收数据循环接收覆盖都没有问题,但是在需要发送时,切换485发送使能后,此时dma接收设置都没有改变,但会接收到1字节00。单步调式时,发现发送使能(和接收使能接在一起的)变高后,dma接收缓冲区会自动多一字节00,此后想办法在切换前先关闭接收dma接收通道使能或usart接收dma关联,虽然485发送使能时不出现00了,但此后再恢复dma接收后还会出现1次00,另想办法在几处加延时,担心切换发送使能时485芯片接收线路不稳定,都没有效果,苦思冥想找不到解决办法,难道usart方式dma自动接收连接485芯片不能一直开着,会受485发送使能影响,换句话说切换会在接收通信线上产生1个00?怎么直接在usart中断接收发送方式下没发现这个问题呢?
====================================
把问题简单化,免得描述太多,说的太多反而别人看了不理解

如果把stm32某一usart固定设置为dma中断接收模式dma_mode_circular,这个usart是连接rs485芯片的,我使用的是磁隔离adm2587,应该和其他485驱动芯片差不多,如果程序中其他什么都不做或者做点点灯的事情,外界也不要向内发送数据,避免一切其他可能产生的干扰动作,也不要改变要测试的usart设置就行,将程序运行后暂停在主程序某一处后,通过调试软件中peripherals->general purpose I/O->GPIOx改变485发送接收使能控制连接的gpio引脚输出,注意了此时程序是不运行的,反复改变几次使能端,DMA接收缓存区就会接收到几个00字节(当然接下来要单步运行几步,要不单片机没有驱动时钟,也没法自动更新dma接收缓冲区),似乎是只有将485驱动使能由接收变为发送时,stm32的dma接收缓冲区就收到一个00,有没有办法不让产生这个问题?
有stm32带485的学习板的不妨简单测试一下,看我描述遇到的问题是不是普遍现象,搞不清怎么产生的,此时用示波器测量,该段时间内接收线路上也没有波动即没有数据流
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
23条回答
小溪
2019-12-21 09:08
haven9396 发表于 2014-12-17 08:43
看楼主的描述不像是硬件问题,在dma使能之前,应设置好接收指针和接收ram大小。 ...

这个是必须的,在初始化DMA通道 USART里肯定都是固定格式,设定DMA源目标地址以及长度等,设置应该都是差不多,都是从标准例程拷贝过来稍微修改一下的,并且如果都是接收不切换发送使能是都是正常工作的,接收数据也是循环覆盖很正常,开始我是怀疑是硬件485切换问题导致接收线路出现问题,经过几次调试除了开始盯上了如何关闭一下接收,防止这期间接收线路上出现波动导致错误接收到数据,但是线路上信号稳定期间即单步调试,应该是稳定的,再打开DMA接收仍然会出现00,怀疑DMA自动循环接收开关一下难道就应该出现一次00非正常数据?

一周热门 更多>