Raspberry Pi GtrFx project (2)

이번에는 외부 컨트롤러와의 통신 방법으로 SPI를 이용하는 방법에 대해서 알아보기로 한다.

이에 앞서 잠시 SPI와 I2C에 대해서 먼저 알아보기로 하자. 이것은 상당히 흔한 통신 방법인데, 구체적인 내용은 잘 다루지 않는 것이 주류를 이루는 통신 방식들에 비해 좀 구식? 저레벨? 통신 방법이라 생각해서 그런 듯 하다.

I2C (I-square-C, or I-two-C, or I-I-C)

이 방법은 NXP(과거 필립스, 지금은 퀄컴 이후 브로드컴??)가 창안했다고 하고 Inter-Intergrated Circuit이란 말을 줄인 것이다. 즉, IC간 통신 방법을 의미하는 것이라 보면 된다. 대개 IC들도 프로그래밍이 되지 않는다 하더라도 어떻게 동작해줘야 할지 약간의 설정 변수들이 있는데, 그것들을 I2C라는 통신 방법을 통해서 저희들끼리 주고 받겠다라는 뜻이다.

주고 받을 데이터도 그리 많지 않고 사실 보드가 부팅할 때 딱 한번 세팅해주고 계속해서 그 설정으로 동작시키는 것이 일반적이니까 통신 방법은 핀수를 가장 적게 사용하는 직렬통신이다. 따라서 핀수는 전원 2핀과 데이터/클럭 각각 1핀씩 총 4개로 되어있다.

통신 개념은 I2C 버스에 마스터와 슬레이브가 되는 여러 개의 디바이스를 같이 물려놓고 마스터에서 슬레이브로 신호를 날려주는 방식으로 쓰게 된다. 슬레이브들은 대개 스스로의 고유한 아이디가 있어서 공유하고 있는 버스를 들여다보다가 자신이 호출될 때 데이터를 수신하면 된다. 데이터 핀이 하나인데, 데이터를 주고 받게 되니까 half duplex가 되고, 이 방법에서는 여러 개의 master를 둘 수 있다.

즉, 하나의 CPU가 있고 다양한 주변 칩이 붙어서 돌아가는 대부분의 시스템에서 핀과 와이어를 낭비하지 않고 효과적으로 주변장치들을 컨트롤 하는 방법이라고 보면 된다. 딱 2개의 핀만 있으면 많은 주변 칩들을 한꺼번에 통제할 수 있게 된다. I2C를 지원하지 않는 주변칩도 거의 없을 정도로 흔하다.

SPI (Serial Peripheral Interface)

SPI는 Motorola (지금은??)에서 만들었다고 한다. I2C와 다른 점은 full duplex이고 SPI 버스상에 오직 하나의 master를 둘 수 있다는 것이다.

그런데 이거 왜 하나??

소형 컴퓨터에서 디스플레이를 쓰는 방법은 다양한데, 내보낼 정보가 별로 없다면 I2C처럼 딱 4개의 핀만을 사용하는 경우가 유리하다. USB를 쓰는 경우도 있으나 이 경우는 복잡한 컨트롤러가 붙어줘야 하니까 단가가 올라간다. 예전에 나온 1602 LCD 같은 것들은 핀수가 많다. 속도도 엄청나게 느린 주제에.

가장 간단히 적당량의 데이터를 표현할 수 있는 방법으로 4핀짜리 128x32 혹은 128x64 디스플레이가 적당해 보인다.

Raspberry Pi에서 어떻게 쓰나?

일단 i2c는 기본적으로 활성화되어있지 않아서 해당 핀은 일반 GPIO 처럼 쓰게 되어있다. 그러나 /boot/config.txt에 다음을 넣고 재부팅하면,

dtparam=i2c_arm=on
dtparam=i2s=on
dtparam=spi=on

i2c를 사용할 수 있도록 device가 활성화된다.

다음과 같이 모듈도 올려준다.

sudo modprobe i2c_bcm2708
sudo modprobe i2c_dev

또 i2c-tools를 받아서 설치하면 컨트롤 할 수 있는 헤더와 라이브러리가 생겨난다. 이제 이것을 이용해서 데이터를 주고 받을 수 있게 된다.

이것도 GPIO를 건드리는 것처럼 io file을 access하는 것으로 주고 받기가 가능해진다.