1. 개요
임베디드 시스템에서 마이크로컨트롤러(MCU)와 주변 장치 간의 데이터 교환을 위해 다양한 통신 프로토콜이 사용됩니다.이 중 대표적인 직렬 통신 방식으로는 UART(Universal Asynchronous Receiver/Transmitter), SPI(Serial Peripheral Interface), I2C(Inter-Integrated Circuit)가 있습니다. 각 프로토콜은 신호선의 개수, 데이터 전송 방식, 속도 등의 차이로 인해 특정 응용 분야에 적합한 형태로 활용됩니다. UART는 간단한 비동기 통신을 제공하며, SPI는 고속 데이터 전송이 가능하고, I2C는 다수의 장치를 하나의 버스로 제어할 수 있는 특징이 있습니다. 이 글에서는 각 프로토콜의 개념, 특징, 활용 사례 및 C 코드 예제를 살펴보겠습니다.
2. UART (Universal Asynchronous Receiver/Transmitter)
2.1 정의
UART는 클럭 신호 없이 두 장치 간 데이터를 직렬 방식으로 송수신하는 비동기 통신 프로토콜입니다. 데이터를 전송할 때 시작(Start) 비트, 데이터 비트, 패리티(Parity) 비트, 정지(Stop) 비트를 사용하여 데이터를 구성하며, 송신과 수신 속도를 일치시키기 위해 보드레이트(Baud Rate)를 설정해야 합니다. 일반적으로 115200 등의 보드레이트가 많이 사용됩니다.
UART 프레임 구조를 시각적으로 이해할 수 있도록 표 형태로 정리해 보았습니다.
비트 구성 | 설명 |
Start 비트 | 데이터 전송 시작을 알리는 신호 (1비트, 항상 LOW) |
데이터 비트 | 실제 전송되는 데이터 (5~9비트, 일반적으로 8비트) |
패리티 비트 | 오류 검출을 위한 선택적 비트 (없음, 짝수, 홀수 설정 가능) |
Stop 비트 | 데이터 전송 종료를 나타내는 신호 (1~2비트, 항상 HIGH) |
2.2 특징
- 비동기 통신: 별도의 클럭 신호 없이 송수신 장치가 동일한 보드레이트(Baud Rate)를 설정해야 함.
- 간단한 인터페이스: 송신(TX)과 수신(RX) 두 개의 선만으로 데이터 전송 가능.
- 속도 제한: 보드레이트가 높아질수록 오차 발생 가능성이 커짐.
- 단점: 다중 노드(Multi-node) 지원이 어렵고, 마스터-슬레이브(Master-Slave) 방식이 없음.
2.3 C 코드 예제
#include <stdio.h>
#include <avr/io.h>
#define BAUD 9600
#define MYUBRR F_CPU/16/BAUD-1
void UART_init(unsigned int ubrr) {
UBRR0H = (unsigned char)(ubrr >> 8);
UBRR0L = (unsigned char)ubrr;
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}
void UART_transmit(char data) {
while (!(UCSR0A & (1 << UDRE0)));
UDR0 = data;
}
int main() {
UART_init(MYUBRR);
while (1) {
UART_transmit('A');
}
}
UART 적용예로는 Xmodem, Ymodem 등과 같이 장치대 장치 통신이 널리 사용하고 있습니다. 아래 링크들을 참고 하세요.
Xmodem 데이터 전송 (Frame)
우선 통신에서 많이 언급되고 있는 프로토콜(Protocol)과 프레임(Frame)의 정의및 차이점을 알아 보겠습니다. 다음 표를 통해 패킷과 프로토콜의 주요 차이점을 쉽게 이해할 수 있습니다. 패킷은 데
rlawnsgh.tistory.com
Xmodem 데이터 전송 (Protocol)
Xmodem 프로토콜은 파일 전송에 사용되는 초기의 통신 프로토콜 중 하나로, 데이터(파일)를 128바이트 또는 1024바이트 단위의 프레임으로 나누어 전송합니다. ※ 데이터나 파일을 전송하는 과정을
rlawnsgh.tistory.com
Xmodem 데이터 전송 (padding)
Xmdoem으로 파일이나 데이터를 전송하는 일이 필요한 경우가 있습니다. Target B'd에 특정 config 파일이나 데이터를 전송하거나, Bootloader에서 application을 올리는 경우가 가장 대표적일 것 입니다. Xmode
rlawnsgh.tistory.com
3. SPI (Serial Peripheral Interface)
3.1 정의
SPI(Serial Peripheral Interface)는 클럭 신호를 사용하여 동기식으로 데이터를 전송하는 프로토콜로, 마스터-슬레이브 구조를 따릅니다. 이 프로토콜은 데이터 전송을 위해 총 4개의 주요 신호선인 MOSI(Master Out Slave In), MISO(Master In Slave Out), SCLK(Serial Clock), SS(Slave Select)를 사용합니다. SPI는 빠른 데이터 전송 속도를 제공하며, 높은 전송 속도가 요구되는 장치 간의 통신에 적합합니다. 주로 센서, 저장 장치, 디스플레이 모듈 등에서 사용되며, 빠르고 효율적인 데이터 교환이 필요한 시스템에서 유용하게 사용됩니다.
3.2 특징
- 동기식 통신: 클럭 신호를 기반으로 데이터를 전송하므로 속도가 빠름.
- 풀 듀플렉스(Full-Duplex) 지원: 동시에 송수신 가능.
- 멀티 슬레이브 지원: 각 슬레이브마다 개별 SS 라인을 사용.
- 단점: 많은 GPIO 핀을 필요로 함 (슬레이브 개수 증가 시 SS 핀 필요).
3.3 C 코드 예제
#include <avr/io.h>
void SPI_init() {
DDRB |= (1 << PB3) | (1 << PB5) | (1 << PB2);
SPCR |= (1 << SPE) | (1 << MSTR) | (1 << SPR0);
}
void SPI_transmit(char data) {
SPDR = data;
while (!(SPSR & (1 << SPIF)));
}
int main() {
SPI_init();
while (1) {
SPI_transmit(0x55);
}
}
4. I2C (Inter-Integrated Circuit)
4.1 정의
I2C는 두 개의 선(SCL, SDA)만을 사용하여 여러 개의 장치를 연결하는 동기식 직렬 통신 프로토콜입니다. 마스터-슬레이브 구조를 가지며, 각 슬레이브는 고유한 주소를 가지고 있습니다.. 하나의 마스터가 여러 개의 슬레이브를 제어할 수 있으며, EEPROM, 센서, RTC 등의 장치에서 자주 사용됩니다. 이렇게 여러 개의 장치를 하나의 버스로 연결하는 방식을 멀티드롭(Multi-Drop) 버스 또는 공유 버스(Shared Bus) 구조라고 합니다. I2C는 하나의 마스터가 여러 슬레이브를 주소를 통해 선택하여 통신하는 구조이므로 멀티 슬레이브(Multi-Slave) 방식도 포함됩니다. (RS-425 폼함)
4.2 특징
- 동기식 통신: 클럭 신호(SCL)를 사용하여 데이터 전송.
- 멀티 마스터 지원: 하나의 버스에 여러 마스터가 존재 가능.
- 소프트웨어적으로 구현 가능: GPIO를 활용한 소프트웨어 I2C 가능.
- 속도 제한: 표준 모드(100kbps), 고속 모드(400kbps), 초고속 모드(3.4Mbps) 등.
- 단점: 데이터 충돌 가능성 존재, SPI보다 속도가 느림.
4.3 C 코드 예제
#include <avr/io.h>
void I2C_init() {
TWSR = 0x00;
TWBR = 0x47;
TWCR = (1 << TWEN);
}
void I2C_start() {
TWCR = (1 << TWSTA) | (1 << TWEN) | (1 << TWINT);
while (!(TWCR & (1 << TWINT)));
}
int main() {
I2C_init();
while (1) {
I2C_start();
}
}
5. 통신 프로토콜 비교
특징 | UART | SPI | I2C |
통신 방식 | 비동기 | 동기 | 동기 |
데이터 선 수 | 2개(TX, RX) | 4개(MOSI, MISO, SCLK, SS) | 2개(SDA, SCL) |
다중 장치 연결 | 불가능 | 가능(멀티 슬레이브) | 가능(멀티 마스터/슬레이브) |
속도 | 보드레이트에 따라 다름 | 매우 빠름(수 MHz 이상) | 상대적으로 느림(최대 3.4Mbps) |
주요 활용 | 디버깅, 모니터링 | 센서, 디스플레이 | 저속 센서, EEPROM |
6. 결론
UART, SPI, I2C는 각각 다른 특성과 장점을 가진 통신 프로토콜로, 응용 분야에 따라 적절한 선택이 중요합니다. SPI는 고속 데이터 전송이 필요할 때 유리하며, 간단하고 직관적인 통신을 원할 경우 UART가 적합합니다. 반면, I2C는 여러 장치 간의 효율적인 통신을 지원하고, 여러 장치를 동시에 제어해야 하는 경우에 적합합니다. 각 프로토콜은 특정 상황에서 장점이 있으므로, 사용 목적에 맞는 프로토콜을 선택하는 것이 핵심입니다.
내용에 대한 질문이 있다면 언제든지 댓글로 남겨 주세요!
'Embedded Program' 카테고리의 다른 글
실시간 운영체제(RTOS) vs 베어메탈 – 언제 RTOS를 써야 할까? (0) | 2025.02.08 |
---|---|
펌웨어 디버깅 기법 – JTAG, SWD, 시리얼 로그 활용법 (0) | 2025.02.07 |
임베디드 시스템에서 효율적인 전력 관리 방법 (0) | 2025.02.04 |
인터럽트(Interrupt)와 폴링(Polling)의 차이점과 최적의 선택법 (1) | 2025.02.04 |
마이크로컨트롤러(MCU) 선택 가이드 - 어떤 칩이 나에게 맞을까? (0) | 2025.02.03 |