3.21. SPI 기초

SPI(Serial Peripheral Interface)는 동일 보드 상에서 하나의 컨트롤러와 하나 이상의 주변장치 사이의 근거리 고속 연결을 위해 설계된 동기식 직렬 버스입니다. SD 카드, 디스플레이, 플래시 메모리, ADC와 DAC, 그리고 다양한 센서를 위한 표준 인터페이스입니다.

UART는 공유 클럭이 없어 데이터 선 자체에서 타이밍을 복원했던 반면, SPI는 데이터 선과 나란히 클럭 선을 함께 사용합니다. 컨트롤러는 원하는 속도로 클럭을 구동하고, 버스에 연결된 다른 모든 장치는 그 클럭에 동기화하여 데이터를 샘플링합니다. 보드 레이트를 추측할 필요도, 프레이밍 오버헤드도 없습니다. 오직 클럭 에지와 비트만 있을 뿐입니다.

3.21.1. 네 개의 선

전이중(full-duplex) SPI 버스는 네 개의 선으로 구성됩니다:

  • SCK (직렬 클럭). 컨트롤러가 구동합니다. 모든 비트는 이 신호의 엣지에서 입출력 클럭이 동기화됩니다.

  • MOSI (controller out, peripheral in). 컨트롤러의 출력 라인으로, 주변장치가 여기서 비트를 샘플링합니다.

  • MISO (controller in, peripheral out). 주변장치의 출력 라인으로, 컨트롤러가 여기서 비트를 샘플링합니다.

  • CS (chip select). SS (peripheral select)라고도 합니다. 주변장치마다 별도의 라인이 있습니다. 컨트롤러는 트랜잭션을 시작할 때 CS를 LOW로 내리고 끝낼 때 다시 HIGH로 올립니다. CS가 비활성화된 주변장치는 버스를 완전히 무시하며 자신의 MISO 출력 구동을 중단합니다.

네 개의 신호 파형이 위에서부터 차례로 쌓여 있습니다: 맨 위에 CS, 그 아래 SCK, 그다음 MOSI와 MISO. CS는 하이(유휴) 상태에서 시작하여 트랜잭션을 시작할 때 로우로 떨어지고, 그동안 SCK는 여덟 개의 펄스를 출력하며 MOSI와 MISO는 각각 1바이트의 데이터를 실어 나르고, 그 후 CS는 다시 하이로 돌아갑니다.

SPI 1바이트: CS가 로우로 떨어져 주변장치를 선택하고, SCK가 여덟 개의 비트를 클럭으로 내보내며, MOSI와 MISO가 서로 반대 방향으로 각각 1바이트씩 전송합니다.

모든 클럭 에지는 동시에 양방향으로 각각 1비트씩 이동시킵니다. 하나의 SCK 펄스가 동시에 MOSI로 1비트를 보내고 MISO로 1비트를 받습니다. SPI는 선 수준에서 전이중입니다. 소프트웨어가 반드시 양방향을 모두 사용해야 하는 것은 아닙니다. 쓰기 전용과 읽기 전용 트랜잭션이 흔하며, 사용하지 않는 선은 무시하거나 하이로 유지합니다.

3.21.2. 클럭 극성과 위상

두 개의 구성 비트가 어느 클럭 에지에서 데이터를 이동시킬지 정확히 결정합니다:

  • 클럭 극성 (polarity, 때로는 CPOL) – SCK의 유휴 상태를 의미합니다. 0은 클럭이 LOW로 유휴 상태이며 HIGH로 펄스가 발생함을 뜻하고, 1은 클럭이 HIGH로 유휴 상태이며 LOW로 펄스가 발생함을 뜻합니다.

  • 클럭 위상 (phase, 때로는 CPHA) – 어느 엣지에서 데이터를 샘플링하는지를 의미합니다. 0은 각 클럭 펄스의 첫 번째 엣지(상승 엣지)에서 샘플링하고, 1은 두 번째 엣지(하강 엣지)에서 샘플링합니다.

이 둘을 조합하면 네 가지 모드가 생기며, 관례적으로 모드 0부터 모드 3까지로 불립니다. 모드 0(polarity=0, phase=0)이 가장 흔하며 알 수 없는 장치에 대한 안전한 기본값입니다.

결정적으로 중요한 규칙은 양쪽 끝이 모드에 대해 합의해야 한다는 것입니다. 클럭과 데이터 선이 올바르게 배선되어 있더라도 모드가 일치하지 않으면 쓰레기 데이터가 나옵니다. 장치가 첫 번째 트랜잭션에서 말이 안 되는 값을 반환한다면 가장 먼저 확인해야 할 것이 모드입니다.

3.21.3. 여러 주변장치

여러 주변장치가 동일한 SCK, MOSI, MISO 선을 공유할 수 있으며, 단 각 장치가 컨트롤러에 의해 구동되는 자신만의 CS 선을 갖고 있어야 합니다:

  • 모든 주변장치는 동일한 클럭과 데이터를 보지만, 각 장치는 자신의 CS만 감시합니다. CS가 비활성화(하이)되면 주변장치는 SCK와 MOSI를 완전히 무시하고 MISO를 고임피던스 상태로 두어 다른 장치와 선을 두고 충돌하지 않습니다.

  • 컨트롤러는 한 번에 정확히 하나의 CS만 활성화하고, 트랜잭션을 수행한 다음, CS를 비활성화하여 버스를 해제합니다.

하나의 하드웨어 SPI 블록을 가진 마이크로컨트롤러는 CS 선을 위해 할애할 수 있는 여유 GPIO 핀이 있는 만큼 많은 주변장치와 통신할 수 있습니다. 버스 자체에는 주소 지정이 없습니다.

3.21.4. 장점과 단점

SPI의 장점과 단점은 모두 그 설계에서 비롯됩니다:

  • 빠름. 간단한 레벨 변환을 거친 짧은 트레이스에서 수십 메가헤르츠를 달성할 수 있습니다. SD 카드 리더와 SPI 디스플레이가 이를 활용합니다.

  • 선 수준에서 단순함. 주소 지정도, 확인 응답도, 특별한 시작/정지 조건도 없습니다. 오직 클럭에 동기화된 선 위의 비트만 있을 뿐입니다.

  • 핀 소모가 많음. 세 개의 공유 선에 더해 주변장치마다 하나의 CS가 필요합니다. SPI 장치 다섯 개가 있는 보드는 여덟 개의 핀(세 개 + 다섯 개)을 사용합니다.

  • 근거리. SPI는 깨끗하고 빠른 에지를 전제하며, 이는 동일 보드 상의 짧은 트레이스를 의미합니다. 더 긴 연결에는 I2C나 프레이밍 버스 중 하나가 더 적합합니다.