본문 바로가기

CS 모음

[통신] UART, SPI, I2C 통신이란?

안녕하세요 인포돈 입니다.


통신이란?

우리는 앞선 제목을 이해하기 위해서 통신이 무엇인지 간략하기 짚고 넘어갈 필요가 있다.

 

통신을 나누는 기준은 정말 다양한다. 우리 주변에서 통신이라고 할 수 있는 것들을 모두 떠올려 보자. 기본적으로 TV와 리모컨 / 컴퓨터의 인터넷 / 무전기 / 블루투스 / WIFI 이외에도 정말 다양한 통신을 활용해오고 있다.

 

그렇다면, 우리는 이러한 통신들을 사용하기 위해서는 어떠한 통신이 무엇을 어디로 보내기 위해 활용되고 있는지 알아야 한다.

 

 => 기본적으로 통신은 데이터를 주고받는 행위들을 의미한다.

 

 그렇다면 어떻게 통신을 분류할 필요성이 있다. 통신을 분류하는 여러 기준점들이 있다.

 - 직렬/병렬

 - 단방향/양방향

 - 유선/무선

 - 동기식/비동기식

 - 베이스밴드/브로드밴드

 - 아날로그/ 디지털

 - 기저대역/대역통과

 - 선형/비선형

....

 

정말 다양한 기준을 통해서 통신을 나눌 수 있다. 본문에서는 이러한 모든 기준을 다루기 어렵기 때문에 제목처럼 해당 통신들을 분류할 수 있는 기준을 직렬 vs 병렬의 기준으로 분류하는 방식을 소개하려 한다.

 


직렬 vs 병렬

흔히 우리가 들어보았을 법한 직렬과 병렬의 개념이다. 

 

 - 직렬 통신 : 데이터를 직렬의 데이터로 보내는 형태를 의미

 - 병렬 통신 : 데이터를 병렬의  데이터로 보내는 형태를 의미

 그렇다면 이렇게 다른 통신 방식을 왜 사용할까?

 

이 질문에 합당한 답을 내놓을 수 있어야 우리는 앞선 UART, SPI, I2C통신에 대한 이해를 할 수 있다. 통신에서 가장 중요한 것이 무엇일까? 당연히 빠르고 정확하게 데이터를 송/수신하는 것이다.

 그렇다면 당연히 직렬의 방식보다 한 번에 여러 개를 보내는 병렬의 통신이 좋다고 생각할 수 있다. 그러나 우리는 항상 비용의 문제와 정확성의 문제를 고려해야 한다.

 

병렬의 데이터의 경우 서로 다른 선을 통해 데이터를 보내기 때문에 타이밍의 문제가 생길 수 있으며, 선과 포트가 많아 짐에 따라 비용이 당연히 더 비싸질 수밖에 없다. 쉽게 말해서 비용은 높아지고 신뢰성을 직렬보다는 낮아지게 된다. 그렇다면 우리는 이러한 통신 방법을 적절하게 활용할 줄 알아야 한다.

 

만약 내가 구성하고 있는 통신의 형태에 따라서 각 통신의 단점을 커버할 수 있는 방식을 활용해야 한다. 쉽게 말해서 비용이 충분하고 통신의 거리가 짧다면 병렬 통신이 당연히 좋은 선택지가 될 수 있다.

 

그러나 통신의 거리가 멀어지고 정확성을 요구하는 통신의 경우 직렬 통신이 올바른 선택일 수 있다. 이렇게 우리는 어떤 통신이 우리에게 필요한지 고심을 해야 한다. (물론 현 트렌드는 직렬 통신을 주로 많이 활용하고 있다.)


본격적으로 UART, SPI, I2C 통신을 이해하기 전에 간략한 지식을 이해하자

 

 1) 직렬 통신의 데이터 전송

 직렬 통신은 기본적을 1바이트 데이터를 6개의 비트로 쪼개 한번에 1BIT씩 통신 ㅅ너로를 통해 전송을 하는 방식이다. 이때 8개의 비트 범위를 식별하기 위해서 Start, End Bit를 추가해 총 10Bit의 데이터를 송수신하게 된다. (물론 이런, Start, End Bit를 활용하지 않고 패리티 비트를 활용해 데이터의 범위를 식별하는 방식도 있다.)

 

 2) Baud Rate - BPS

 Baoud Rate는 사실상 보내는 데이터의 속도를 의미한다고 생각하면 된다. 이때, 수신 측과 송신 측의 Baud Rate를 일치시켜에 데이터의 혼동이 없어진다. (쉽게 이해해 보면, 보내는 속도와 읽는 속도가 다르다면, 데이터가 엉켜질 수 있다는 의미다.)

 

 3) 동기 통신 vs 비동기 통신

통신에서의 동기/비동기는 clk의 유무로 판단한다. 동기의 경우 clk신호를 활용하고 비동기의 경우 clk신호를 활용하지 않는다는 점에서 있다. 직렬 통신에서는 CLK 신호를 통해서 데이터의 범위를 시별 할 수도 있다.

 

 4) RS-232 / RS-422 / RS-485

 기본적으로 직렬 비동기식 통신을 UART 통신이라고 부른다. 이때 UART에서 나오는 신호는 보팅 TTL 신호 레벨을 갖기 때문에 노이즈에 약하고, 통신거리에 제약이 있다. 따라서 이러한 TTL 신호를 입력받아 노이즈에 강하고 통신거리를 길게 해 주기 위해 인터페이스 IC를 호 라용 하는데 이런 대표적인 예시가 RS-232, RS-433, RS-485라고 이해하자.

 

 * TTL 신호란?

 입력 전압은 Low는 0.8V, High는 2.0V이고 출력 전압은 Low 0.4V, High는 2.7V이다. 여기서 0 ~0.8V의 전압이라면, Low로 인식을 하고 2~5V의 전압이라면 High로 인식하지만 0.8~2.0V의 영역은 입력되지 않은 것으로 인식하는 신호를 의미한다.

 


 앞선 지식을 통해서 인제 3가지의 통신을 이해해 보자

 

 1) UART

UART는 병렬 데이터를 직렬 데이터로 바꾸어 전송하는 하드웨어이다. 이때 TX(송신), RX(수신)이 따로 있기 때문에 양반향으로 데이터를 전송할 수 있다. 일반적으로 통신에서의 비동기는 전송데이터를 CLK신호에 맞춰서 전송하지 않는다는 의미이다. 그렇게 되면 수신자의 경우 송신자가 보내는 데이터의 범위를 식별하기 위해 여러 방법을 활용하기도 한다. 앞서 설명한 Start, End Bit를 활용하는 방식, Baud Rate를 일치시켜 보내는 방식을 활용하여 데이터를 보내는 통신 방법이다.

 

 2) I2C

I2C의 경우 UART와는 다르게 동기식 직렬 통신 방법이다. 이때 데이터를 전송하는 선 이외에 CLK신호를 주는 선이 따로 존재하며 데이터를 전송하는 선이 1개이기에 한 번에 송수신을 동시에 진행하지 못한다. UART와 다르게 하나의 하드웨어(Master)와 여러 하드웨어(Slave)에 연결할 수 있으며, 이때도 데이터를 전달하는 선은 1개뿐이라 여러 개와 연결되어 있어도 통신은 하나씩 해결해야 한다.

 

 3) SPI

SPI의 경우 I2C의 업그레이드 버전이라고 생각하면 편하다. I2C의 경우 데이터 선이 하나뿐이었다면, SPI는 송신(MOSI), 수신(MISO) 2가지의 데이터 통신 선을 가지고 있다. 따라서 손신을 하면서 받을 수 있다. 그러나 I2C와의 차이점이라면 여러 개의 Master를 가질 수 없다는 점이다.

 

3가지의 통신 방식을 정리하자면 아래 표와 같다.

 

 

이러한 사전 지식을 가지고 현재 자신이 사용하고 있는 분야에서 데이터를 통신하려 할 때 필요한 통신 방식을 올바르게 선택할 수 있어야 한다.