본문 바로가기
Study/Coding

UART 간단하게 스위치하기

by LovEnable 2020. 12. 18.

하나의 UART 포트에 추가적인 통신 모듈을 통해 서로 통신을 해야하는 경우가 있습니다.

다음의 경우에는 UART포트에 USB와 블루투스를 함께 통신해야하는 경우입니다. 그런데 문제는 다음의 연결을 모두 만족해야 합니다.

  • UART <-> USB
  • UART <-> 블루투스
  • USB   <-> 블루투스

스위치를 달거나 모듈을 달았다 뺏다 할 수 있으면 좋겠지만, 그럴 수 없는 경우입니다.

이런 경우에 UART를 74HC4066 IC를 사용하여 스위치를 쓰듯이 사용할 수 있습니다.

 

4066 부분의 회로만 가져온 모습입니다. (실제 적용한 모델은 74HC4066PW 입니다.)

  • UART_CTR_A0
  • UART_CTR_A1
  • UART_CTR_B0
  • UART_CTR_B1

네개의 핀을 제어해서 MCU의 TX와 RX를 USB와 BT모듈에 선택적으로 연결하게 됩니다.

 

아두이노용의 코드는 다음과 같습니다. 


#define UART_CTR_A0   A0
#define UART_CTR_A1   A1
#define UART_CTR_B0   A4
#define UART_CTR_B1   A5

void UART_MODE_INIT()
{
  pinMode(UART_CTR_A0, OUTPUT);
  pinMode(UART_CTR_A1, OUTPUT);
  pinMode(UART_CTR_B0, OUTPUT);
  pinMode(UART_CTR_B1, OUTPUT);
}

void MCU_USB_MODE_SET()
{
  digitalWrite(UART_CTR_A0, HIGH);
  digitalWrite(UART_CTR_A1, LOW);
  digitalWrite(UART_CTR_B0, LOW);
  digitalWrite(UART_CTR_B1, LOW);
}

void MCU_BT_MODE_SET()
{
  digitalWrite(UART_CTR_A0, LOW);
  digitalWrite(UART_CTR_A1, LOW);
  digitalWrite(UART_CTR_B0, HIGH);
  digitalWrite(UART_CTR_B1, LOW);
}

void BT_USB_MODE_SET()
{
  digitalWrite(UART_CTR_A0, LOW);
  digitalWrite(UART_CTR_A1, HIGH);
  digitalWrite(UART_CTR_B0, LOW);
  digitalWrite(UART_CTR_B1, HIGH);
}

 

보시는대로 세개의 UART 방식을 모두 선택가능합니다.

대신에 4개의 I/O 핀을 사용한다는 문제점이 발생힙니다.