임베디드에서의 UART, I2C, SPI 사용 비교

직렬 전송방식

임베디드 시스템에서 통신으로 가장 많이 사용하는 것이 UART, I2C, SPI다. 이들은 모두 직렬 전송 방식이다. 병렬 전송방식은 데이터 전송을 위한 단자와 선이 많이 필요하기 때문에 직렬 대비 속도가 빠름에도 선호되지 않는다. 단자와 선이 많으면 단가가 올라간다.

개인적인 경험상 그림의 TI AMIC110과 같은 모든 SoC는 UART, SPI, I2C 인터페이스를 모두 내장하고 있었다.

UART, I2C, SPI 요약

UART

CPU에서 나온 병렬 데이터를 직렬 데이터로 바꾸어 전송하는 하드웨어다. 이 직렬 데이터의 전송은 송신선(TX)과 수신선(RX)이 각각 따로 있기 때문에 데이터를 양방향으로 동시에 전송할 수 있다. 이를 전이중(Full Duplex)통신이라고 한다.

UART를 풀어쓰면 Universal Asynchronous Receiver Transmitter인데, 여기서 Asynchronous를 사전에 검색하면 비동기라고 나온다. 통신에서의 비동기는 전송 데이터를 클록이라는 특정 신호에 맞춰서 전송하지 않는다는 뜻이다. 직렬로 데이터를 계속 전송하면 수신자는 데이터를 어디서부터 어디까지 끊어 읽어야 하는지 알 수 없다. 그런데 1초당 하나의 데이터를 보낸다고 약속하면 보내는 사람과 받는 사람이 같은 초시계를 보고 정확하게 데이터의 시작과 끝을 확인하여 수신할 수 있다. 여기서의 초시계 역할을 클록으로 대신하면 동기 통신 방식이다. 그런데 클록을 이용하지 않고 데이터 시작과 끝에 시작점과 끝점이라고 각각 태그를 붙여서 보내는 방법도 있으며 송신부와 수신부의 속도를 동일하게 만들어서 전송하는 방법도 있다. 이를 비동기 통신방식이라고 한다. UART는 송신부와 수신부의 통신속도인 Baud Rate를 일치시켜서 전송하는 비동기 통신방식이다.

Full Duplex(전이중 통신), Half Duplex(반이중 통신), Simplex(단방향 통신) 정리

I2C

UART가 비동기라면 I2C는 동기식이다. 따라서 데이터를 전송하는 선(SDA) 이외에 클록선(SCL)이 따로 존재한다. 그런데 UART가 데이터를 전송하기 위한 선만 두 개인데 I2C는 클록선까지 있는데도 선이 총 두 개다. 데이터를 전송하는 선이 하나밖에 없기 때문에다. 데이터를 전송하는 선이 하나뿐이면 송신과 수신을 같은 선을 이용해야 하기 때문에 송신과 수신을 동시에 하지 못한다. 이를 반이중(Half Duplex)이라고 한다.

I2C는 UART와는 다르게 하나의 하드웨어(Master)가 여러 하드웨어(Slave)와 연결할 수 있다. 즉 하나의 하드웨어는 여러 하드웨어와 데이터를 송수신할 수 있는데, 이때도 데이터선(SDA)은 하나뿐이라 한 번에 하나의 하드웨어랑만 통신할 수 있다. 또한 하나의 하드웨어라고 지칭한 Master는 복수개가 될 수 있어서 N:N 통신이 가능하다.

SPI

SPI는 동기식이며 하나의 하드웨어(Master)가 여러 하드웨어(Slave)와 연결할 수 있다는 점에서 UART보다는 I2C와 유사하다. 다만 클록선(SCK) 이외에도 데이터 선이 송신(MOSI), 수신(MISO) (송신과 수신은 Master 기준) 두 개이므로 전이중 통신이다. 이외에도 여러 하드웨어 중 하나를 선택하는 신호선(SS)이 있다. 그러나 I2C와는 다르게 Master는 하나만 가질 수 있다.

UART, I2C, SPI 비교

UARTI2CSPI
동기/비동기비동기동기동기
관계 수1:1N:N1:N
선 수2 (TX, RX)2 (SDA, SCL)4 (SCK, MISO, MOSI, SS)
이중통신전이중반이중전이중
전송 거리UART 대비 짧음UART 대비 짧음
전송 속도느림SPI 대비 느림빠름

UART, I2C, SPI 주 사용처

UART

임베디드 개발 환경에서 가장 쉽게 접할 수 있는 예는 디버깅이다. 일반적으로 디스플레이가 없는 임베디드 시스템은 print문을 PC와 연결해서 콘솔을 통해 봐야 한다. 이때 PC와 보드의 연결 방법으로 UART가 가장 흔하게 쓰인다. UART는 태생이 1:1 통신 방식이며 I2C와 SPI보다 긴 전송 거리를 가지고 있다.(I2C와 SPI는 선이 많아서 장거리로는 부적합하다.) 따라서 PCB 내부에서의 통신이 아닌 외부 통신에 주로 이용된다.

UART에 RS232를 연결하는 이유

I2C

I2C는 다수의 하드웨어와 연결이 가능하다. 그리고 다수의 하드웨어와 연결이 가능한 것 치고는 선의 개수도 적은 편이라 다수의 센서들과 연결하기 용이하다. 또한 I2C는 속도가 느리기 때문에 데이터보다는 제어 용도로 많이 활용된다.

SPI

SPI는 고속으로 데이터를 운반해야 하는 프로세서 간, 프로세서와 플래시 메모리 간 통신으로 활용된다. 이외에도 고속이 필요한 곳에는 SPI가 활용된다.

QSPI(Quad SPI) 사용 이유

참고

https://www.quora.com/Why-is-UART-preferred-over-I2C-and-SPI

https://www.basic4mcu.com/bbs/board.php?bo_table=o1&wr_id=90

https://blog.naver.com/PostView.nhn?blogId=nortul&logNo=221139711208

Leave a Comment