elecwt 发表于 2023-1-4 15:31

USART的发送数据完成中断,到底是个什么中断?RS485该怎么切换方向?

起因是RS485通信,需要控制方向脚,在数据发送完成后,将方向切换为接收。问题来了:

最开始的做法是,在DMA发送完成中断里面开启USART的“发送数据完成”中断,然后在USART的“发送数据完成”中断里面将方向切换为接收,测试发现最后两个字节发送不成功。

然后改成这样:DMA发送完成中断里面开启USART的“发送缓冲器空”中断,在“发送缓冲器空”中断再打开“发送数据完成”中断,最后才在“发送数据完成”中断里面切换方向,测试发现最后一个字节发送不成功。

那么,这个“发送数据完成”中断,到底是个什么玩意?RS485方向控制该怎么做?以前用ST的芯片,发送完成中断直接切换方向没问题,换成AT32F415,就差了两个字节发送不成功。

LcwSwust 发表于 2023-1-4 15:45

本帖最后由 LcwSwust 于 2023-1-4 15:46 编辑

似乎是这样:数据先是给缓冲区,当上一次“发送数据完成”后,缓冲区将数据转交给移位寄存器(此时发送缓冲器空),然后移位寄存器再将数据按波特率一位一位的移到TXD脚去,移完后就是“发送数据完成”。所以485最好是等待“发送数据完成”后再作切换。

elecwt 发表于 2023-1-4 15:57

LcwSwust 发表于 2023-1-4 15:45
似乎是这样:数据先是给缓冲区,当上一次“发送数据完成”后,缓冲区将数据转交给移位寄存器(此时发送缓冲 ...

感谢回复,我的理解也是移位寄存器移位完成,才是“发送数据完成”中断。现在是在中断里面判断“发送缓冲器空”以及“发送数据完成”,才切换方向,实际测试发现最后一个字节发送失败,所以迷糊了。

LcwSwust 发表于 2023-1-4 16:04

elecwt 发表于 2023-1-4 15:57
感谢回复,我的理解也是移位寄存器移位完成,才是“发送数据完成”中断。现在是在中断里面判断“发送缓冲 ...

这个时候可以借助示波器,用两个通道同时测量485芯片的DI脚、DE脚就知道切换时机对不对了。

elecwt 发表于 2023-1-4 16:35

LcwSwust 发表于 2023-1-4 16:04
这个时候可以借助示波器,用两个通道同时测量485芯片的DI脚、DE脚就知道切换时机对不对了。 ...
暂时解决了,开的是“发送数据完成”中断,在中断中判断“发送缓冲器空”和“发送数据完成”都满足才切换方向。这个过程可能会多次进入中断。谢谢了

p8s 发表于 2023-1-5 08:42

自动控制方向方便些

elecwt 发表于 2023-1-5 09:53

p8s 发表于 2023-1-5 08:42
自动控制方向方便些

需要加芯片啊

cauhorse 发表于 2023-1-5 13:25

为了尽快完成项目交付就加个自动流向控制的器件,要求高的话选带隔离的;
如是公司做产品要上量,还有成本控制要求,那就改改程序

xiaofei558008 发表于 2023-1-5 14:01

额外弄个timer 不就好了

zhxzhxzzhhxx 发表于 2023-1-5 14:37

本帖最后由 zhxzhxzzhhxx 于 2023-1-5 14:38 编辑

发送完整,并不意味这发送缓冲区空,数据可能还在缓冲区里,等待输出到硬件上
发送缓冲空,并不意味这串行数据就在引脚上传输完成,可能还在引脚上串行输出着
这个你放慢波特率,并用快速的MCU就能明显体会出来,
要缓冲区空,硬件引脚都完成了,才能改变方向.

袁胜富 发表于 2023-1-5 19:18

自动收发电路搭一个,实现自动收发,我一直用
页: [1]
查看完整版本: USART的发送数据完成中断,到底是个什么中断?RS485该怎么切换方向?