[통신]

SPI(Serial Peripheral Interface) 통신이란? (SCLK, MOSI, MISO, SS)

Neo Park 2012. 5. 1. 14:56

1. SPI(Serial Peripheral Interface)

1) 개요

   (1) 모토로라에 의해 발표된 통신방식으로 하드웨어 적으로 전송 속도를 최대로 얻기 위한 목적으로 만들어짐.

   (2) Clock을 사용하는 통신방식으로써 동기화된 직렬 통신 방식을 사용함.

   (3) 하나의 Master와 다수의 Slave가 연결되는 구조임.

   (4) Full Duplex 통신이 가능함.

   (5) 사용되는 신호는 다음과 같다.

 

* NSS(Negative Slave Select)

- Slave를 선택하는 신호

* SCLK(Serial Clock)

- Clock을 전송해주는 신호(from Master)

* MISO(Master Input Slave Output)

- Master 기준으로 입력신호.

* MOSI(Master Output Slave Input)

- Master 기준으로 출력 신호.

 

 

2) SPI 통신 구조

    (1) 1개의 Slave와 연결



  (2) 여러 개의 Slave와 연결

 

 

2. Serial Flash

  1) Block Diagram

 

 

 

  2) Pin Description

(1)CS(Chip Select)
: Serial Flash를 사용하기 위해서 Chap을 선택하는 신호.
(2)SCK(Serial Clock)
: Serial Flash를 동작 시키기 위한 Clock을 공급하는 신호.
(3)SI(Serial Input)
: 데이터 및 주소가 Serial Flash에 입력되는 신호.
(4)SO(Serial Output)
: 해당 데이터가 Serial Flash로부터 출력되는 신호.
(5)WP(Write Protect)
: 쓰기 금지를 하는 신호.
(6)Hold
: Serial Flash의 동작을 일시 정지 시키는 신호.
(7)Vcc(Device Power Supply)
: Serial Flash가 동작할 수 있도록 전원을 공급해주는 핀.
(8)GND(Ground)

 

 

   3) 동작 방법

 

 

   (1) Host Controller(MCU)로부터 정해진 명령어를 입력 받아 Serial Flash 장치가 제어 되도록 구성 됨.
   (2) Input/Output 핀을 사용 하는 모든 동작은 클럭을 반드시 공급해주어야 하며 CS 신호 역시 Enable이 되어 있어야 함.
   (3) 사용 예
         - CS 신호를 Enable 한다.
         - Clock을 공급하며 그와 동시에 해당 데이터(명령어 & 주소)를 입력한다.
         - 이때 SO 핀은 High Impedance 상태가 됨.
         - 일정시간이 경과뒤에 SO 핀으로 출력신호가 생성된다.
         - Serial Flash의 사용이 완료되면 CS 신호를 Disable 한다

 

3. 초기화(STM3210C)

  1) GPIO 설정

     (1) MCU의 해당 핀들이 GPIO로 설정되어 있는 상태에서 각 핀에 클럭을 공급한다.
         > RCC_APB2PeriphClockCmd( sFLASH_CS_GPIO_CLK….., ENABLE );
     (2) MCU의 SPI 장치에 클럭을 공급한다.
        > RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
     (3) 현재 연결되어 있는 핀들이 리맵을 해야 사용이 가능 하므로 각 핀들을 리맵 한다
        > GPIO_PinRemapConfig(GPIO_Remap_SPI3,ENABLE);

 

  2) SPI 설정

     (1) 동작 속도, 데이터 단위, MSB 비트 등을 아래와 같이 설정 한다.
> SPI_Direction = SPI_Direction_2Lines_FullDuplex;
> SPI_Mode = SPI_Mode_Master;
> SPI_DataSize = SPI_DataSize_8b;
> SPI_CPOL = SPI_CPOL_High;
> SPI_CPHA = SPI_CPHA_2Edge;
> SPI_NSS = SPI_NSS_Soft;
> SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
> SPI_FirstBit = SPI_FirstBit_MSB;
> SPI_CRCPolynomial = 7;

 

    (2) 위와 같이 설정을 한뒤 SPI에 반영하면 즉시 동작하기 시작한다.

>SPI_Cmd(SD_SPI, ENABLE);

 

4. 데이터 읽기 / 쓰기

  1) 데이터 쓰기

     (1) 타이밍 도



    (2) 설명

Write Enable 신호를 전송한다.
> sFLASH_WriteEnable();


CS 신호를 Enable 한다.
> sFLASH_CS_LOW();


Write 명령어를 전송 한다.
> sFLASH_SendByte(sFLASH_CMD_WRITE);


24bit의 주소를 8bit씩 전송한다.
> sFLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
> sFLASH_SendByte((WriteAddr & 0xFF00) >> 8);
> sFLASH_SendByte(WriteAddr & 0xFF);


1Byte 데이터를 전송한다.
Full Duplex 방식이므로 더미 바이트를 보내고 읽기 작업을 동시에 한다.
읽고 쓰기 작업이 동시에 이루어 지므로 바이트 송/수신 작업을 같은 함수에서 처리한다.
> sFLASH_SendByte(*pBuffer);


CS 신호를 Disable 한다.
> sFLASH_CS_HIGH();


Write Disable 신호를 전송한다.
> sFLASH_WaitForWriteEnd();

 

   2) 데이터 읽기

      (1) 타이밍 도

 

    (2) 설명

CS 신호를 Enable 한다.
> sFLASH_CS_LOW();


Read 명령어를 전송 한다.
> sFLASH_SendByte(sFLASH_CMD_READ);


24bit의 주소를 8bit씩 전송한다.
> sFLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
> sFLASH_SendByte((WriteAddr & 0xFF00) >> 8);
> sFLASH_SendByte(WriteAddr & 0xFF);


1Byte 데이터를 읽는다.
Full Duplex 방식이므로 더미 바이트를 보내고 읽기 작업을 동시에 한다.
읽고 쓰기 작업이 동시에 이루어 지므로 바이트 송/수신 작업을 같은 함수에서 처리한다.
> *pBuffer = sFLASH_SendByte(sFLASH_DUMMY_BYTE);


CS 신호를 Disable 한다.
> sFLASH_CS_HIGH();

 

5. 테스트

   (1) 1Byte Write

 

   (2) 1Byte Read

 

spi-space9912.pdf

spi-space9912.pdf
0.3MB