STM32通信接口RS485

18.1关于 RS485

RS485是美国电子工业协会(Electronic Industries Association,EIA)于1983年发布的串行通信接口标准,经通讯工业协会(TIA)修订后命名为TIA/EIA-485-A

RS485具有支持多节点(32个节点)、传输距离远(最大1219m)、接收灵敏度高(200mV电压)、连接简单(在构成通信 络时,仅需要一对双绞线作传输线)、能抑制共模干扰(差分传输)、成本低廉等特点,在多站、远距离通信等多种工控环境中获得了广泛应用。

RS485比RS232晚出现20多年,很多RS232的缺点,在RS485上有了改进。

RS232的电平从-15V至+15V,较高的电平值易损坏接口电路的芯片,而RS485采用差分信 后,电平范围为-6V至+6V,相对不易损坏接口电路芯片,同时RS485接口信 电平与TTL信 电平兼容,便于连接TTL电路。

RS232传输速率比较低,传输速率为20Kbps,而RS485最高传输速率达10Mbps。过高的传输速率会降低传输距离,在实际应用中,RS485传输速率往往设置为9600bps或更低。

RS232采用逻辑电平,共地传输容易产生共模干扰,抗噪声干扰性弱,传输距离有限,常用传输距离就几十米左右。而RS485采用平衡发送和差分接收方式,具有抑制共模干扰的能力,加之总线收发器具有高灵敏度,能检测低至200mV的电压,因此RS485的传输距离达到千米以外。

RS232在总线上只允许连接1个收发器,即单站能力,而RS485在总线上允许连接多达128个收发器,即具有多站能力,可以利用单一的RS485方便地建立起设备 络,如图 18.1.1 所示,为RS485通信 络结构。

在RS485通信 络中,通常使用485收发器将TTL电平转换成RS485的差分信 。MCU的串口控制器TxD发送数据,经485收发器转换成差分信 ,传输到总线上。接收数据时,485收发器将总线上的差分信 转化成TTL信 由RxD到串口控制器。整个通信 络中,通常只有一个主机,剩下的全部为从机。在RS485总线中,通常还需要在总线起止端分别加上约120Ω的终端匹配电阻,以保证RS485总线的稳定性。

18.2 硬件设计

如图 18.2.1 为开发板RS485部分的原理图,U16为3.3V低功耗半双工收发器,满足RS-485和RS-422标准。 USART的RX和TX,经过U16转换,变为RS485的A、B。

U16的2脚RE????为接收使能,上划线表示低电平有效,即当U16的2脚为低电平时,U16接收数据。U16的3 脚DE为输出使能,高电平有效,即当U16的3脚为高电平是,U16发送数据。

因此,RS485除了USART,还多了一个收发控制引脚,该引脚使用的PC5。R64为终端匹配电阻,阻值为120Ω。

分别定义了两个串口、对应GPIO、时钟使能,方便代码复用,同时定义了RS485的收发控制引脚。

  1. 初始化USART
    USART初始化包含两部分:协议部分和硬件部分。
    协议部分放在各自“.c”文件里,硬件部分都是调用“HAL_UART_Init()”,单独创建一个“.c”文件处理。USART1作为调试串口,初始化和前面的实验一样,这里直接跳过。USART2作为RS485,初始化如代码段 18.3.3 所示。

代码段 18.3.3 USART2 初始化(driver_usart2.c)

RS485的本质还是串口,串口的初始化和之前的基本一样。RS485通常也遵循“96-N-8-1”格式,96指波特率9600,N指无校验,8指8bits数据位,1指1bit停止位。

串口协议初始化完后,都调用“HAL_UART_Init()”进行设置,在“HAL_UART_Init()”调用
“HAL_UART_MspInit()”初始化串口硬件部分。

代码段 18.3.4 USART MSP 初始化(driver_msp_usart.c)

先后初始化了USART1和USART2的硬件部分,其中USART2设置了中断优先级和使能了中断,便可以使用“HAL_UART_Receive_IT()”和“HAL_UART_Transmit_IT()”收发数据。接着将RS485的收发函数进行封装,如代码段 18.3.5 所示。

代码段 18.3.5 RS485 收发函数(driver_usart2.c)

  • 11行:usart2_tx_finish为一个全局变量,用来标记USART2是否发送完成。这里将其设置为0,USART2发送完成后,在中断函数将其置为1,通过该标记便可得知USART2是否发送完成;
  • 13行:RS485设备通常默认为接收状态,以方便接收数据。这里发送数据,需要手动临时改为发送状态;
  • 14行:调用串口中断函数发送数据;
  • 27行:usart2_rx_finish为一个全局变量,用来标记USART2是否接收完成。这里将其设置为0,USART2接收数据完成后,在中断函数将其置为1,通过该标记便可得知USART2是否接收到数据;
  • 29行:RS485设备通常默认为接收状态,这里无需其它设置,直接调用串口中断函数接收数据;
  1. 中断回调函数
    当USART2发生中断时,将自动调用“USART2_IRQHandler()”,“USART2_IRQHandler()”又调用“HAL_UART_IRQHandler()”,最后调用“HAL_UART_TxCpltCallback()”或“HAL_UART_RxCpltCallback()”, 在这两个回调函数里修改USART2接收/发送完成标志,以便后面查询是否收发成功。

代码段 18.3.6 USART2 中断回调函数(driver_msp_usart.c)


                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月12日
下一篇 2021年4月12日

相关推荐