基于MAX3160的多协议接口通讯设计

接口/总线/驱动

1143人已加入

描述

在一些应用需求中,我们需要对外部提供串行通讯端口,但这些端口所通讯的目标设备各有不同,接口协议也有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

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

RS485

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

2、应用设计

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

RS485

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

RS485

  在上述电路图中,我们实现了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次左右的访问,没有出现丢包和错误,稳定性也基本可以保证。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分