eric2013 发表于 2021-11-6 11:58:16

STM32的485串口DMA切换收发的正确姿势

群友问题:

串口的DMA功能发送数据,检测到DMA发送完成后,把使能脚改为接收状态(如图A处)。但是这样子会导致有2个字节数据没发送,485使能脚就被改变为接收状态了(示波器图的绿色线)。最终导致发送数据失败。
如果把485的发送,不用DMA传输。然后再开启串口发送完成中断,在此中断中改变485的接收/发送,这样子是没问题的。

我的想法是:如果我坚持用DMA的方式发送数据,有什么办法能准确切换485的接收/发送引脚的状态的?








解决办法。

这个问题的答案就在参考手册里面,等待DMA传输完成后,还有等待TC发送完成标志才是真正的结束。





爱恋之燕 发表于 2021-11-8 22:41:43

感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样还不如直接由CPU自己发送串口数据。能否做成这样,CPU交给DMA发送后,先去干别的事情,等DMA发送完成后,在TC flag处产生中断,通知CPU将DE引脚切换为接收模式?

emwin 发表于 2021-11-8 23:21:56

爱恋之燕 发表于 2021-11-8 22:41
感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样 ...

官方驱动就是DMA中断里使能TC中断,在中断里切换到接收模式

emwin 发表于 2021-11-8 23:24:54

我有款产品MCU主频16.384M,波特率跑115200bps,DMA发送就比查询方式发送更快,字节间间隙很小

eric2013 发表于 2021-11-9 00:26:41

爱恋之燕 发表于 2021-11-8 22:41
感觉这么做毫无意义,串口数据交给DMA发送后,CPU的工作就是while等待DMA发送完成,也没有干其他事情,这样 ...
他这个是在OS里面使用,死等最方便,简单易用。这个是我之前整理的一个帖子。

谈一下常用的 DMA2D,MDMA和通用DMA1,DMA2应用分类,为什么有些DMA应用是死等
http://www.armbbs.cn/forum.php?mod=viewthread&tid=99646

emwin 发表于 2021-11-9 09:31:30

以前对TC理解不到位,再看手册里的“Figure 297. Transmission using DMA”,理解更准确了。
TC中断在连续发送过程中可以用做发送完标志,发送过程中DR寄存器始终有个待发送的数据,
而且,我F1x的V20RM倒数第2条曲线描述写错了,我图中写的DMA writes SPI DR。

iceburgconner2 发表于 2023-8-3 14:58:10

硬汉哥,请问RS485这种半双工传输的,可以做自发自收验证吗

eric2013 发表于 2023-8-4 09:34:02

iceburgconner2 发表于 2023-8-3 14:58
硬汉哥,请问RS485这种半双工传输的,可以做自发自收验证吗

在485 PHY芯片前面一级才行。

iceburgconner2 发表于 2023-8-5 13:28:42

eric2013 发表于 2023-8-4 09:34
在485 PHY芯片前面一级才行。

好的,谢谢,前级已经验完了

浮生如梦 发表于 2024-1-27 14:27:53

判断TC标志后,让需要少许延时,因为此时RS485芯片内的信号未必转化完成。测试了几种RS485芯片有的TC标志置位后可直接切换方向,有的必须加延时才行

浮生如梦 发表于 2024-1-27 14:29:12

TC标志判断后,部分RS485芯片仍需要加少许延时,等待RS485芯片内部信号转化完毕

eric2013 发表于 2024-1-28 09:09:24

浮生如梦 发表于 2024-1-27 14:27
判断TC标志后,让需要少许延时,因为此时RS485芯片内的信号未必转化完成。测试了几种RS485芯片有的TC标志置 ...

此时推荐使用大厂的485器件,基本都没问题的。之前测试了几款,2Mbps的快速收发切换都正常。
页: [1]
查看完整版本: STM32的485串口DMA切换收发的正确姿势