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



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

● SCLK : Serial Clock. 매스터가 출력하는 동기용 클럭 (output from master)
● MOSI : Master Output Slave Input. 매스터의 출력이며 슬레이브에게는 입력 (output from master)
● MISO : Master Input Slave Output. 슬레이브의 출력이며 매스터에게는 입력 (output from slave)
● SS : Slave Select. 매스터의 출력으로 슬레이브를 선택하기 위한 신호 (Active Low)


(2) SPI 통신 과정

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

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

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

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


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


세 장치의 SCLK, MOSI, MISO는 각각 서로 연결되어 있지만 Slave의 /CE 신호들은 서로 묶이지 않고 Master의 다른 핀들로 연결된다. Slave의 수에 상관없이 한 순간에는 하나의 Slave만 Master와 통신할 수 있다. 두 Slave가 모두 활성화되면 Slave의 출력인 MISO에서 데이터의 충돌이 일어난다. 그래서 Master는 자신이 원하는 Slave의 /CE 신호만 ‘0’으로 설정하여 활성화시키고 나머지 Slave의 /CE는 ‘1’로 두어야 한다. /CE 입력이 ‘1’인 Slave는 선택되지 않았기 때문에 자신의 MISO 출력을 hi-Z 상태로 만들어 선택된 Slave와 Master 간의 통신에 영향을 주지 않는다. 따라서 모든 SPI Slave의 MISO 출력은 3 상태를 지원한다. /CE 입력이 ‘1’인 Slave는 당연히 Master가 출력한 SCLK와 MOSI 신호를 무시한다.
 
세 개 이상의 Slave도 같은 방법으로 Master와 연결할 수 있다. Slave의 수가 하나씩 늘어날 때마다 새로운 Slave를 위한 /CE 신호만 하나 더 필요할 뿐이다. 그런데 이 때 Master에 연결된 Slave들이 사용하는 SPI 모드가 한 가지가 아니거나 비트 전송 순서가 다를 수 있는데 이런 경우에는 통신의 효율이 많이 낮아진다. 가령 어떤 Slave는 모드 0을 사용하고 또 다른 Slave는 모드 1을 사용한다면 Master가 Slave를 바꿀 때마다 동작 모드를 매번 다시 설정해야 한다. 또한 동작 모드가 같아도 비트 전송 순서가 다르다면 마찬가지 문제가 생긴다.
 
Master가 하나의 Slave만 구동한다면 Slave의 /CE 신호를 GND로 고정시켜 두어도 상관없다. 어차피 SCLK, MOSI, MISO를 공유할 다른 Slave가 없기 때문에 이 선들은 하나뿐인 Slave 전용으로 사용된다. 그렇기 때문에 Slave를 항상 활성화시켜 둬도 기능상의 문제는 생기지는 않는다.


(4) 전송 타이밍



(5) SPI의 장단점

○ SPI 버스의 가장 큰 장점으로는 최고 70 MHz에 이르는 빠른 통신 속도와 동시 양방향 통신이 가능하다는 점을 들 수 있다.
전송 데이터 단위에 대한 제약이 없어서 8 비트, 16 비트, 24 비트 등 원하는 길이를 한 워드로 설정할 수 있다. 비트 순서에 대한 제약도 없으므로 필요에 따라 MSB부터 전송할 수도 있고 LSB부터 전송할 수도 있다. I2C Slave와 달리 SPI Slave는 자체 주소를 가지고 있지 않으므로 주소 충돌의 문제도 발생하지 않는다.
 
○ I2C 버스와 달리 SPI 버스에는 한 개의 버스 Master만 있을 수 있으며 I2C 버스에 비해 필요한 핀의 수가 더 많다.
SPI 버스는 기본적으로 4 가닥의 선을 사용하며 Master에 연결된 Slave의 숫자가 많아질수록 Slave를 선택하기 위한 SS 핀의 수 역시 Slave 수에 비례해서 늘어난다. 또한 I2C 버스의 ACK와 같은 메커니즘이 없어서 Master는 자신이 통신하고 있는 장치가 실제 존재하는지 여부를 확인할 수 없다.



※ 출처 : http://eslectures.blog.me/80137860924

'T heory > Comn Basics' 카테고리의 다른 글

I2C(Inter Integrated Circuit)  (18) 2011.10.17
GPIO(General Purpose I/O) (2)  (0) 2011.10.17
SPI(Serial Peripheral Interface Bus)  (2) 2011.10.17
I2S(Integrated Interchip Sound)  (3) 2011.10.17
직렬통신(Serial Communications)  (0) 2011.10.17
GPIO(General Purpose I/O) (1)  (0) 2011.10.11
by Latte 하늘이도우사 2011. 10. 17. 15:38
  • 태완 2014.08.21 19:21 ADDR EDIT/DEL REPLY

    좋은 자료 잘 보았습니다. ^^
    많이 배우고 갑니다.

  • 장또치 2016.08.07 01:03 ADDR EDIT/DEL REPLY

    설명을 잘하시네요!!! 단번에 이해가 됬습니다
    감사합니다 ^^