만져보는 임베디드 시스템/아두이노 소프트웨어

아두이노 소프트웨어-xx. I2C와 SPI 통신

hanjinee 2021. 1. 5. 13:37

안녕하세요 제타지니입니다. 이번 포스트의 주제는 직렬/병렬 통신을 제외한, 다른 통신들입니다.

아두이노 - PC 사이에서 사용되는 통신으로는 Serial 통신을 제외하고도 다른 통신이 몇 가지 있는데요.

이번 포스트에서는 그 '다른'통신들을 알아보려고 합니다. 

바로, I2C와 SPI 통신입니다. 하나하나 차근차근 설명히 해볼게요

 

I2C(Inter-Integeracted Circuit)와 SPI(Serial Peripheral Interface)는 마이크로 컨트롤러와 주변 장치 사이에 디지털 정보를 간편하게 전송할 수 있는 방법을 제공하기 위해 만들어진 통신 프로토콜입니다. 아두이노 소프트웨어에는 기본적으로 I2C와 SPI 통신을 위한 라이브러리인 WIRE라이브러리와 SPI 라이브러리가 포함되어있습니다. I2C와 SPI 통신 둘 중 어느것을 선택하느냐는 연결하고자 하는 장치에 따라 결정됩니다. [대부분의 장치는 둘 중 하나만을 지원하는 점, 유의하세요!] 

 

*I2C

Inter-Integreated Circuit, 제조사인 ATmel 에서는 TWI(The Two Wire Serial Interface)통신 이라고도 합니다. 가장 큰 장점 신호선 두개만 연결하면 사용할 수 있으며, 여러 개의 장치를 연결하는 경우에도 필요한 신호선의 수는 증가하지 않는 다는 점에 있습니다. 

'반이중(Half-duplex)방식'으로 송신과 수신이 동시에 이뤄질 수 없다는 특징을 지닙니다. 따라서 양방향 통신이 필요한 경우 전송 속도가 더 느려집니다. SPI 통신에 비해 더 느리지요. 애초에 I2C는 필립스에서 저속의 주변 기기를 연결하기 위해 개발한 규격입니다. I2C에서 사용되는 두 신호선은 SCL(Serial Clock)과 SDA(serial data)로 구성되어 있습니다. SCL(Serial Clock)의 신호선, 즉 클럭 신호를 사용하는 동기식 통신이기 때문에 시간에 굉장히 자유롭다는 장점도 가집니다. 이점은 일전에 비교하였던 UART 통신과 비교되지요?(물론 아두이노에는 USART 통신을 쓰지 않기 때문에...)

I2C 연결의 한쪽에는 유일한 마스터(master)장치가 연결되어 하나 이상의 슬레이브(slave) 장치와의 정보 전송을 제어 하게 되며(마스터 - 데이터 송수신 제어) 일반적으로 아두이노가 마스터의 역할을 수행합니다. 슬레이브 장치들은 7비트의 고유 주소에 의해 식별 됩니다. 즉, 128(2^7)개의 슬레이브 장치가 연결 될 수 있지요. 다만, 슬레이브 장치들을 식별하기 위해서는 '주소 값'이 항상 붙어야 하기 때문에 긴 데이터에는 부적합하다는 단점을 가집니다. 또한 마스터든 슬레이브든 데이터 송수신을 하는 동작을 모두 수행하기 때문에, 안정적인 송수신을 하기 위해서는 SDA와 SCL 연결선에 풀업 저항을 사용해야 하는 것이 바람직하다고 합니다.

아두이노 우노의 경우 아날로그 5번 핀 - SCL, 아날로그 4번 핀 - SDA를 사용하며, 아두이노 메가의 경우 디지털 21번 핀 - SCL, 디지털 20번 핀 - SDA로 사용합니다. 

 

정리하자면,

* 연결 신호선은 오직 두 개 필요, 슬레이브는 127개 까지 연결 가능 

* 반이중 방식, 송수신이 동시에 이뤄질 수 없음

           (=속도는 SPI통신에 비해 느림)

* 긴 데이터에는 부적합

* 클럭 신호를 사용하는 동기식 통신

 

* I2C 방식만을 위한 라이브러리 - WIRE 라이브러리

 

 

 

*SPI

SPI(Serial Peripheral Interface) 통신은 하나의 슬레이브와 통신하기 위해서 총 4개의 선이 필요합니다. 송신과 수신을 위한 별도의 연결선인 MOSI(Master Out Slave In)과 MISO(Master In Slave Out) 그리고 클록(SCK)이 존재합니다. 마지막으로, 특정 슬레이브를 지정하기 위해서 하드웨어적인 연결인 SS(Slave Select)가 필요하지요. (특정 슬레이브를 지정하기 위해서 소프트웨어적 주소를 사용하는 I2C와 구별되지요?) MOSI, MISO, SCK선은 모든 슬레이브에 공통이며, 한 기기당 하나의 SS 연결선을 가집니다. 즉, 슬레이브가 하나 늘어날 수록 SS 연결선도 하나씩 증가하겠죠?  

SPI통신의 가장 큰 장점은 전이중(full-duplex)방식으로 송신과 수신이 동시에 이루어 질 수 있습니다. 또한 속도가 빠르기 때문에 빠른 데이터 전송 속도를 필요로 하는 데 사용되어 지고 있습니다. 다만, 단점으로는 I2C와는 다르게, 여러 장치를 연결하려면 그에 따른 연결선도 증가한다는 것이지요. 

아두이노 프로그램에서 제공되는 SPI 라이브러리는 아두이노의 마스터 모드만을 지원하며, 초기화 과정에서 해당 핀의 입출력 상태를 자동으로 설정합니다. 따라서, 마스터 모드에서 사용할 때 주의할 점은, 초기화 이후에 슬레이브에 연결된 SS핀들을 HIGH 상태로 설정해 줘야 한다는 점이지요. 

아두이노 우노의 경우 디지털 11(MOSI),12(MISO), 13(SCLK)번 핀으로 연결하지만, ICSP라는 포트로도 나와 있습니다. 나머지, 디지털 10번 핀이 SS핀으로 정의되어 있어 많이들 사용하시지만, 사실 연결 가능한 디지털 핀은 모두 SS핀으로 사용이 가능합니다. 

아두이노 메가의 경우 51핀 - MOSI, 50 -MISO, 52 - SCLK, 53 - SS핀으로 사용이 가능합니다! 메가 역시 ISCP라는 포트도 나와 있으니 참고하세요. 

 

정리하자면

*4개 이상의 선이 필요. (기본 핀 3개 + 슬레이브 하나당 1개)

(=슬레이브 개수가 증가할 수록 신호선의 개수도 증가)

*전이중 방식 - 송신과 수신이 동시에 이루어짐

(=속도가 빠름)

*SPI통신을 위한 라이브러리 - SPI 라이브러리 지원

*SPI 라이브러리는 아두이노의 마스터 모드만을 지원

 

다음 포스트에서는 WIRE 라이브러리와 SPI 라이브러리를 보겠습니다! 

 

728x90