(1) UART ?
: UART는 Universal Asynchronous Receiver & Transmitter의 머릿글자로서 비동기 통신을 위한 전용 하드웨어를 뜻한다.
 

(2) 데이터 송수신

○ 송신
: 데이터를 송신하려면 프로세서가 타이머를 사용하여 미리 정한 직렬 통신 속도에 맞추어 병렬 데이터를 한 비트씩 출력 핀으로 내보내야 한다. 물론 시작 비트와 정지 비트도 함께 출력해야 한다.
 
○ 수신
 : 수신의 경우는 조금 더 어렵다. 수신 핀의 상황을 계속 검사하거나 또는 인터럽트를 사용하여 시작 비트가 수신되는지 여부를 확인해야 한다. 그리고 일단 시작 비트의 수신이 확인되면 그때부터 정해진 통신 속도에 맞추어 한 비트씩 값을 읽어 저장해야 한다.
            
이러한 작업은 어렵지는 않지만 매우 번거롭기도 하고 마이크로프로세서가 다른 일을 할 수 있는 시간을 뺏는 결과를 가져온다.


(3) UART의 역할
: UART는 비동기 통신에 필요한 이런 직렬-병렬 데이터 변환 작업을 자동으로 해주는 하드웨어 장치이다.
그렇기 때문에 비동기 통신을 해야 한다면 UART가 꼭 필요하다고 할 수 있다. PC에는 16550이라는 이름의 UART IC가 사용되는데 이처럼 UART가 독립된 제품으로 판매되기도 하지만 거의 대부분의 마이크로컨트롤러는 내부에 하나 이상의 UART를 가지고 있다. 만일 마이크로 컨트롤러가 가지고 있는 UART의 수보다 더 많은 비동기 통신 채널이 필요하다면 외부에 UART IC를 추가로 연결해서 사용하면 된다.


(4) UART의 레지스터
: UART에는 적어도 네 개 정도의 레지스터가 포함되어 있으며 각 레지스터의 주소는 UART의 기본 주소 (base address)에 옵셋 (offset) 값을 더한 값으로 정의된다. CPU는 UART 레지스터에 값을 쓰거나 레지스터 값을 읽는 방법으로 간단하게 비동기 통신을 진행할 수 있다. 다음은 UART의 동작에 반드시 필요한 레지스터들이다. 마이크로컨트롤러에 따라 이 레지스터들의 이름은 조금씩 다를 수도 있다.


TxD (송신 데이터) 레지스터
UART로 송신할 데이터를 쓰기 위한 레지스터이다. CPU가 이 레지스터에 값을 기록하면 미리 정해둔 직렬 통신 속도 및 다른 여러 설정에 맞추어 그 값이 한 비트씩 직렬로 출력된다. TxD 레지스터에 어떤 값을 기록하면 이 시점부터 마지막 비트가 출력될 때까지 시간이 걸리므로 이전에 기록한 값의 송신이 완료되기 전에 TxD 레지스터에 새로운 값을 기록하면 안 된다. 이전 데이터의 송신이 완료되었는지 여부는 상태 레지스터를 읽어 확인할 수 있다.

RxD (수신) 레지스터
수신용 핀으로 한 비트씩 입력되어 수신 완료된 데이터가 저장되는 레지스터이다. 상태 레지스터를 읽어서 새로운 데이터가 수신되었다는 것을 확인하면 CPU는 이 레지스터의 값을 읽으면 된다. 이 레지스터에 저장된 값은 다음 데이터가 수신되는 동안은 그대로 유지되지만 다음 데이터의 수신이 완료되는 순간 새로운 값으로 갱신된다. 따라서 데이터 손실을 막기 위해서는 다음 데이터의 수신이 완료되기 전까지는 CPU가 이 레지스터의 값을 읽어 저장해야 한다.

제어 (control) 레지스터
UART의 동작에 필요한 여러 설정을 하기 위한 레지스터이다. 정지 비트의 길이, 패리티 (parity) 비트의 사용 유무, 통신에 사용할 패킷의 길이 등을 설정한다. UART를 동작시키기 전에 반드시 제어 레지스터를 적절하게 설정해야 한다.

상태 (status) 레지스터
UART의 상태를 나타내는 레지스터이다. 상태 레지스터의 각 비트는 특정한 의미를 가지고 있다. 예를 들면, 수신 완료 (receive complete) 비트가 1이면 새로운 데이터가 수신되어 RxD 레지스터에 저장되어 있음을 뜻하며, 송신 완료 (transmit complete) 비트가 1이면 TxD에 저장한 값의 출력이 완료되었음을 뜻한다. 이 외에도 TxD 레지스터가 비어 있는지 여부를 알려주는 비트를 가지고 있기도 하다. 상태 레지스터의 각 비트는 인터럽트와 연결되어 있어서 인터럽트가 활성화되어 있다면 어떤 비트가 1로 설정되는 순간 해당 인터럽트 핸들러 (interrupt handler)가 자동으로 호출된다.

baud rate 설정 레지스터
직렬 통신의 속도인 보 (baud) 값을 설정하기 위한 레지스터이다. 여기에 설정한 통신 속도에 따라 직렬-병렬 변환 속도가 결정된다. baud 값은 통신에서의 변조율 (modulation rate)을 나타내는 단위이므로 baud rate는 초당 전송되는 비트의 수를 뜻하는 bps와는 의미가 다르다. 그러나 한 심볼 (symbol)이 한 비트에 해당할 때 baud 값과 bps 값은 같기 때문에 유선 통신에서는 흔히 bps와 구분 없이 사용되고 있다.


직렬 통신의 비트율 즉, baud rate가 정해지면 한 비트의 시간 폭이 결정된다. 예를 들어 통신 속도를 38,400 baud로 한다면 한 비트의 시간 폭은 1/38,400 초가 된다. 시작 비트와 정지 비트가 각 1 비트씩이라면 한 바이트의 데이터를 송신하는데 1/3,840 초가 걸린다. 사용자가 지정한 baud rate에 맞추어 UART가 직렬-병렬 데이터 변환을 하려면 타이머 (카운터)가 반드시 필요하다. baud rate에 비례하는 주파수를 가진 신호가 있어야 하기 때문이다. 8051 계열 마이크로컨트롤러에서는 내부 타이머 중 하나가 이 용도로 지정되어 있어 직렬 통신을 사용할 때 그 타이머는 다른 용도로 사용할 수 없다. AVR 마이크로컨트롤러의 경우에는 사용자가 프로그래밍 가능한 타이머 이외에 UART용의 전용 카운터가 따로 있다.







※ 출처 : http://eslectures.blog.me/80137860924

'T heory > Comn Basics' 카테고리의 다른 글

반 이중 통신 & 전 이중 통신  (0) 2011.10.18
USB(Universal Serial Bus)  (0) 2011.10.18
I2C(Inter Integrated Circuit)  (18) 2011.10.17
GPIO(General Purpose I/O) (2)  (0) 2011.10.17
SPI(Serial Peripheral Interface Bus)  (2) 2011.10.17
by 민트앤라떼 2011. 10. 17. 17:46