[AVR] UART(2)

<USART 블록 다이어그램>


위 그림과 같이 구조는

  1. 클럭 발생부분
  2. 송/수신부분
  3. 레지스터(USCRA, UCSRB, UCSRC)

세 부분으로 구성되어있다.

<UART 관련 레지스터>

(1) 종류
  • UDRn : USARTn I/O Data Register
  • UCSRnA : USART Control and Status Register A
  • UCSRnB : USART Control and Status Register B
  • UCSRnC : USART Control and Status Register C
  • UCSRnL & UCSRnH : USART baud rate register
    (cf. n이란 USART0과 USART1에서 0과 1을 의미함 USART0 사용한다면 n=0)
(2) 설명(datasheet p.167~)
  • UDRn
  1. 정의
    UART I/O Data Register
  2. 역할
    송/수신 시 데이터를 쓰거나 읽는 레지스터
  3. 동작
    송신 시 UCSRA Register의 UDRE Flag가 Set 될 때, Tx buffer에 쓸 수 있으며, Tx buffer에 데이터를 쓸 때는 TXEN이 set 되어야 한다.
  • UCSRA
  1. 정의
    USART Control and Status Register A
  2. 역할
    USART의 통신 상태를 나타내는 읽기 전용 레지스터
    • RXC(bit 7) : USART Receive Complete
    • TXC(bit 6) : USART Transmit Complete
    • UDRE(bit 5) : USART Data Register Empty
    • FE(bit 4) : Frame Error
    • DOR(bit 3) : Data Overrun
    • PE(bit 2) : Parity Error
    • U2X(bit 1) : Double the USART Transmission Speed
    • MPCM(bit 0) : Multi-processor Communication Mode
  3. 동작
    • datasheet(p.168) 참고
  • UCSRB
  1. 정의
    USART Control and Status Register B
  2. 역할
    USART의 통신 상태를 나타내는 읽기 전용 레지스터
    • RXCIE(bit 7) : RX Complete Interrupt Enable
    • UDRIE(bit 6) : TX Complete Interrupt Enable
    • UDRIE(bit 5) : USART Data Register Empty Interrupt Enable
    • RXEN(bit 4) : Receiver Enable
    • TXEN(bit 3) : Transmitter Enable
    • UCSZ2(bit 2) : Character Size
    • RXB8(bit 1) : Receive Data Bit 8
    • TXB8(bit 0) : Transmit Data Bit 8
  3. 동작
    • datasheet(p.169) 참고
  • UCSRC
  1. 정의
    USART Control and Status Register C
  2. 역할
    USART의 통신 상태를 나타내는 읽기 전용 레지스터
    • URSEL(bit 7) : Register Select(UCSRC와 UBRRH를 공유하고있어서 모드를 선택. 1이면 UCSRC, 0이면 UBRRH)
    • UMSEL(bit 6) : USART Mode Select(Asynchronous:0, Synchronous:1)
    • UPM1:0(bit 5:4) : Parity Mode(2비트를 사용한 4 Mode)
    • USBS(bit 3) : Stop Bit Select(Stop bits 개수 설정. 0이면 1bit 사용, 1이면 2bit 사용 의미)
    • UCSZ1:0(bit 2:1) : character Size(UCSRC에는 UCSZ0, UCSZ1존재하고, UCSRB에는 UCSZ2가 존재. 이 3bit로 Character Size 설정)
    • UCPOL(bit 0) : Clock Polarity(Synchronous mode only. clock edge 설정)
  3. 동작
    • datasheet(p.170-171) 참고
  • UBRRL and UBRRH
  1. 정의
    USART Baud Rate Registers
  2. 역할
    전송 속도(Baud Rate) 설정
    • URSEL(bit 7) : Register Select(UCSRC와 UBRRH를 공유하고있어서 모드를 선택. 1이면 UCSRC, 0이면 UBRRH)
    • Reversed Bits(bit 14:12)
    • UBRR11:0(bit 11:0) : USART Baud Rate Register
  3. 동작
    • datasheet(p.171-172) 참고

<UART 코드 분석>

(1) Init

알아보기에 앞서 RXEN과 TXEN같이 레지스터 값들은 #include<avr.io.h>안에 iom32a.h에 모두 포함되어있다.

UART 시작에 앞서 관련 레지스터들을 모두 세팅해준다.
1. UBBRH와 UBRRL로 baudrate를 설정
2. USCRB의 RXEN과 TXEN Set을 통해 Tx/Rx가 가능하게 한다.
3. URSEL로 UCSRC를 Select하고 USBS와 UCSZ0으로 Stop bit 설정과 Size 설정을 해준다.

(2) Write

  1. Transmit하기 전 Transmit buffer가 비워져야 하기때문에 비워지기 전까지 while문을 돌린다. UCSRA에서 UDRE(USART Data Register Empty)의 값이 1이 되기를 기다린다.
  2. 전송할 data를 UDR에 넣어준다.

(3) Read

  1. 수신된 data를 모두 읽어 UDR에 옮기면 RXC(USART Receive Complete)가 set된다.
  2. 읽어온 data가 들어있는 UDR 값을 return 한다.
(요약)

칩의 레지스터 동작이 어떻게 되는지 모른 채 오픈소스를 갖다 쓰는 일만 했었는데 동작을 하나하나 뜯어보니 이해가 훨씬 수월하다. 특히 처음 사용하려 했던 코드의 칩은 ATmega128이었기 때문에 사용할 ATmega32a에 맞춰 Register 설정을 다시 해주었는데 이를 공부하며 정리한 글이다.
이번 공부를 통해 다른 통신을 다룰 때도 도움이 될 것이다.
(ppt로 정리를 해왔지만 이것도 나름 괜찮은 것 같다)

//#define F_CPU 16000000UL
#define F_CPU 8000000

#include <avr/io.h>
#include "uart.h"  //uart library file

int main(void)
{
  unsigned char data;
  uart_initialize();                           //initialize uart module
  write_uart_strg("Enter the character\n\r");
    while (1) 
    {
	data=read_uart();                        //receive data
	write_uart(data);                        //transmit the received data
    }
}
(참고자료)

레지스터 -> https://mystyle1057.tistory.com/entry/USART
추후 공부 계획(송신, 수신 동작 자세히) -> http://contents.kocw.or.kr/contents4/document/lec/2013/Mokwon/Parksejun/12.pdf

좋은 웹페이지 즐겨찾기