• 通讯接口应用笔记2:MAX3160实现多协议通讯


      在一些应用需求中,我们需要对外部提供串行通讯端口,但这些端口所通讯的目标设备各有不同,接口协议也有RS232以及RS485和RS422多种。面对这种情况,我们当然可以同时设计多个串口以适应不同需要,但无疑对硬件资源是一种浪费。我们希望能够动态配置接口类型以适应不同需求,这一篇中我们就来讨论使用MAX3160实现这样的多协议接口通讯的问题。

    1、原理简述

      MAX3160是一款可编程RS232、RS485和RS422多协议收发器。可以通过引脚配置来实现双通道RS-232,单通道的RS-485和RS-422以及带硬件流控制的单通道RS-232接口。MAX3160采用独特的低压差发送输出级和内部双电荷泵结构,在3V到5.5V的单电源供电时,可满足RS-232和RS-485以及RS-422的接口协议要求。其引脚定义及封装如下:

      从上述的引脚定义中我们可以知道, 我们可以通过RS485/RS232、HDPLX等引脚来确定接口的工作模式。当RS485/RS232和HDPLX引脚配置为低电平时,MAX3160工作在RS-232模式。当RS485/RS232引脚配置在高电平时,HDPLX引脚为高电平工作在RS485模式,HDPLX引脚为低电平工作在RS422模式。官方给出的配置方式如下图所示:

      我们在应用MAX3160时,根据我们的应用需求来配置RS485/RS232和HDPLX引脚就能得到我们想要的接口模式。我们也可以通过MCU来控制这些引脚以便在需要时动态修改接口模式。

    2、应用设计

      有了前面关于MAX3160的基础知识,我们来根据需求设计我们的需要的应用。在官方给出的数据手册中提供了了一个应用参考,在其中能实现带硬件流控制的RS-232接口和RS-422之间的切换电路图:

      在上述电路图中,虽然阐述了接口模式切换的原理,但我们计划的应用并没有这么复杂。在我们的应用需求中,我们希望可以实现RS-232和RS-485接口的动态切换,我们只需要一组RS-232接口也没有RS-422的应用需求,同时我们也不考虑硬件流控制。在应用于RS-485模式时,我们需要使用15脚来控制RS-485的收发方向,而且在RS-485和RS422模式下第7脚是不使用的,所以我们可以设计相关的应用如下图:

      在上述电路图中,我们实现了RS-232和RS-485的切换,我们通过MCU来控制RS485/RS232引脚和HDPLX引脚以实现动态切换。

    3、设计验证

      我们设计了MAX3160动态切换RS-232和RS-485的接口电路,至于是否能够正确的运行还需要进行验证。我们设计简单的应用软件来验证一下上述的电路设计是否正确。

      首先我们来验证RS-232接口模式。在RS-232接口模式下,我们需要将RS485/RS232引脚设置为低电平,并且将HDPLX引脚也设置为低电平。我们在MCU程序中配置如下:

      MCEF_RS232_ALLOW(); //配置为RS232模式

      MCEF_FULLDUPLEX_ALLOW(); //全双工

      接下来我们来验证一下RS-485接口模式。在RS-485接口模式下,我们需要将RS485/RS232引脚设置为高电平,并且将HDPLX引脚也设置为高电平。我们在MCU程序中配置如下:

      MCEF_RS485_ALLOW(); //RS485模式

      MCEF_HALFDUPLEX_ALLOW(); //半双工

      MCEF_RECIEVE_ALLOW(); //接收

      其他的配置如校验位、波特率等是完全一样的。在这次的应用中,我们设置波特率为115200,8位数据位,1位停止位,无校验的模式。具体配置如下:

    /* UART5初始化 */
    static void UART5_Init_Configuration(void)
    {
      huart5.Instance = UART5;
      huart5.Init.BaudRate = 115200;
      huart5.Init.WordLength = UART_WORDLENGTH_8B;
      huart5.Init.StopBits = UART_STOPBITS_1;
       huart5.Init.Parity = UART_PARITY_NONE;
      huart5.Init.Mode = UART_MODE_TX_RX;
      huart5.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart5.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_UART_Init(&huart5) != HAL_OK)
      {
    ​    Error_Handler();
      }
      
      /*启用串口接收中端*/
      __HAL_UART_ENABLE_IT(&huart5,UART_IT_RXNE);
    }
    

      我们在应用层采用Modbus RTU协议,对于RS-485接口和RS-232接口,这部分是没有区别的。我们在设计中实现了一个94个保持寄存器的从站。

    4、小结

      我们在配置为RS-232模式和RS-485模式时,分别使用RS-232接口和RS-485接口与电脑相连,并使用Modbus主站软件读取下位机的数据,在两种模式下除了接口选择不一样外,其它都是一样的。获取到的数据都是完全正确的,说明电路设计本身是可以运行的。

      我们在两种模式下分别运行了一段时间,每种模式大约进行了3000次左右的访问,没有出现丢包和错误,稳定性也基本可以保证。

    欢迎关注:

    如果阅读这篇文章让您略有所得,还请点击下方的【好文要顶】按钮。

    当然,如果您想及时了解我的博客更新,不妨点击下方的【关注我】按钮。

    如果您希望更方便且及时的阅读相关文章,也可以扫描上方二维码关注我的微信公众号【木南创智

  • 相关阅读:
    react-native 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
    Hibernate HQL和原生SQL查询的一点区别
    JPA project Change Event Handler问题解决[转]
    Webstorm2016激活码[ 转]
    [支付]微信NATIVE扫码支付JAVA实现
    jeecms附件标签用法
    Eclipse查找类路径快捷方式
    第4条:用辅助函数来取代复杂的表达式
    关于python2中的unicode和str以及python3中的str和bytes
    第2条:遵循PEP8风格指南
  • 原文地址:https://www.cnblogs.com/foxclever/p/14967755.html
Copyright © 2020-2023  润新知