[AVR] 3. ATmega128A UART 통신과 I2C 통신
1. UART 통신이란?
(1) 개요
Universal asynchronous receiver/transmitter의 약자로써, 병렬 데이터를 직렬형태로 바꾸어 데이터를 전달하는 프로토콜(약속)이다. 통신 방법의 한 종류이고, 프로토콜 구현이 매우 간단하지만, 여러 다중 모듈과 통신을 해야하는 시스템에는 그다지 적합하지 않다.
(2) 통신 방법
비동기식 방식이라 클럭을 사용하여 통신하지 않고, TXD(송신부), RXD(수신부) 두 개의 라인으로 이루어져 있어 통신 방법이 매우 간단하다.
사진을 보자.
총 11개의 비트로 이루어져있고, 시작 비트(0)와 종료 비트(1)로 시작과 끝을 나타낸다. ATMEGA128에서는 레지스터를 설정하여 사용할 수 있다.
위 사진은 Comportmaster로 UART 통신했을 때, 오실로스코프로 데이터를 측정한 사진이다. 위와 같이 숫자 '0'과 '5'를 오실로스코프로 측정을 했을 때, START 비트와 STOP비트 사이에 데이터 비트를 보내는 것을 알 수 있다. 하지만 추후에 설명할 I2C 방식과 달리, 2진수 최하위 비트가 제일 먼저 보내진다.
(3) ATmega128A 내에서의 UART 관련 레지스터
UART를 사용하려면 몇 가지 레지스터를 설정해야한다. 이 레지스터들은 다음과 같다.
UDRn (USART I/O Data Register n): 이 레지스터는 데이터를 전송하거나 수신할 때 사용된다. UDRn에 값을 쓰면 송신 버퍼에 데이터가 저장되고, UDRn에서 값을 읽으면 수신 버퍼에서 데이터가 읽혀진다.
UCSRA (USART Control and Status Register A): 이 레지스터는 USART의 동작을 제어하고 상태를 확인하는 데 사용된다. UCSRA 레지스터는 여러 비트 필드로 구성되어 있으며, 이들 비트 필드는 USART의 동작 모드, 오류 상태, 인터럽트 등을 나타낸다.
UCSRB (USART Control and Status Register B): 이 레지스터는 USART의 동작을 제어하고 인터럽트를 사용하는 데 사용된다. UCSRB 레지스터는 USART의 전송, 수신, 데이터 비트 수, 인터럽트 등을 제어하는 비트 필드로 구성되어 있다.
UCSRC (USART Control Register C): 이 레지스터는 USART의 동작 모드를 설정하는 데 사용된다. UCSRC 레지스터는 데이터 비트 수, 패리티 비트, 정지 비트 등을 설정하는 비트 필드로 구성되어 있다.
UBRRnH, UBRRnL (USART Baud Rate Register n High/Low): 이 레지스터는 USART의 통신 속도를 설정하는 데 사용된다. UBRRnH와 UBRRnL 레지스터의 값을 조절하여 통신 속도를 변경할 수 있다.
여기서 속도 제어를 위한 보레이트(Baud Rate)가 사용되는데, 데이터 비트가 전송되는 속도를 나타내는 단위이다. 즉, 보레이트가 높을수록 데이터를 전송하는 속도가 빨라지게 된다. 만약 레지스터를 통해 보레이트를 9600bps로 설정하게 되면, 초당 9600의 비트가 전송되는 속도이다. UART에서는 송신측과 수신측 간의 보레이트가 일치해야 데이터를 정확하게 전송할 수 있다. 보통은 송수신측 모두 동일한 보레이트를 사용하여 통신한다.
(4) ATmega128A 내에서의 UART 인터럽트 벡터
USART0_RX_vect: 이 벡터는 USART0의 수신 버퍼에서 데이터가 수신될 때마다 호출된다. 즉, USART0의 데이터 수신 인터럽트가 발생했을 때 처리되는 벡터이다.
USART0_UDRE_vect: 이 벡터는 USART0의 전송 버퍼가 빌 때마다 호출된다. 즉, USART0의 데이터 전송 인터럽트가 발생했을 때 처리되는 벡터이다.
USART1도 마찬가지로 인터럽트를 처리하는 벡터가 존재하며, USART1_RX_vect와 USART1_UDRE_vect가 각각 USART1의 데이터 수신 및 전송 인터럽트를 처리한다.
2. I2C 통신이란?
(1) 개요
아이-투-씨, 아이-스퀘어-씨, TWI등으로 불리는 I2C 통신은 SCL(시리얼 클락), SDA(시리얼 데이터) 두 라인만을 이용하여 한 시스템 내에서 다수의 모듈과 통신할 수 있는 통신 방법이다.
(2) 통신 방법
클락을 사용하는 동기식 방식으로써, 통신 중에 주소 값을 사용하기 때문에 각 채널 하나의 노드에 여러 모듈과 통신을 할 수 있다는 엄청난 장점이 있다.
UART에서는 패리티 비트를 통해 정상적인 통신이 완료되었는지 확인할 수 있었다. 하지만 I2C통신에서는 통신 중간에 Ark 비트를 사용하여 정상적인 통신이 이루어졌는지 알 수 있다. 통신 시 Flow는 다음과 같다.
SCL 1일 때, SDA는 1에서 0으로 바뀜 (START Bit) - 보내고자 하는 Device의 주소 값 전송 - Write/Read Bit - Ark Bit - 데이터 8비트 전송 - Ark Bit,SCL 1일 때 - SDA는 0에서 1로 바뀜 (STOP Bit)
하지만 보내고자 하는 Device의 주소가 연결이 되지 않거나, 없는 주소일 경우, 데이터 수신에 실패한 경우에는 NArk Bit(1)를 확인하여 전송 실패를 확인할 수 있다.
위 사진은 ATMEGA128에서 CLCD 모듈과 I2C 통신을 했을 때, SCL과 SDA 라인에서 어떤 데이터가 보내지는지 오실로스코프로 확인한 사진이다. 그 이후에는 전에 설명한 방법과 같이, START(0) 비트 - 주소 값 - Write 비트 - Ark 비트 - 데이터 8비트 - Ark 비트 - STOP(1) 비트 순으로 이루어져 있다.
(3) ATmega128A 내에서의 I2C 관련 레지스터
TWBR (TWI Bit Rate Register): TWI 통신의 비트 속도를 설정하는 레지스터이다. 이 레지스터 값을 변경하면, 통신 속도를 조절할 수 있다. UART의 UBRR레지스터에서도 사용되는 보레이트는 마찬가지로 I2C 통신에서도 사용된다. 주로 100kbps, 400kbps, 1Mbps의 보레이트를 사용하는 것으로 알려져있다.
TWSR (TWI Status Register): TWI 통신에서 상태 정보를 나타내는 레지스터이다. 이 레지스터의 값에 따라 현재 통신 상태를 파악할 수 있다.
TWAR (TWI Address Register): Atmega128이 TWI 네트워크에서 사용하는 주소를 설정하는 레지스터이다. 이 레지스터의 값이 Atmega128이 TWI 네트워크에서 인식되는 주소가 된다.
TWDR (TWI Data Register): TWI 통신에서 송수신할 데이터를 저장하는 레지스터이다. 이 레지스터에 저장된 데이터는 TWI 통신을 통해 전송된다.
TWCR (TWI Control Register): TWI 통신을 제어하는 레지스터이다. 이 레지스터를 통해 TWI 통신의 시작, 중지, 전송, 수신 등의 동작을 제어할 수 있다.
TWAMR (TWI Address Mask Register): TWAR 레지스터와 함께 사용되는 레지스터이다. TWAR 레지스터에서 설정한 주소 값 중에서, 마스킹할 비트를 설정하여 TWAMR 레지스터 값과 AND 연산을 수행한 결과를 주소 값으로 사용할 수 있다.
(4) ATmega128A 내에서의 I2C 인터럽트 벡터
TWI 벡터 (TWI_vect): TWI/I2C 통신에서 발생하는 인터럽트는 이 벡터에서 처리된다. TWI 컨트롤 레지스터(TWCR)의 TWINT 플래그가 설정되면 이 벡터에서 TWI 인터럽트가 발생한다.