SPI(Serial Peripheral Interface)는 Controller(Master)와 Peripheral(Slave) 간의 동기식 직렬 데이터 링크를 제공하는 통신버스입니다.
Controller(Master) 장치가 CLK 신호를 제공하고 Peripheral(Slave)와 Data를 주고 받습니다.
SCLK : CLK를 맞추기 위한 신호선, Controller(Master)에서만 생성.
PICO(MOSI): Peripheral In Contoller Out이란 뜻으로, 컨트롤러에서 데이터를 출력하기 위한 신호선.
POCI(MISO): Peripheral Out Contoller In이란 뜻으로, 페리페럴에서 데이터를 출력하기 위한 신호선.
CS(SS) : Chip Select란 뜻으로, 데이터를 송수신할 때 Peripheral을 선택 할 때 사용하는 선
위와 같이 SPI에는 4가지 선을 기본으로 통신을 합니다. 송/수신선이 따로 존재하기 때문에 동시에 Data를 주고 받는 것도 가능하며 송/수신 선을 하나만 갖고 있는 I2C보다 속도가 빠릅니다.(Peripheral이 증가할 수록 CS 선의 개수는 증가합니다.)
※현재 Master, Slave라는 말을 사용하지 않는다고 합니다.(Controller, Peripheral로 대체해서 사용)
Serial Port(직렬 통신) 이란?
직렬(Serial)통신은 TX, RX를 통해 통신합니다.이러한 Serial 통신은 신호의 송수신이 언제 이루어질 지 제어하기가 어렵기 때문에 '비동기통신'이라고도 부릅니다.
서로 다른 두 개 시스템의 CLK가 다르면 문제가 될 수 있기 때문에, 비동기 통신에서는 'start bit', 'stop bit'를 사용하여 통신합니다. 이렇게 하면 start bit 후에 읽은 Data부터 stop bit 전 까지의 Data까지를 확인하여 인식합니다.
비동기 통신은 매 전송 Byte의 앞 뒤에 start bit와 stop bit를 추가해야하고, 비동기 통신을 위한 복잡한 하드웨어가 필요합니다. 또한 양측(TX, RX)의 속도가 같지 않으면 값은 잘못된 값(garbage)이 됩니다.
A Synchronous Solution(동기식 해결책)
SPI는 그래서 별도의 데이터용 CLK을 추가하여 양측의 송수신 타이밍을 완전히 동일하게 맞춥니다. 이 CLK는 언제 Data Line에서 값을 추출해야 하는 지 알려줍니다.(Rising or Falling Edge << Datasheet 확인 필요) 이렇게 CLK 신호에 따라서 데이터가 추출되기 때문에 속도를 맞추지 않아도 됩니다. SPI가 널리 사용되는 이유 중 하나는 수신부(RX)가 간단한 시프트레지스터로 구성될 수 있기 때문입니다. SPI는 UART(Universal Asynchronous Receiver/Transmitter)보다 더 저렴합니다.
Receiving Data(데이터 수신)
SPI에서는 Controller(Master)에서만 CLK를 생성하기 때문에, 1개의 Controller(Master)와 여러 개의 Peripheral(Slave)로 구성이 가능합니다.
Data가 Controller(Master)에서 Peripheral(Slave)로 전송되면 PICO(Peripheral In Controller Out)[=MOSI(Master In Slave Out)]를 통해 전송됩니다. Peripheral(Slave)이 Controller(Master)로 다시 보내야 한다면 Controller(Master)는 계속해서 미리 정해진 사이클의 CLK를 생성하고 Peripheral(Slave)는 POCI(Peripheral Out Controller In)[=MISO(Master In Slave Out)]를 통해 Data를 전송합니다.
미리 정해진 사이클의 CLK를 생성한다는 의미는, Controller(Master)는 항상 CLK를 생성하기 때문에 Peripheral(Slave)의 Data 반환 시기와 양을 미리 알아야 합니다. 왜냐하면 원할 떄마다 원하는 양의 데이터를 보내는 것이 가능한 비동기 통신과 다르기 때문입니다.
Chip Select(CS)
1) 송/수신할 Peripheral을 선택하기 위해 CS 신호를 보냅니다.
2) Peripheral을 선택 후 Controller에서 만든 SCK(=SCLK)와 신호를 맞춥니다.
3) CLK신호에 따라서 PICO/POCI 라인을 통하여 Data를 송/수신합니다.
4) Data 송/수신이 종료하면 CS를 끊습니다.
+) CS가 연결된 부분의 값만 받기 때문에 CS가 연결되지 않은 부분에서 오는 신호는 무시할 수 있습니다.
SPI의 장점:
- 비동기 직렬(Asynchronous Serial)보다 빠릅니다.
- 수신 하드웨어는 간단한 시프트 레지스터일 수 있습니다.
- 여러 Peripheral(Slave)를 연결 할 수 있습니다.
SPI의 단점:
- 다른 통신 방식에 비해 더 많은 라인이 필요합니다.
- 통신은 미리 정의되어 있어야 합니다. (원할 때마다 임의의 양의 데이터를 보낼 수는 없음.)
- Controller(Master)는 모든 통신을 제어해야 합니다. (Peripheral(Slave)는 서로 직접 통신할 수 없음.)
- 많은 양의 Peripheral(Slave)이 필요한 경우 문제가 될 수 있습니다.(일반적으로 Peripheral(Slave) 당 1개의 CS선 필요.)
'Circuit Design > 🔥HDL' 카테고리의 다른 글
[Verilog] 18. SPI Slave + RAM 설계 (0) | 2024.07.09 |
---|---|
[Verilog] 17. SPI Master 설계 (0) | 2024.07.02 |
[Vitis] 1. AXI (0) | 2024.06.27 |
[Verilog] 15. AXI Write (0) | 2024.06.27 |
[Verilog] 14. AXI Read / Handshake (0) | 2024.06.27 |