Summary: UART, SPI, I2C, CAN은 임베디드에서 흔히 쓰는 직렬 통신 방식으로, 클럭 사용 여부·장치 선택 방식·다중 노드 지원·노이즈 내성에서 갈린다. UART는 클럭이 없는 1:1 비동기 통신, SPI는 클럭 기반 고속 통신, I2C는 두 선으로 여러 IC를 주소로 구분하는 버스, CAN은 차동 신호로 여러 제어기를 잇는 견고한 버스다. 이 글은 각 방식의 정의·배선·속도/거리·사용처와, 임베디드에서의 선택 기준을 정리한다.
UART란?
UART(Universal Asynchronous Receiver/Transmitter)는 클럭선을 따로 두지 않는 비동기식 직렬 통신이다. 공유 클럭이 없으므로 송신기와 수신기가 미리 같은 통신 조건을 맞춰야 한다. 흔히 쓰는 설정은 baud rate 115200, 데이터 8비트, 패리티 없음, 정지 1비트이며, 이를 묶어 8N1이라 부른다. 프레임은 Start Bit | Data 5~9bit | Parity(옵션) | Stop Bit(1개 이상) 형태다. 클럭이 없는 만큼 양쪽 baud rate 오차가 너무 크면 수신 오류가 난다.
배선

| 항목 | 내용 |
| 필수 신호선 | TX, RX |
| 실제 최소 배선 | TX + RX + GND, 총 3선 |
| 추가 가능 신호 | RTS, CTS 같은 하드웨어 Flow Control |
| 연결 구조 | 기본적으로 1:1 |
| 주소 지정 | 없음 |
| 다중 장치 연결 | UART 자체만으로는 부적합 |
주소 지정이 없고 연결이 1:1이기 때문에, 여러 장치를 한 버스에 묶는 용도로는 UART 자체만으로는 부적합하다.
속도와 거리에는 표준 상한이 없고 MCU·클럭·전압 레벨·배선 품질에 따라 달라진다. 흔한 baud rate는 9600, 57600, 115200, 921600이다. MCU 간 직접 TTL UART는 보드 내부나 매우 짧은 케이블에 적합하고, 긴 거리나 노이즈 환경에서는 UART 신호를 그대로 쓰지 않고 RS-232 또는 RS-485 트랜시버를 붙인다. 즉 UART는 데이터 프레임 방식을 정의할 뿐, 긴 거리의 전기적 안정성은 별도의 물리 계층이 담당한다.
사용위치로는 USB-UART 디버거, GPS·BLE·Wi-Fi 모듈, Raspberry Pi↔ESP32, LiDAR·산업용 센서 등이 있다.
예를 들어 Raspberry Pi ─UART(JSON)─ ESP32 ─ TB6612FNG ─ Motor 구조에서 UART는 상위 제어 명령을 모터 제어 펌웨어로 전달하는 데 쓰인다. 다만 제어기가 여럿이고 배선이 길고 모터 노이즈가 강한 환경이라면 UART보다 CAN이나 RS-485가 더 적합하다.
SPI란?
SPI(Serial Peripheral Interface)는 클럭을 사용하는 동기식 고속 직렬 통신이다. Controller가 클럭을 만들고 Target 장치가 그 클럭에 맞춰 데이터를 주고받는다. 최근 문서는 Master/Slave 대신 Controller/Target, MOSI/MISO 대신 COPI/CIPO라는 표현을 쓰기도 하지만, 실제 데이터시트와 코드에는 아직 MOSI/MISO가 훨씬 많이 보인다.
배선

| 신호 | 역할 |
| SCLK | Controller가 만드는 클럭 |
| MOSI | Controller → Target 데이터 |
| MISO | Target → Controller 데이터 |
| CS / SS | 특정 Target 선택 |
| GND | 기준 전압 공유 |
기본 4선은 SCLK + MOSI + MISO + CS이며, 실제로는 GND까지 필요하므로 최소 5선으로 본다. 여러 Target을 붙일 때는 SCLK/MOSI/MISO를 공유하고 장치마다 CS 선을 따로 둔다.
특징
| 항목 | 내용 |
| 동기 방식 | Clock 사용 |
| 전송 방식 | 일반적으로 Full-duplex |
| 주소 | 없음 |
| 장치 선택 | CS 핀 |
| 속도 | MCU·Target 데이터시트에 따라 결정 |
| 거리 | PCB 내부 또는 장비 내부의 짧은 거리 |
| 단점 | 장치가 많아질수록 CS 핀이 많이 필요 |
SPI는 규격 전체에 공통된 속도 상한이 있는 방식이 아니어서 "SPI는 무조건 몇 MHz"라고 말하면 틀린다. 실제 속도는 MCU와 연결 대상의 데이터시트가 결정하며, 임베디드에서는 수 MHz에서 수십 MHz 범위가 흔하다. 주소가 없어 장치 선택을 CS 핀으로 하기 때문에, 장치가 많아질수록 CS 핀도 그만큼 늘어난다는 점이 단점이다.
사용처는 SPI Flash, SD Card, 고속 ADC/DAC, RF 모듈, 고속 IMU, UWB 모듈 등이다(예: ESP32-S3↔DWM3000 UWB). 짧은 거리에서 빠르게 데이터를 주고받아야 하는 장치, 즉 샘플링 주기가 높거나 처리량이 큰 장치에 적합하다.
I2C란?

I2C(Inter-Integrated Circuit)는 두 개의 신호선으로 여러 IC를 연결하는 동기식 버스다.
배선
| 신호 | 역할 |
| SDA | 양방향 데이터 |
| SCL | Clock |
| GND | 기준 전압 공유 |
신호선은 SDA, SCL 두 개이고 GND까지 포함하면 최소 3선이다. 핵심은 두 선이 Open-drain/Open-collector 구조라는 점이다. 장치가 High를 직접 출력하지 않고 Low로만 끌어내리며, High는 Pull-up 저항으로 만들어진다. 이 구조 덕분에 여러 장치가 한 버스를 공유할 수 있다. 또한 I2C는 주소 기반 통신이어서 SPI의 CS 핀 없이도 여러 장치를 구분한다.
속도
| 모드 | 최대 속도 |
| Standard-mode | 100 kbps |
| Fast-mode | 400 kbps |
| Fast-mode Plus | 1 Mbps |
| High-speed mode | 3.4 Mbps |
| Ultra Fast-mode | 5 Mbps (단방향 특수 모드) |
다만 실제 센서 모듈 대부분은 100 kHz 또는 400 kHz만 지원한다. MCU가 1 MHz나 3.4 MHz를 지원해도 센서가 지원하지 않으면 쓸 수 없다.
거리에는 단일 수치가 없다. 케이블 길이 자체보다 전체 버스 정전용량, Pull-up 저항값, 신호 상승 시간, 통신 속도, 분기 구조가 한계를 정한다. 일반 I2C 버스는 총 정전용량 제한이 약 400 pF이므로 기본적으로 PCB 내부나 장비 내부의 짧은 거리에 적합하고, 케이블이 길어지거나 센서가 많아지면 속도를 낮추거나 버퍼·리피터·차동 확장기를 써야 한다.
사용위치로는 온습도·조도·ToF 센서, RTC, EEPROM, 저속 IMU, OLED 등이다(예: ESP32↔VL53L0X ToF, ESP32↔LSM6DS3 IMU). 선 수를 줄이면서 여러 저속 센서를 한 MCU에 붙일 때 가장 적합하다.
CAN이란?
CAN(Controller Area Network)은 차량·로봇·산업장비에서 여러 제어기를 안정적으로 연결하기 위해 만든 통신 버스다. UART·SPI·I2C와 달리 처음부터 모터 노이즈, 긴 배선, 여러 제어기, 전기적 간섭, 메시지 충돌, 일부 노드 오류 같은 환경을 전제로 설계되었다. 배선은 선형 버스가 원칙이고 양 끝에 보통 120 Ω 종단 저항을 둔다. 별 모양으로 길게 분기하면 반사파 문제가 생기므로 기본 CAN 배선에는 부적합하다.

배선
| 구분 | 내용 |
| 데이터선 | CANH, CANL |
| 통신 방식 | 차동 신호 |
| 최소 데이터 배선 | 2선 |
| 실제 배선 | CANH/CANL + GND 기준선, 필요 시 실드 |
| 종단 저항 | 버스 양 끝에 보통 120Ω |
| MCU 연결 | MCU CAN Controller ↔ CAN Transceiver ↔ CANH/CANL |
여기서 중요한 점은 MCU의 CAN_TX/CAN_RX 핀을 CANH/CANL에 직접 연결하면 안 된다는 것이다. CAN 트랜시버가 MCU의 로직 신호를 차동 CAN 신호로 변환하는 역할을 한다.
MCU CAN_TX/RX → CAN Transceiver → CANH/CANL Bus
속도와 거리
| 종류 | 속도 | 거리 |
| Classical CAN | 최대 1 Mbps | 1 Mbps 기준 약 40 m |
| CAN FD | 중재 구간은 CAN 속도, 데이터 구간만 더 빠름 | 속도↑일수록 거리·stub 제약↑ |
| CAN FD 실사용 | 대체로 최대 5 Mbps | 5 Mbps에서는 더 짧은 버스 필요 |
| CAN FD 최적 설계 | 최대 약 8 Mbps 가능 | 매우 짧고 정교한 설계 필요 |
대표 기준은 1 Mbps, 버스 길이 40 m, 짧은 stub다. 속도를 낮추면 더 긴 거리를 구성할 수 있지만, 그 비율은 케이블·트랜시버·노드 수·분기 길이·노이즈 환경에 따라 달라진다. CAN FD는 데이터 구간을 더 빠르게 보내며 실사용에서는 대체로 5 Mbps 이하가 현실적인 상한이고, 최적화된 조건에서 8 Mbps 수준까지 본다.
CAN이 UART/SPI/I2C보다 강한 이유
| 기능 | CAN |
| 노이즈 내성 | 차동 신호라 강함 |
| 다중 노드 | 다수 노드가 같은 버스 공유 |
| 충돌 처리 | 메시지 ID 우선순위 기반 중재 |
| 오류 검출 | CRC, ACK, Bit Monitoring 등 |
| 오류 격리 | 오류가 반복되는 노드를 Bus-off로 격리 |
| 사용 환경 | 차량, 로봇, 산업 장비, 배터리 시스템 |
사용처는 차량 ECU 간 통신, 모터 제어기↔상위 제어기, 배터리 BMS↔인버터, 로봇 관절 제어기↔메인 제어기, 산업용 PLC↔센서·액추에이터, AGV/AMR↔모터 드라이버·안전 제어기 등이다. 예컨대 UGV가 Raspberry Pi와 ESP32 한 대만 쓴다면 UART로 충분하지만, 모터 제어기 둘에 배터리 BMS, 센서·카메라·안전 제어기까지 늘어나면 UART를 여러 개 두는 것보다 CAN 버스에 각 제어기를 노드로 붙이는 편이 배선·확장성·오류 처리·노이즈 내성 면에서 낫다.
임베디드에서의 선택 기준
네 방식은 결국 클럭 유무, 장치 선택 방식, 다중 노드 지원, 노이즈 내성이라는 축에서 갈린다.
- 단순한 1:1 명령·디버그 연결 → UART
- 짧은 거리에서 빠른 데이터 전송 → SPI
- 여러 저속 센서를 적은 배선으로 연결 → I2C
- 여러 제어기를 긴 배선·노이즈 환경에서 연결 → CAN
| 상황 | 우선 선택 |
| ESP32 로그를 Mac에서 보기 | UART |
| Raspberry Pi가 ESP32에 모터 명령 전송 | UART |
| ESP32에 UWB, Flash, 고속 IMU 연결 | SPI |
| ESP32에 ToF, RTC, 저속 IMU, OLED 연결 | I2C |
| 차량형 UGV의 모터 제어기·BMS·안전 제어기 연결 | CAN |
| 자동차 ECU 통신 | CAN / CAN FD |
| 여러 센서를 한 보드에 붙이기 | I2C |
| SD 카드·외부 Flash에 빠르게 접근 | SPI |
'WiSoft' 카테고리의 다른 글
| UART와 RS-232·RS-422·RS-485의 동작과 차이 (1) | 2026.06.28 |
|---|---|
| 채터링, 디바운싱, 엣지 검출과 Pull-up·하드웨어 회로 (0) | 2026.06.28 |
| 배열 리스트와 링크드 리스트 (0) | 2026.06.26 |
| 비대칭키 암호화와 대칭키 암호화 (0) | 2026.06.18 |
| BST의 최악의 경우의 예와 시간 복잡도 (0) | 2026.06.17 |