본문 바로가기

전자공학/전자회로

USB to UART 설계 !! 기초부터 설계까지 !!

안녕하세요
Edward AHN입니다.

이번 WIZnet의 신제품 WIZ750SR을 제작하면서 USB to UART 설계를 진행하게 되었습니다.

프로젝트를 진행하면서 CP2104를 이용하여 제작하게 되었는데요.

회로설계는 아래 URL의 CP2104의 Datasheet를 참조하여 제작했습니다.

https://www.silabs.com/Support%20Documents/TechnicalDocs/cp2104.pdf


일단 USB to UART니깐, USB가 무엇인지 부터 알아보죠.

USB의 설명은 아래 URL을 참고해주세요.

https://ko.wikipedia.org/wiki/USB

내용 중 아래 그림과 같이 USB는 여러 종류의 Connector가 존재합니다.

이번에 WIZ750SR을 제작하면서 Micro-B type USB Connector를 사용하였는데요.

이와 같이 여러 종류의 USB connector가 있으니 이런게 있다고 알아두시면 좋을 것 같습니다.

일단, USB to UART는 위 여러개의 USB의 커넥터의 그림을 본다면, 4~5개의 pin을 가지고 동작을하죠.

1. VCC

2. D+

3. D-

4. GND

보통 위 4가지를 이용해서 USB와 통신을 하게 됩니다.

보통 VCC는 5V로 동작하죠. 거기에 GND신호가 반드시 있어야 전압차가 분명하기 때문에 GND도 필요하죠.

거기에 D+와 D-는 Differential 신호로써 +와 -를 이용해서 '1' or '0'인 신호를 만드는 거죠. 왜 Differential인지는 정확한 답변은 인터넷으로 찾아보세요.

하지만 간단하게나 설명을 드리자면, Differential을 이용하면 거리가 멀어도 전송 전압이 작아도 '1'과 '0'을 분명히 만들 수 있다는 장점이 있습니다.

실제로 전송선로를 보면 외부로 부터 어떠한 영향을 받아서 저항성분이 생기는데, 이로 인해서 처음에 5V를 보내도 나중에 최종 도착단을 보면 3V, 4V...

이렇게 전압이 Down되어 있습니다. 이렇게 거리가 멀수록 전압이 다운되면 '1'과 '0'을 구분하는 구분점이 점점 사라지기 때문에 이를 2개의 신호로 나누어서 +와 -로 나누게 되는겁니다.

그러면 실제 전압이 작아져도 분명하게 '1'또는 '0'으로 확인이 가능합니다. (아래 사진 처럼)

differential 신호에 대한 이미지 검색결과

일단 USB는 이렇게 사용합니다.

그리고 USB to UART의 경우 Virtual COM Port를 사용합니다.(왠만하면 모든 USB to UART) 

그리고 전부 MCU를 내장하고 있습니다. 이 MCU에는 Virtual COM Port를 사용할 수 있는 기능이 내장되어 있으며, USB로 부터 동작신호가 들어오면 PC에 COM Port가 보여지게 동작합니다.

USB로 부터 5V의 신호레벨이 들어오면 이를 USB to UART (MCU)를 거쳐서 3.3V TTL 레벨로 변환시켜 전달하거나, 아니면 5V레벨로 그대로 전달을 합니다. 이렇게 통신을 하는 것입니다.


여담으로 말씀드리자면,(아래 회로도를 보면) 아두이노 Uno에 사용되는 MCU는 2개 입니다. 1개는 Main동작 MCU(ATMEGA328P), 다른 1개는 USB to UART 동작 MCU(ATMEGA16U2)

USB로 부터 오는 신호를 USB to UART(MCU)가 받아서 이를 설정해놓은 GPIO를 이용해서 Main MCU로 전달해주는 기능을 합니다. 

이 때, PC는 Arduino Uno의 USB connector와 연결하면 USB to UART(MCU)는 Virtual COM Port로 동작하여 PC에서 COM Port가 잡히게 됩니다.

이 상태에서 사용하면 됩니다. FTDI사나 Silicon labs사의 USB to UART도 동작하는 것은 모두 비슷할 것입니다.

그리고 아두이노 우노의 경우, DTR이라는 신호를 이용해서 Firmware upload를 할 때, Main MCU가 ISP모드로 자동접속하게 만들어줍니다.

그래서 Arduino IDE를 사용하여 "업로딩"이라는 버튼을 클릭하면 그 이벤트 신호가 USB to UART(MCU)로 들어가고 위 MCU가 DTR이라는 신호를 트리거링(High&Low)해서 Main MCU를 리셋시키고 bootloader로 진입하게 합니다.

그리고 bootloader에서는 일정 시간안에 stk500 프로토콜에 해당되는 데이터가 들어오면 펌웨어를 업데이트하고, 만약 그렇지 않으면 0번지에 위치한 프로그램으로 jump합니다.

너무 다른 얘기로 빠졌네요..


다시 WIZ750SR의 USB to UART로 넘어가자면,

휴대폰에 사용하는 Cable이 Micro-B type connector에 맞게 설계되어 있습니다.

이런 휴대폰 케이블을 이용하여 USB to UART를 사용할 수 있게 이번 컨셉트를 맞춰서 제작하게 되었는데요.

PC에서는 이런 케이블을 통해 USB to UART로 케이블을 꽂게 되면 5V, 500mA가 내부 회로로 입력되게 됩니다.

5V DC JACK을 사용하는 경우, 보통 DC 어댑터를 사용합니다. DC 어댑터는 기본 5V 1~2A입니다.


이 USB to UART는 Altium Designer로 제작하게 되었는데요.

회로부터 PCB 설계까지 다양하게 제공되고 쉽게 조작이 가능한 Tool입니다.


그럼, 회로부터 보시죠.

위 그림과 같이 CP2104를 이용하여 USB to UART를 설계하였습니다.

회로는 Datasheet를 토대로 그대로 제작하게 되었습니다.


간단하게 설명드리자면,

Micro USB B type으로 5V, GND, D+,D-인 Differencial 신호가 들어오게 됩니다.

그리고 위 신호들은 TVS Diode를 이용하여 ESD Protection을 하였구요.

5V는 Bead를 거쳐 USB_5V 전원 신호로 나오게 됩니다. 위 전원신호가 CP2104 내부에 존재하는 레귤레이터에 입력으로 들어가고, CP2104 내부 레귤레이터에서 3.3V(정확하게는 3.45V)가 출력되어 제어하게 됩니다.

그리고 D+,D-신호는 Damping저항을 부착하여 CP2104로 신호가 입력되게 제작하였습니다.

그리고 0.1uF Capacitor는 Bypass 용도입니다. (노이즈 제거용)

회로 설명은 이정도면 된 것 같구요.

그 밖에 여러 Trouble shooting Guide가 있는데요.

저렇게 설계할 경우, WIZ_Debug_TXD, WIZ_Debug_RXD를 통해서 전류가 전달될 가능성이 있습니다.

그래서 CP2104에서 출력되는 신호도 Damping 저항을 달아 주는 것이 좋습니다.(보통 22R ~ 33R)


감사합니다.