天天看點

通訊接口應用筆記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的接口協定要求。其引腳定義及封裝如下:

通訊接口應用筆記2:MAX3160實作多協定通訊

  從上述的引腳定義中我們可以知道, 我們可以通過RS485/RS232、HDPLX等引腳來确定接口的工作模式。當RS485/RS232和HDPLX引腳配置為低電平時,MAX3160工作在RS-232模式。當RS485/RS232引腳配置在高電平時,HDPLX引腳為高電平工作在RS485模式,HDPLX引腳為低電平工作在RS422模式。官方給出的配置方式如下圖所示:

通訊接口應用筆記2:MAX3160實作多協定通訊

  我們在應用MAX3160時,根據我們的應用需求來配置RS485/RS232和HDPLX引腳就能得到我們想要的接口模式。我們也可以通過MCU來控制這些引腳以便在需要時動态修改接口模式。

2、應用設計

  有了前面關于MAX3160的基礎知識,我們來根據需求設計我們的需要的應用。在官方給出的資料手冊中提供了了一個應用參考,在其中能實作帶硬體流控制的RS-232接口和RS-422之間的切換電路圖:

通訊接口應用筆記2:MAX3160實作多協定通訊

  在上述電路圖中,雖然闡述了接口模式切換的原理,但我們計劃的應用并沒有這麼複雜。在我們的應用需求中,我們希望可以實作RS-232和RS-485接口的動态切換,我們隻需要一組RS-232接口也沒有RS-422的應用需求,同時我們也不考慮硬體流控制。在應用于RS-485模式時,我們需要使用15腳來控制RS-485的收發方向,而且在RS-485和RS422模式下第7腳是不使用的,是以我們可以設計相關的應用如下圖:

通訊接口應用筆記2:MAX3160實作多協定通訊

  在上述電路圖中,我們實作了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次左右的通路,沒有出現丢包和錯誤,穩定性也基本可以保證。

歡迎關注:

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時了解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更友善且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公衆号【木南創智】

繼續閱讀