티스토리 뷰

입문

UART - 원리와 연결

Just4Fun 2016. 3. 29. 22:30

처음 계획은 AVR 내부 기능과 관련된 내용을 모두 설명한 다음, 이어서 다른 디바이스와의 정보를 교환하는 방법인 UART, TWSI, SPI에 대해서 설명하려고 하였다.  그러나 이미 앞에서 다룬 LED 온도계처럼 확인하고 싶은 내용을 LED를 이용하여 표시하다보니 보고싶은 결과를 한눈에 쉽게 알아볼 수 없는 불편함이 있었다.  

앞으로 이어질 내용인 타이머/카운터나 ADC 등등 여러가지 기능을 설명하기 위하여 중간 중간 I/O 레지스터에 어떤 값이 들어가 있는지 수시로 확인하여야 한다. 이를 위하여 C에서 사용하는 가장 기본적인 printf()를 사용하고 싶은데, 이미 이 블로그의 앞 부분에서 printf()함수를 사용해도 아무것도 표시되지 않는것을 확인 하였다.  그렇다면 임베디드 환경에서는 어떻게 printf()와 같은 기능을 사용할 수 있는지 먼저 설명을 하는것이 좋을것 같아 글의 순서를 바꾸기로 하였다.

결론부터 얘기하면 UART 통신을 이용하면 AVR 프로그램에서 만든 디버깅 메시지를 컴퓨터 화면에서 볼 수 있다.  따라서 UART에 대한 설명과 AVR에서 UART 통신을 하는 방법에 대해서 설명하기로 하겠다.

위의 그림에서 보이는것처럼 UART는 주로 디바이스와 디바이스간에 혹은 디바이스와 컴퓨터간에 1:1 통신을 하기위하여 사용되며 송신라인과 수신라인이 따로 있어 동시에 송수신이 가능하다.  이렇게 동시에 송수신이 되는것을 full-duplex(전이중) 방식이라고 한다.  이와 다르게 송신과 수신을 동시에 할 수 없는것을 half-duplex(반이중) 방식이라고 한다.  대표적인 full-duplex 통신은 전화기이다.  말을 하는것과 상대방의 말을 듣는것을 동시에 할 수 있다.  이와 대비되는 half-duplex 방식의 대표적인 통신으로는 무전기가 있다.  무전기는 평소에는 수신 상태로 있다가 말을 할 때에만 송신 버튼을 누른후에 말을 하여야 한다.  이 순간에는 수신이 불가능하다.

UART는 Universal Asynchronous serial Receiver and Transmitter의 앞글자를 딴것이다.  범용 비동기 직렬 송수신기라고 번역할 수 있을것이다.  여기서 중요한 것은 asynchronous(비동기) 라는 것이다.   동기는 무엇이고 비동기는 무엇인가?  쉽게 말해서 데이터가 클럭신호에 동기가 되는지 그렇지 않은지로 구별되는 것이다.  위의 그림에서처럼 데이터라인만 있고 클럭 신호가 없는것을 비동기 통신이라고 한다.  이미 앞에서 비동기 통신을 다루어 보았다. 바로 DS18B20을 이용한 온도계 프로젝트에서 1-Wire 통신을 해본 경험이 있다.  DS18B20의 경우는 0과 1의 데이터 신호 길이를 다르게하여 데이터를 주고 받았다.  그 이유는 앞에서 이미 말했듯이 DS18B20 내부에 정확한 시간을 제공하는 오실레이터가 없기 때문에 비트값에 따라 많은 시간차를 주어 '0'과 '1'을 구별할 수 있는 방법을 선택하였던 것이다.  UART는 이와 다르게 양쪽 디바이스에 매우 정확한 오실레이터를 각각 가지고 있다는 전제를 두고 통신을 수행한다.

위의 그림이 AVR datasheet 문서에 나와 있는 UART 데이터 프레임 포맷이다.  Idle상태에서는 신호가 high 상태로 유지된다.

송신측에서 데이터를 내보내기 직전에, 지금부터 데이터 송신을 시작할테니 수신측에서 데이터 받을 준비를 할것을 알려주기 위하여 신호를 low상태로 만들고 1비트 길이를 유지한다.  그 다음에는 양측에서 미리 약속된 길이만큼의 비트 데이터를 LSB에서부터 차례로 전송한다.  비트 데이터 길이는 5~9비트이다.  데이터길이는 그때 그때 변경할 수 있는게 아니라 송수신측에서 한번 길이를 정하면 계속 같은 크기의 데이터를 주고 받아야 한다.  데이터 전송이 완료되면 오류 검출을 위하여 패리티 비트를 보낸다. 패리티 비트는 옵션사항이므로 양쪽의 약속에 의하여 생략할 수 있다.  패리티 비트 다음에는 데이터 프레임의 끝을 알려주는 stop 데이터를 보내는데 high 시그널을 만들어 주는것이다.  stop 비트의 길이는 1비트, 1.5비트 혹은 2비트이다.   일반적으로 데이터 길이는 8비트로, 패리티비트는 사용하지 않고, stop 비트는 1비트를 사용한다.

수신하는 측에서는 신호를 계속 모니터 하고 있다가 신호가 high에서 low 상태로 변경되면 지금부터 데이터가 들어오겠구나 판단하여 데이터를 받을 준비를 한다.

위의 그림은 AVR에서 start bit을 검출하는 방법을 표시한 것이다.  신호의 falling edge를 검출하면 1비트 길이의 16배의 클럭속도로 신호를 샘플링한다.  Falling edge에서부터 8,9,10번째 신호를 검출하여 1로 검출되는 비트가 2개나 3개가 되면 이것은 start bit가 아니고 노이즈에 의한 신호의 출렁임이라고 판단한다.  그러나 0으로 검출되는 신호가 2개나 3개가 되면 start bit으로 판단하여 다음 bit 위치에서 데이터를 읽게 된다.

역시 data bit도 start bit와 마찬가지로 8,9,10번째 샘플링 값을 읽어 그 값이 2개나 3개가 되는 값을 유효한 데이터라고 판단한다.  그림상으로는 신호가 일직선으로 보이지만 실제 전선을 통하여 들어오는 신호는 바다의 파도처럼 높낮이가 불규칙할 수가 있어서 1인지 0인지 판단하기 어려울때가 있다.  AVR에서는 그런 이유로 가운데 하나만 샘플링하는게 아니라 세개의 샘플링을 수행하여 많은 샘플링데이터를 유효한 하나의 비트값으로 받아들이는 것이다.

Stop bit도 위의 방법과 같이 비트 길이의 중간에서 신호를 샘플링하여 신호레벨이 high가 되는지 읽어본다.

위의 그림에서와 같이 송신측과 수신측은 서로 정확한 비트의 길이를 알고 있어야 한다.  그러나 다음글에서 설명하겠지만 실제로는 송신측과 수신측에 약간의 오차를 가질수밖에 없다.  그렇게 되면 샘플링하는 위치가 조금씩 당겨지거나 밀리게 되어 마지막 비트 검출할 때에는 data bit와 stop bit의 경계 지점에서 샘플링하는 불상사가 발생하게 된다.  그런 경우 데이터가 깨지게 되는 현상이 발생하는 것이다.

지금까지는 UART 프로토콜이 어떻게 생겼는지, 송신측과 수신측에서는 어떻게 데이터를 주고받는지 설명하였다.

그럼, 이제 AVR과 컴퓨터를 물리적인 선을 사용하여 연결하는 방법에 대해서 설명하도록 하겠다.  AVR에는 UART 연결에 사용되는 TXD, RXD라는 각각의 핀이 지정되어 있다.  컴퓨터에는 serial 통신을 할 수 있는 COM port라는 것이 있다.  이들을 서로 연결하면 UART 통신을 할 수 있게 된다.

위 그림은 데스크탑 뒷면에서 볼 수 있는 각종 포트를 보여주고 있다.

위 그림은 노트북에 있는 각종 포트를 보여준다.  아마 이런것들이 있었는지조차 생각나지 않을 수도 있고, 본 기억이 있어도 어디에 사용되는지 모를수도 있을것이다.  따라서 요즘에는 이런 포트들을 거의 사용하지 않음에 따라 아예 없는 경우가 대부분이다.

위의 그림에서 제일 왼쪽에 있는것은 모니터와 연결되는 포트이고, 가운데 있는것이 UART를 사용하기 위한 serial 포트이다. 그리고 오른쪽에 있는것이 주로 프린터와 연결하는데 사용되는 parallel 포트이다.

가운데 있는 serial 포트는 흔히 RS-232 포트라고도 부른다.  흔히 UART와 RS-232가 같은거라고 알고 있는 경우가 있는데, UART와 RS-232는 전혀 별개의 명칭이다.  그러나 서로 밀접하게 사용하기 때문에 더러 이러한 오해를 하곤한다.  

UART가 논리적인 프로토콜을 의미하는 반면 RS-232는 물리적인 연결 방법을 정의한다.

위의 그림에서 아래 부분에 보여지는 신호는 CPU의 핀에서 나오는 UART 신호 레벨을 보여주는 것이고, 위에 보이는 신호는 COM 포트를 통해서 나오는 RS-232 신호를 보여주고 있다.  UART에서 나오는 신호가 단순히 '0'과 '1'이라면 RS-232에서는 Space와 Mark라고 부른다.

Space는 +3~+15V 사이의 전압값을 가지고 Mark는 -3~-15V사이의 전압값을 가진다.  따라서 AVR과 컴퓨터의 COM 포트를 서로 연결하기 위해서는 AVR에 RS-232 접속을 위한 별도의 장치를 추가하여야 한다.  한국에서 사용하던 TV를 미국에 가져가서 보려면 미국의 100V 전압을 220V 전압으로 변환해주는 트랜스를 사용하여야 하는것과 같은 이치이다.

이미 얘기했듯이 요즘엔 컴퓨터에서 COM포트를 사용할 수 없는 경우가 많고 USB를 사용하는것이 일반적이므로, USB로 serial 통신할 수 있는 방법이 많이 나와 있다.

위의 그림과 같은 부품을 이용하면 USB 포트로 serial 통신을 할 수 있다.  위의 사진 아래부분에 네개의 핀이 보이는데 VCC, GND, TXD, RXD가 있다.  VCC는 5/3.3V 전원을 선택할 수 있으므로 보드전원으로 사용할 수 있고, TXD는 AVR의 RXD에, RXD는 AVR의 TXD핀에 연결하면 된다.

컴퓨터와 AVR간에 UART 연결된 모습을 볼 수 있다.

위와 같은 연결을 이용하여 AVR에서 필요한 디버깅 메시지를 컴퓨터에서 보는 방법을 설명하도록 하겠다.


입문 과정 목차

'입문' 카테고리의 다른 글

UART - 수신  (0) 2016.04.03
UART - 송신  (6) 2016.04.01
_delay_ms  (10) 2016.03.27
LED 온도계 3  (6) 2016.03.24
LED 온도계 2  (5) 2016.03.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함