深山老妖 发表于 2024-9-1 10:58:25

请教在串口DMA时,如何控制RS485的发送使能脚?

主板控制外部设备,该设备的波特率是定死的9600,不能改变,数据量又大,并且不是定长的,如果直接发送太占CPU的时间,想用DMA的方式发送;整个板子共用了4路485,一路CAN,其中一路485是9600,一路485是38400,另外两路是115200,想把9600这一路通过DMA传输,每次发送数据前,要用单片机的一个引脚拉高485芯片的发送使能脚,发送完成后要拉低,如果正常发送的情况倒是好办,如果是用DMA方式的话,该如何处理?发送前需要拉高,发送完成后需要立即拉低,不然从机设备返回的数据会收不到,芯片使用的是STC32G12K64。

神农鼎 发表于 2024-9-1 11:04:45






邮箱 发表于 2024-9-1 11:11:21

在DMA发送完成中断里拉低

深山老妖 发表于 2024-9-1 12:16:13

神农鼎 发表于 2024-9-1 11:04

之前用过这种方式,后来发现,这样的方式出来的信号会有一定的误差,
用逻辑分析仪看过,如果低速的还行,如果是高速的,会有丢信号的问题。

深山老妖 发表于 2024-9-1 12:17:17

邮箱 发表于 2024-9-1 11:11
在DMA发送完成中断里拉低

在开始发送前要拉高,发送完成后要拉低,要处理两次,要怎么操作呢?

wxdjs 发表于 2024-9-1 13:08:28

深山老妖 发表于 2024-9-1 12:16
之前用过这种方式,后来发现,这样的方式出来的信号会有一定的误差,用逻辑分析仪看过,如果低速的还行, ...

你的从机难道没有延时机制吗?
每次你主动发送数据肯定知道字节、那dma发送完可以中断中处理,还不能里面立马切换接收,可能会最后一个字节从机接收错误.
如果从机没延时只能计算一下一个位时间来测试下停止位发送完再使能接收,stc指令速度太快了

深山老妖 发表于 2024-9-1 13:11:49

wnagming 发表于 2024-9-1 12:22
先拉高,然后启动DMA,DMA完成后中断中拉低

谢谢,了解了。

深山老妖 发表于 2024-9-1 13:18:38

wxdjs 发表于 2024-9-1 13:08
你的从机难道没有延时机制吗?
每次你主动发送数据肯定知道字节、那dma发送完可以中断中处理,还不能里面 ...

与延时机制没有关系,我是说波形会有一定的误差,用三极这种形式的电路,如果真正商业化应用,会有问题,做测试可能还好,之前做的工控板,就是用反相器做的,确实可以省下一个端口,但是现场发现,会经常出现数据错误的问题,最后用逻辑分析仪观察发现,信号的高低电平,与发送端会有一定的误差,如果现场再有干扰的情况下,就有可能会出现数据错误的问题,后来全部改用多用一个端口专门控制485的使能脚,就没有再出问题了。

wxdjs 发表于 2024-9-1 13:45:57

深山老妖 发表于 2024-9-1 13:18
与延时机制没有关系,我是说波形会有一定的误差,用三极这种形式的电路,如果真正商业化应用,会有问题, ...

应该就是控制脚的电平最终转换状态在你发送或者接收前没满足要求,
我在中断中试过立马改变切换使能脚,发现会引起那个停止位没完成的情况,以前51的时候加几个nop后正常,现在stc需要加好多个

WHX 发表于 2024-9-1 14:23:03

可尝试一下国产的具有自动流向控制功能的485芯片,含税也才2.5元/片,直接把使能脚固定接高电平即可,根本就不用拉高拉低的,又可以节省单片机的一个io,这些芯片已经经过了实际产品的验证,性能稳定可靠!波特率直接跑115200都没问题,数据传输速率可达16Mbps。一家是杭州瑞盟科技的MS2548【SOP-8封装】https://www.relmon.com/,另外一家是杭州捷茂微电子的GM13488E【SOP-8封装】。
页: [1] 2
查看完整版本: 请教在串口DMA时,如何控制RS485的发送使能脚?