1. UART 통신에 대해
모든 체계에는 기초가 되는 것이 있다면 통신에는 UART(Universal Asynchronous Receiver and Transmitter : 범용 비동기식 송수신기)가 그 기초가 된다. 개발 초기인 1960년대에는 회사마다 같은 기능을 다른 이름으로 쓰다가 1970년대에 이 명칭으로 정착하였는데, 이름과 같이 매우 여러 곳에 쓰이며 비동기식 전이중 통신이다. 이 UART 통신을 상세히 알아본다.
2. UART 통신 결선도
그림과 같이 UART
통신의 결선도는 TX에서 RX로 송신하는 회선과
기준선(GND)가 전부이다. 송신하는 장치와 수신할 수 있는
장치는 항상 1개인 1:1
통신이 된다. 두 장치는 사전에 통신속도와 데이터 구조를 정하고 이것에 맞춰서 송신하면
수신 측에서는 속도와 구조가 일치하는지 확인하고 데이터를 받아들인다. 이 통신이 지원하는 속도는 정해진 것이 없으며 1 Mbps 이하에서 무리가 없지만 상대 장치의 요구사항에 따르는게 보통이다.
단, 설정하는 기준 클럭에 따라 오차율이 심한 경우 정상동작을 하지
않을 수 있으니 미리 확인할 필요가 있다. 기준 클럭은 크리스탈과 같은 전용 소자로 발진하는 것이 더
정확하니 장시간 사용한다면 RC발진기로 생성하기보다 전용 소자를 쓰는 것이 좋다. 더불어 개인적으로는 클럭에서 분주한 주파수와 통신속도 사이의 오차율이 2% 이상이라면
쓰지 않을 것을 권한다.
3. UART 통신 데이터 프레임
데이터 프레임은 그림과 같이 5구간으로 나눌 수 있다. 통신을 하지 않는 상태를 대기(Idle)상태로 논리 ‘1’의 값을 가진다. 이후 통신을 시작하는 의미로 ‘0’값을 가지는 시작(Start) 비트로 시작하여 데이터(Data)를 전송한다. 그리고 필요에 따라 패리티(Parity) 비트가 추가될 수도 있으며
마지막에 ‘1’값을 가지는 정지(Stop) 비트로 끝난다. 추가적인 통신이 없다면 그대로 ‘1’인 상태의 대기상태가 계속되고, 통신이 있다면 ‘0’값을 가지는 시작 비트로 계속된다.
이 중 데이터는 실제로 전달하는 정보로 필요에 따라 4, 5, 6, 7, 8비트
중 하나로 설정할 수 있으며 최하위 비트부터 전송한다. 패리티 비트의 경우 짝수(Even) 패리티와 홀수(Odd) 패리티 중 하나를 선택해야 하고
계산범위는 데이터 전체에 대한 연산결과로 결정한다. 패리티가 없다(None)면
데이터 프레임에서 제거되고 시작, 데이터, 정지 비트만 남게
된다. 마지막의 정지 비트는 필요에 따라 1, 1.5, 2비트
중 하나를 선택하여 ‘0’의 길이를 결정한다.
가장 자주 쓰이는 설정은 ‘8 데이터 비트, 패리티 없음, 1 정지 비트’로
줄여서 ‘8-N-1’로도 쓰인다. 예시로 ‘8-N-1’구조로 ‘A’, ‘B’(아스키)를 연속통신으로 전송한다면 아래와 같다.
4. UART 수신
UART 수신기는 제품마다 조금씩 다르나 설정한 통신속도의 8배(Baud×8) 또는 16배(Baud×16) 높은 내부용 고주파수 클럭을 사용하여 수신한 상태를 확인한다. 즉, 1 Mpbs의 통신을 진행하는데 8 MHz 또는 16 MHz가 필요한 셈이다. 바꿔 말하면 수신기의 내부 클럭을 데이터의 확인에 사용하고 이 클럭을 분주하여 통신속도를 결정하므로 최대속도에 제약이 생기는 원인이기도 하다.
그림과 같이 시작 비트의 하강 에지를 기준으로
클럭 배율의 절반위치(비트의 1/2 위치)에 있는 3개 클럭 시점의 값을 읽는다. 즉, 16배일 때 7, 8, 9번째(8배라면 3, 4, 5번째)값을
읽는데 이 3개의 결과 중 2개 이상의 논리를 신호로 인식한다.
시작 비트의 가운데에서 읽어 ‘0’으로 인식하지 않는다면 시작 비트를 오인한
것으로 판단하여 다시 시작 비트의 하강 에지까지 대기한다. 이어 데이터의 수신도 시작 비트와 동일하게
첫 데이터의 절반위치인 23, 24, 25번째에서 읽어 2개
이상의 논리를 값으로 읽고 데이터가 끝날 때까지 같은 방법을 반복한다. 마찬가지로 정지 비트의 가운데서
확인하되 ‘1’로 인식하지 않는다면 해당 데이터 프레임은 오류로 처리한다. 즉, ‘8-N-1’, 내부 16배
클럭일 때, 시작 비트인 ‘0’을 인식한 시점부터 143, 144, 145번째 클럭에서 정지 비트인 ‘1’을 인식해야
하며 인식하지 못 하면 오류가 된다.(시작 비트의 하강 에지부터 151,
152, 153번째)
이러한 수신의 문제 때문에 송신부에서 클럭을 분주하였을 때 정해진 속도에 일치하는 것이 좋다. 그러나 환경상 항상 일치할 수 없으니 그 오차를 확인하는데, 이것을
오류율(Error rate)이라고 부르고 아래와 같이 계산한다.
((Baud-CLK×PRS)÷Baud)×100 [Baud : 통신속도(bps), CLK : 내부 클럭(Hz), PRS : 분주비]
‘8-N-1’, 16배 기준에서 이 오차가 5%를 초과할 경우 동작하지 않을 가능성이 높다.
5. USART 통신
UART가 비동기 통신이었다면 이것에 클럭 회선을 추가하여 동기통신으로 바꾸고 이름을 USRT(Universal Synchronous Receiver and Transmitter : 범용 동기식 송수신기)로 부른다. 수신기가 인식할 때는 같이 받은 클럭에 따라 인식하므로
내부 고주파수 클럭이 필요 없게 된다. 분주에 의한 오류율이 없어지며 통신속도가 향상되어 10 Mbps 이상으로도 동작이 가능하다. 단, 클럭을 한 장치에서 관리해야 하므로 반대쪽에서는 클럭이 올 때까지 송신을 대기한다. 이 때 클럭을 전송하여 송신을 요청하는 쪽을 마스터(Master, 주인) 또는 제어장치(Controller)로, 클럭을 받아 응답으로 송신하는 쪽을 슬레이브(Slave, 부하) 또는 대상장치(Target)로 부른다.
속도의 상승이라는 장점이 있지만 UART에 비해서는 거의 쓰이지 않는데, 그 정도의 속도가 필요하지 않거나 대부분의 제품에서 USRT를 지원하지
않기 때문이다. 그 외에도 데이터의 판단을 클럭을 기준으로 하므로 시작 비트와 정지 비트는 필요가 없어지는데도
데이터의 프레임에 맞게 남아 있어야 하는 불합리가 있다.
그럼에도 드물게 쓰이는 경우가 있어 제조사에서는 UART로도 USRT로도 사용이 가능하도록 두 가지를 합쳐서 생산하며 이것을 USART(Universal
Synchronous/Asynchronous Receiver and Transmitter : 범용 동기/비동기식 송수신기)라고 부른다.
6. 결론
UART 통신은 외부용 유선통신이나 무선통신으로 전환될 때 자주 쓰이니 반드시 알고 넘어가도록 한다.
댓글 없음:
댓글 쓰기