RT-Thread论坛
直播中

周煌煦

8年用户 1063经验值
私信 关注

RS485通信串口轮询发送完成后立即拉低MAX3485芯片EN引脚,数据未能全部发出是为什么?

你们有没有在使用RTthread uart tx_poll的时候遇到问题,我要用485通信,然后我要发送数据之前会设置max3485为发送模式,然后调用rt_device_write之后我立即设置为接收模式,一直有问题,后来我发现rt thread里面串口轮询发送的判断逻辑是以发送数据寄存器空认为发送完成了,并不是以移位寄存器发送完成来判断的。

我后来通过逻辑分析仪先看波形发现EN引脚提前被拉低了,所以倒推过来查发送逻辑的,我的疑问是这种问题已经很常见,为什么他们的驱动里面没有考虑这种事情

回帖(1)

123

2024-7-25 17:15:53
您遇到的问题确实比较常见,尤其是在使用RS485通信时。RS485通信是一种差分信号通信方式,通常用于工业环境中,因为它具有较好的抗干扰能力。MAX3485是一款常用的RS485收发器芯片,它具有发送和接收两种模式。在发送数据时,需要将MAX3485设置为发送模式,而在接收数据时,需要将其设置为接收模式。

关于您的问题,我将从以下几个方面进行分析:

1. **RT-Thread UART TX轮询发送机制**:
   RT-Thread的UART驱动通常采用轮询发送的方式,即在发送数据时,会不断检查发送数据寄存器(TX FIFO)是否为空,一旦为空,就认为数据已经发送完成。这种机制在大多数情况下是有效的,但在某些特定情况下,可能会导致数据未能全部发出。

2. **MAX3485的发送和接收模式切换**:
   在发送数据之前,需要将MAX3485的RE#引脚拉低,以进入发送模式;发送完成后,需要将RE#引脚拉高,以进入接收模式。这个过程需要一定的时间,因为MAX3485内部需要完成发送模式和接收模式的切换。

3. **EN引脚的作用**:
   EN引脚是MAX3485的使能引脚,用于控制芯片的工作状态。在发送数据时,需要将EN引脚拉高,以使能芯片;发送完成后,需要将EN引脚拉低,以关闭芯片。这个过程同样需要一定的时间。

4. **可能的问题原因**:
   您提到在调用`rt_device_write`之后立即设置为接收模式,这可能导致MAX3485在发送数据的过程中被切换到接收模式,从而导致数据未能全部发出。这是因为RT-Thread的UART驱动以发送数据寄存器空为判断依据,而没有考虑到MAX3485内部的发送和接收模式切换时间。

5. **解决方案**:
   为了解决这个问题,您可以尝试以下方法:
   - 在发送数据之前,确保MAX3485处于发送模式,并且EN引脚被拉高。
   - 在调用`rt_device_write`之后,不要立即切换到接收模式,而是等待一段时间(例如1ms),以确保MAX3485完成发送数据的过程。
   - 在等待时间结束后,再将MAX3485切换到接收模式,并拉高EN引脚。

6. **关于RT-Thread驱动的改进**:
   您提到的问题是一个很好的反馈,可以考虑向RT-Thread社区提交一个改进建议或者自己修改驱动代码,以解决这个问题。在修改驱动代码时,可以考虑增加一个参数,用于控制发送完成后的延时时间,以便更好地适应不同的硬件和应用场景。

总之,您遇到的问题可能是由于RT-Thread UART驱动的发送机制和MAX3485的发送/接收模式切换时间不匹配导致的。通过调整发送完成后的延时时间,或者改进驱动代码,应该可以解决这个问题。同时,也可以考虑向RT-Thread社区反馈这个问题,以促进驱动的改进和完善。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分