SPI의 개요

SPI (Serial Peripheral Interconnect) 버스는 Motorola에 의해 개발된 전이중 (full duplex) 통신이 가능한 동기 통신 규격이다. I2C와 마찬가지로 매스터 슬레이브 방식으로 동작하며 매스터가 동기를 위한 클럭을 출력한다. SPI 슬레이브 장치는 chip enable (/CE) 입력을 가지고 있으며 이 입력이 활성화되었을 때에만 동작한다. 따라서 매스터는 여러 개의 slave select (SS) 선을 슬레이브들의 /CE에 연결하고 한 순간에 하나의 슬레이브만 선택하는 방법을 사용하여 두 개 이상의 슬레이브 장치들을 구동할 수 있다. SPI의 통신 속도는 최고 70 MHz에 이르기 때문에 I2C에 비해 훨씬 빠르다.

다음 그림은 SPI 버스를 통해 매스터가 한 개의 슬레이브와 일대일로 연결된 상황을 보여준다.



그림에 표시된 4 개의 신호는 SPI 버스에서 정의된 신호이다.

SCLK : Serial Clock. 매스터가 출력하는 동기용 클럭

MOSI : Master Output Slave Input. 매스터의 출력이며 슬레이브에게는 입력

MISO : Master Input Slave Output. 슬레이브의 출력이며 매스터에게는 입력

SS : Slave Select. 매스터의 출력으로 슬레이브를 선택하기 위한 신호


SCLK
는 매스터가 출력하는 클럭 신호이다. SCLK를 기준으로 매스터와 슬레이브 사이의 데이터 교환이 진행된다. MOSI는 매스터의 출력으로 슬레이브로 정보를 보내기 위한 선이다. 반대로 MISO는 슬레이브의 출력으로 매스터가 슬레이브의 정보를 받기 위한 선이다. 앞의 그림에서 보듯이 매스터와 슬레이브의 MOSI끼리 서로 연결되며 MISO끼리 서로 연결된다. SS는 매스터가 슬레이브를 선택하기 위한 매스터의 출력으로 슬레이브의 /CE 입력에 연결된다. 슬레이브는 /CE 입력이 ‘0’인 동안에만 활성화된다.

통신을 진행하기 위해서 매스터는 우선 SS‘0’을 출력하여 해당 슬레이브를 활성화시킨다. 그런 다음 매스터는 SLCK로 동기를 위한 클럭을 출력하는데 이 클럭에 맞추어 MOSI로 데이터를 한 비트씩 내보낸다. 이와 동시에 매스터는 자신이 출력하는 클럭에 맞추어 MISO를 한 비트씩 읽는다. 다시 말해서 SPI 매스터는 자신의 출력인 SCLK에 맞추어 MOSI로 데이터를 내보내며 동시에 MISO로는 데이터를 수신한다. SPI 버스는 언제나 양방향 통신을 진행한다. SCLK에 맞추어 MOSI로 데이터를 출력하는 동안 MISO로는 데이터가 수신된다. 수신되는 데이터는 상황에 따라 의미가 있는 값일 수도 있고 쓰레기 값일 수도 있다. 마찬가지로 슬레이브의 데이터를 읽기 위하여 SLCK에 맞추어 MISO로 입력을 받는 동안 MOSI로는 데이터가 출력된다.

보통 SPI 통신은 8 비트 단위로 진행되지만 12 비트나 16 비트 또는 그 이상의 길이가 한 단위가 될 수도 있다. 비트 전송 순서에 대한 규정은 없다. 데이터의 전송은 MSB부터 시작될 수도 있고 LSB부터 시작될 수도 있다. 데이터를 연속 전송하는 경우 한 단위의 데이터를 보낼 때마다 SS 신호를 매번 인가할 수도 있지만 SS 신호를 ‘0’으로 설정한 후 모든 데이터를 다 보낼 때까지 이 상태를 유지하고 있다가 데이터의 전송이 끝났을 때 SS‘1’로 바꿀 수도 있다. SPI 규격은 이런 부분까지 규정하고 있지 않으며 매스터와 슬레이브 사이의 약속에 따라 결정된다. SPI 슬레이브 장치의 용도와 특성에 따라 사용 방법이 다르므로 슬레이브 장치의 데이터쉬트를 반드시 확인해야 한다.

어떤 마이크로컨트롤러는 설정된 전송 단위에 맞추어 데이터 전송 때마다 자동으로 SS 신호를 출력해 주는 기능을 가지고 있다. ATMEL사의 ARM7 기반 AT91SAM7S 계열 마이크로컨트롤러가 그 예이다. 데이터 전송 단위를 16 비트로 설정했다면 SPI 매스터가 SCLK 신호를 출력하기 전에 자동으로 SS 신호를 ‘0’으로 내리고 데이터가 출력되는 동안 이 상태를 유지하다 전송이 끝나면 이 신호를 다시 ‘1’로 올려준다. 이런 용도로 사용할 수 있는 SS 핀이 여러 개 있어서 사용자가 선택할 수 있다. 이런 기능이 있으면 정해진 길이의 데이터를 반복해서 출력하는 경우, 예를 들면 주기적으로 DAC에 값을 전송하는 경우에 매우 편리하다. 이런 기능이 없는 마이크로컨트롤러의 경우에는 사용자가 프로그램을 통해 수동으로 SS 신호를 제어해야 한다. AVR 마이크로컨트롤러는 이 기능을 지원하지 않으므로 GPIO 핀을 슬레이브 선택용으로 정하고 수동으로 그 신호를 제어해야 한다.



SPI
모드 (mode)


SPI
매스터와 슬레이브는 매스터의 출력인 SCLK에 맞추어 데이터를 한 비트씩 교환한다. 그런데 클럭에 동기를 맞추는 방법은 한 가지만 있는 것이 아니다. 클럭이 출력되고 있지 않은 상황에서 클럭의 기본 값은 ‘0’일 수도 있고 ‘1’일 수도 있다. 그리고 매스터와 슬레이브가 매 클럭의 첫 번째 에지에서 데이터를 읽을 수도 있고 매 클럭의 두 번째 에지에서 데이터를 읽을 수도 있다. 앞의 특성을 클럭의 극성 (polarity)이라고 하고 뒤의 특성을 클럭의 위상 (phase)이라고 한다. 클럭의 극성과 위상의 조합에 따라 모두 4 가지 방법이 사용 가능하다. SPI 슬레이브는 4 가지 가능한 방법 중 한 가지를 사용하도록 만들어지고 매스터는 4 가지 방법을 모두 지원해야 한다.

AVR 마이크로컨트롤러의 SPI 제어 레지스터에는 CPOL CPHA라는 비트가 있는데 이 비트의 설정에 따라 출력되는 클럭의 극성과 위상이 달라진다. 다른 마이크로컨트롤러도 이와 같거나 비슷한 이름의 비트를 가지고 있다. CPOL 비트가 0이면 클럭의 기본 상태가 ‘0’이며 이 비트가 1이면 클럭의 기본 상태는 ‘1’이다. 그리고 CPHA 비트가 0이면 매 클럭의 첫 번째 에지에서 데이터가 샘플되며 이 값이 1이면 두 번째 에지에서 데이터가 샘플된다.

다음 그림은 CPHA 비트가 0일 때의 타이밍을 설명하고 있다.



CPHA
값이 0이므로 클럭의 극성에 상관없이 매스터와 슬레이브는 모두 매 클럭의 첫 번째 에지에서 데이터를 샘플한다. 따라서 매 클럭의 두 번째 에지에서 비트 전환이 일어난다.

다음은 CPHA 비트가 1일 때의 타이밍을 설명한다.


클럭의 극성에 상관없이 매 클럭의 두 번째 에지가 데이터 샘플에 사용되며 따라서 매 클럭의 첫 번째 에지에서 비트 전환이 일어난다.


위의 4 가지 극성과 위상 조합에 0에서3까지의 숫자를 부여하여 이를 SPI 모드라고 부른다.


SPI mode

CPOL

CPHA

0

0

0

1

0

1

2

1

0

3

1

1



두 개 이상의 SPI 슬레이브 연결


I2C
버스처럼 SPI 버스에서도 한 개의 매스터가 두 개 이상의 슬레이브와 연결될 수 있다. I2C 슬레이브가 고유한 주소를 가지고 있는 것처럼 각각의 SPI 슬레이브는 chip enable (/CE) 신호를 가지고 있다. SPI 매스터는 각 슬레이브의 /CE 신호를 제어하여 원하는 슬레이브를 선택한다. 다음 그림은 한 개의 SPI 매스터에 두 개의 슬레이브들을 연결하는 방법을 설명한다.



세 장치의 SCLK, MOSI, MISO는 각각 서로 연결되어 있지만 슬레이브의 /CE 신호들은 서로 묶이지 않고 매스터의 다른 핀들로 연결된다. 슬레이브의 수에 상관없이 한 순간에는 하나의 슬레이브만 매스터와 통신할 수 있다. 두 슬레이브가 모두 활성화되면 슬레이브의 출력인 MISO에서 데이터의 충돌이 일어난다. 그래서 매스터는 자신이 원하는 슬레이브의 /CE 신호만 ‘0’으로 설정하여 활성화시키고 나머지 슬레이브의 /CE‘1’로 두어야 한다. /CE 입력이 ‘1’인 슬레이브는 선택되지 않았기 때문에 자신의 MISO 출력을 hi-Z 상태로 만들어 선택된 슬레이브와 매스터 간의 통신에 영향을 주지 않는다. 따라서 모든 SPI 슬레이브의 MISO 출력은 3 상태를 지원한다. /CE 입력이 ‘1’인 슬레이브는 당연히 매스터가 출력한 SCLKMOSI 신호를 무시한다.

세 개 이상의 슬레이브도 같은 방법으로 매스터와 연결할 수 있다. 슬레이브의 수가 하나씩 늘어날 때마다 새로운 슬레이브를 위한 /CE 신호만 하나 더 필요할 뿐이다. 그런데 이 때 매스터에 연결된 슬레이브들이 사용하는 SPI 모드가 한 가지가 아니거나 비트 전송 순서가 다를 수 있는데 이런 경우에는 통신의 효율이 많이 낮아진다. 가령 어떤 슬레이브는 모드 0을 사용하고 또 다른 슬레이브는 모드 1을 사용한다면 매스터가 슬레이브를 바꿀 때마다 동작 모드를 매번 다시 설정해야 한다. 또한 동작 모드가 같아도 비트 전송 순서가 다르다면 마찬가지 문제가 생긴다.

매스터가 하나의 슬레이브만 구동한다면 슬레이브의 /CE 신호를 GND로 고정시켜 두어도 상관없다. 어차피 SCLK, MOSI, MISO를 공유할 다른 슬레이브가 없기 때문에 이 선들은 하나뿐인 슬레이브 전용으로 사용된다. 그렇기 때문에 슬레이브를 항상 활성화시켜 둬도 기능상의 문제는 생기지는 않는다.


SPI 통신의 예


AT45DB161D
SPI 인터페이스를 사용하는 16 Mbit 직렬 플래쉬 메모리이다. 이 플래쉬 메모리에 정보를 기록하거나 저장된 정보를 읽기 위한 여러 방법 중 다음 그림은 main memory page read 명령을 설명하고 있다. 이 그림에서 데이터는 바이트 단위로 표시되어 있다.




main memory page read
명령은 AT45DB161D 내부의 특정 페이지의 내용을 연속으로 읽기 위한 것이다. 이 플래쉬 메모리의 용량은 2 Mbytes이므로 주소를 지정하기 위해서 21 비트가 필요하다. 매스터는 가장 먼저 AT45DB161D /CE 신호를 ‘0’으로 만든 다음 main memory page read를 위한 8 비트 명령을 출력하고 이어서 읽기를 원하는 주소 3 바이트를 출력한다. (AT45DB161D MSB 우선의 비트 전송 순서를 사용한다.) main memory page read 명령과 3 바이트 주소를 받으면 AT45DB161D는 저장된 데이터를 읽어서 출력할 준비를 하는데 이 과정에 시간이 필요하다. 이를 위해 매스터는 4 바이트를 더 출력한다. 매스터가 추가로 전송하는 4 바이트를 전송하는 것은 SLCK를 출력하기 위한 동작이므로 출력하는 데이터는 어떤 값이든 상관없다.

이렇게 8 바이트를 MOSI로 출력하는 동안 계속해서 매스터의 MISO AT45DB161D의 출력이 들어오지만 이 값은 아무런 의미가 없는 쓰레기 값이다. AT45DB161D의 데이터 전송은 9 번째 바이트부터 시작된다. AT45DB161D 9 번째 바이트에서 매스터가 지정한 주소의 내용을 MISO로 출력한 후 내부 카운터를 사용하여 주소를 1 증가시킨다. 이 후 매스터가 MOSI로 한 바이트씩 출력할 때마다 AT45DB161D는 데이터를 출력하고 주소를 1 증가시키는 과정을 계속 되풀이한다. 이런 과정을 통해 매스터는 AT45DB161D의 데이터를 필요한 만큼 연속해서 읽고 마지막으로 AT45DB161D /CE 신호를 ‘1’로 만들어 통신을 끝낸다. 9 번째 바이트부터 매스터가 SCLK를 출력할 뿐 MOSI로 출력해야 하는 데이터는 없으므로 어떤 값을 보내도 상관 없다.

이 명령 외에도 AT45DB161D을 사용에 필요한 다른 많은 명령들이 더 있다. 각 명령마다 위 그림과 비슷한 타이밍도를 가지고 있으므로 각 명령의 쓰임새와 사용법을 알려면 AT45DB161D의 데이터쉬트를 참고해야 한다.


SPI의 장·단점


SPI
버스의 가장 큰 장점으로는 최고 70 MHz에 이르는 빠른 통신 속도와 동시 양방향 통신이 가능하다는 점을 들 수 있다. 전송 데이터 단위에 대한 제약이 없어서 8 비트, 16 비트, 24 비트 등 원하는 길이를 한 워드로 설정할 수 있다. 비트 순서에 대한 제약도 없으므로 필요에 따라 MSB부터 전송할 수도 있고 LSB부터 전송할 수도 있다. I2C 슬레이브와 달리 SPI 슬레이브는 자체 주소를 가지고 있지 않으므로 주소 충돌의 문제도 발생하지 않는다.

I2C 버스와 달리 SPI 버스에는 한 개의 버스 매스터만 있을 수 있으며 I2C 버스에 비해 필요한 핀의 수가 더 많다. SPI 버스는 기본적으로 4 가닥의 선을 사용하며 매스터에 연결된 슬레이브의 숫자가 많아질수록 슬레이브를 선택하기 위한 SS 핀의 수 역시 슬레이브 수에 비례해서 늘어난다. 또한 I2C 버스의 ACK와 같은 메커니즘이 없어서 매스터는 자신이 통신하고 있는 장치가 실제 존재하는지 여부를 확인할 수 없다.

'OpenSTUDY > AVR' 카테고리의 다른 글

printf 사용  (0) 2011.10.27
I2C (TWI)  (0) 2011.10.18
I2C  (0) 2011.10.15
UART  (0) 2011.10.15
직렬통신  (0) 2011.10.15

+ Recent posts