请教一个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-23 11:18
我上午也遇到了这个问题,虽然软件上能处理掉,但我还是想搞清楚。翻了这个帖子后,发现自己板子上STM32F1的RXD引脚没有加上拉,加了上拉,发现问题解决。而且我正好也是用的adm2587,目前猜测应该是adm2587从发送状态切换到接收状态是需要一定时间,而正是这个时间端,造成了adm2587的RO引脚为浮空状态,如果STM32F1的RX引脚没有上拉,那么就可能收到字节0

一周热门 更多>