RS485接口具有抗干扰性强,适合长距离传输和多站点通讯等特点,因此在工业控制中被普遍使用。单片机只有UART接口,如果需要使用RS485通讯,需要外面加一个Transceiver。由于RS485工作在半双工模式,因此发送和接收的方向切换是设计过程中的一个重要问题。通常的接口电路有以下三种:
1)第一种方式是将MCU的UART TXD端通过控制三极管进行信号反转,然后接到Transceiver的输出使能端DE和接收使能端RE,并将Transceiver的A端接上拉电阻,B端接下拉电阻。电路图如下图所示:
![536104f9032586c8b332d06e3a03b9d6.png](https://i-blog.csdnimg.cn/blog_migrate/ecb9f73ecf5276d2c38d0ca015c2ce55.jpeg)
该电路的控制原理是:默认情况下UART TXD为1,这时Transceiver的输出使能端DE和接收使能端RE为0,Transceiver工作在接收状态。当UART有信号输出时,TXD 首先会有一个低电平产生(起始位),这时Transceiver的输出使能端DE和接收使能端RE为1,Transceiver切换到发送状态,这时会把这个低电平发送出去。看到这里你肯定会有一个疑问,当发送的数据位为高电平时该如何发送出去呢?
由Transceiver的发送真值表可以看出,在发送过程如果DE变为0,那么输出时高阻态,因为这里在A、B端加了上拉和下拉电阻,所以这时输出为高电平。
![8d383e190a1043f1c0e5045b0d07735f.png](https://i-blog.csdnimg.cn/blog_migrate/0f001b0fa636dc8a353b8c5c182c25a5.jpeg)
该设计使得RS-485芯片的方向切换不需要在软件里做任何处理,减轻了软件调试的工作量。
2) 另外一种更常用的方式是通过MCU的GPIO去控制DE和RE
![67d8d99c02e79d7c00a8df7758d20b9e.png](https://i-blog.csdnimg.cn/blog_migrate/3b8793d22f5a4c354215778693ed1deb.jpeg)
这种方法需要在软件中去控制GPIO的高低电平变化。当需要发送时控制GPIO为高电平,然后串口发送数据。当需要接收时控制GPIO为低电平,然后就可以接收数据。
3)还有一种比较好的方法是通过UART的RTS引脚来控制DE和RE,当然这种方法的前提是MCU 的UART硬件流控功能才可以。以NXP 某款Cortex-M4 单片机为例,
![7312fc0cf56ffa03028cd37babd5a1a9.png](https://i-blog.csdnimg.cn/blog_migrate/0d83563f4cd9643e36ecc0a3a7a685a0.jpeg)
这种方法的好处是在使用UART进行数据发送时它会自动产生流控信号。在使用这个功能时在初始化时将UARTx_MODEM的TXRTSE设置为1,TXRTSE置位0(默认就是0,可不设置)
![f234b3f87039372aedebc757b627673d.png](https://i-blog.csdnimg.cn/blog_migrate/02e001650a346d91b97d890984e6b5f2.jpeg)
![2f4f329c11fec618e2281850135031cb.png](https://i-blog.csdnimg.cn/blog_migrate/24705d9ffe463bdc8d81f9b76b63b1eb.jpeg)
之后在发送数据时会自动产生高电平,RS485工作在发送状态;数据发送完变为低电平,RS485工作在接收状态。
下图是我在实际使用过程中抓取到的示波器波形图,可以看到485收发切换是和UART工作同步的。
![6bc327e4b2a856d151043337a9641e39.png](https://i-blog.csdnimg.cn/blog_migrate/972073a482daf8725e94204bf82bd02c.jpeg)