{{위키데이터 속성 추적}}
{| align="right"
|-
| [[파일:SPI single slave.svg|섬네일|right|350px|SPI 버스: 싱글 마스터와 싱글 슬레이브]]
|}

'''직렬 주변기기 인터페이스 버스'''(Serial Peripheral Interface Bus) 또는 '''SPI''' 버스는 아키텍처 [[이중통신|전이중 통신]] 모드로 동작하는 [[모토로라]] 아키텍처에 이름을 딴 [[동기화]] [[직렬 통신|직렬 데이터 연결]] 표준이다. 장치들은 [[마스터 슬레이브]] 모드로 통신하며 여기서 마스터 장치는 [[데이터 프레임]]을 초기화한다. 여러 슬레이브 장치들은 개별 [[슬레이브 셀렉트]] ([[칩 셀렉트]]) 라인과 함께 동작할 수 있다.

== 인터페이스 ==
SPI 버스는 4가지 논리 신호를 지정한다:
* SCLK: 직렬 클럭 (마스터로부터의 출력)
* MOSI; SIMO: 마스터 출력, 슬레이브 입력 (마스터로부터의 출력)
* MISO; SOMI: 마스터 입력, 슬레이브 출력 (슬레이브로부터의 출력)
* SS: [[슬레이브 셀렉트]] ([[논리 레벨|active low]], 마스터로부터의 출력).

그 밖의 호환되는 이름으로는 다음과 같이 쓰인다:
* SCLK - SCK; CLK: 직렬 클럭 (마스터로부터의 출력)
* MOSI - SDI; DI, DIN, SI: 직렬 데이터 입력; 데이터 입력, 직렬 입력
* MISO - SDO; DO, DOUT, SO: 직렬 데이터 출력, 데이터 출력, 직렬 출력
* SS - nCS, CS, CSB, CSN, nSS, STE: [[칩 셀렉트]], 슬레이브 전송 기능 이용 ([[논리 레벨|active low]], 마스터로부터의 출력)

== 통신 개요 ==
마스터가 SS를 통해 신호를 전송할 슬레이브를 선택한다. 마스터는 MOSI를 통해서 SCLK에 동기화된 신호를 전송한다. 슬레이브는 SS을 통해서 신호를 수신할 수 있게 활성화되어 있는 상태에서 자신(슬레이브)의 MOSI를 통하여 전달되는 신호를 SCLK 에 맞춰 수신한다. SCLK에 동기화된 MOSI 신호는 8비트나 16비트, 또는 그 이상의 비트로 조합되어 유의미한 데이터로 사용된다.

SPI를 사용하여 통신하는 프로토콜은 몇 가지 인터페이스로 나뉜다.
* 모토로라 SSP 호환 인터페이스
** 전이중, four-wire 동기 전송
** 프로그래밍 가능한 clock polarity 및 phase
* 내셔널 세미컨덕터 마이크로와이어 인터페이스
** 8비트 제어 메시지를 이용한 반이중 전송
* 텍사스 인스트루먼츠 동기 직렬 인터페이스
** 전이중, four-wire 동기 전송
** Transmit data pin tristateable when not transmitting.

모토로라 SSP 호환 인터페이스는 Polarity와 Phase로 신호를 서로 송신하는 프로토콜이 조절할 수 있다.
Polarity와 Phase를 조합하면 4가지 방식이 가능하다.
# Motorola SSP Format with SPO=0, SPH=0
# Motorola SSP Format with SPO=0, SPH=1
# Motorola SSP Format with SPO=1, SPH=0
# Motorola SSP Format with SPO=1, SPH=1

SPO(Signal Polarity)와 SPH(Signal Phase)변경하면 다음과 같은 약속의 효과가 있다.
# polarity Control 설정이 LOW인 경우 SCLK가 LOW 인 구간에 의미있는 신호가 출력된다.
# polarity Control 설정이 HIGH인 경우 SCLK가 HIGH 인 구간에 의미있는 신호가 출력된다.
# phase control 설정이 LOW인 경우 SCLK가 첫 번째 변화(엣지)시점에서 신호를 수신(Capture)한다.
# phase control 설정이 HIGH인 경우 SCLK가 두 번째 변화(엣지)시점에서 신호를 수신(Capture)한다.

사례
# SPO가 0, SPH가 1인경우
SPI CLOCK가 LOW상태에서 SS가 HIGH에서 LOW가 되고 SPI_CLOCK이 HIGH로 올라가면서 동시에 MOSI가 활성화된다. SPI CLOCK 이 절반나갔을 때부터 유효 데이터로 인정되고 SPI CLOCK 이 떨어지는(폴링엣지)시점에 의미있는 신호가 데이터로서 수신된다(Capture)
# SPO가 1, SPH가 1인경우
SPI CLOCK가 HIGH상태에서 SS가 HIGH에서 LOW가 되고 SPI_CLOCK이 LOW로 떨어지면서 동시에 MOSI가 활성화된다. SPI CLOCK 이 절반나갔을 때부터 유효 데이터로 인정되고 SPI CLOCK 이 올라가는(라이징엣지)시점에 의미있는 신호가 데이터로서 수신된다(Capture)

== 모드 번호 ==
{| class="wikitable"
|-
!모드!!CPOL!!CPHA
|-
|0||0||0
|-
|1||0||1
|-
|2||1||0
|-
|3||1||1
|}

== SPI의 장단점 ==
=== 장점 ===
* 완전한 전이중 통신
* 전송되는 비트에 대한 완전한 프로토콜 유연성
* 전송기가 필요하지 않음
* 매우 단순한 하드웨어 인터페이스 처리
* IC 패키지에 4개의 핀만 사용하며 이는 병렬 인터페이스에 비해 수가 적은 것이다.
=== 단점 ===
* 하드웨어 슬레이브 인식이 없음
* 슬레이브에 의한 하드웨어 [[흐름 제어]]가 없음
* 오류 검사 프로토콜이 정의되어 있지 않음
* 일반적으로 노이즈 스파이크에 영향을 받는 경향이 있음 (통신 문제를 일으킬 수 있음)
* [[RS-232]], [[RS-485]], [[CAN 버스]]보다 비교적 더 짧은 거리에서 동작
* 하나의 마스터 장치만 지원

== 같이 보기 ==
; 관련 단자
* [[SD 카드|시큐어 디지털]] -SD, SDHC, SDXC 카드
* [[UART]]
* [[I2C]]

== 외부 링크 ==
* {{언어링크|en}} [https://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus wikipedia SPI (영어)]
* {{언어링크|en}} [http://www.byteparadigm.com/kb/article/AA-00255/22/Introduction-to-SPI-and-IC-protocols.html SPI, I2C 프로토콜 소개] {{웨이백|url=http://www.byteparadigm.com/kb/article/AA-00255/22/Introduction-to-SPI-and-IC-protocols.html |date=20120828075112 }}
* {{언어링크|en}} [http://www.epanorama.net/links/serialbus.html 직렬 버스 정보 문서]
* {{언어링크|en}} [https://web.archive.org/web/20111209052907/http://www.mct.net/faq/spi.html SPI 소개] (다이어그램 포함)
* {{언어링크|en}} [https://web.archive.org/web/20100217170308/http://www.serialflash.com/ 시리얼 플래시] - SPI 제조업체 및 모델 정보
* {{언어링크|en}} [https://web.archive.org/web/20120110124309/http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf SPI - PICmicro 직렬 주변기기 인터페이스], SPI에 대한 마이크로칩 (기업) 강좌
* {{언어링크|en}} [http://www.opencores.org/project,spi OpenCores] SPI의 오픈 소스 ([[Verilog]]); [http://www.opencores.org/?do=project&who=simple_spi 더 단순한 MC68HC11 버전]
* {{언어링크|en}} [https://web.archive.org/web/20171008144516/https://www.hdl-dh.com/prodbroch/HIP3100.01.04.2009.pdf SPI flash memory controller], HDL 디자인 하우스

{{컴퓨터 버스}}

[[분류:직렬 버스]]
[[분류:컴퓨터 버스]]