본문 바로가기
3. 개발 관련/정리 :: issue 와 resovle

SPI(Serial Peripheral Interfaces)

by kyuho.choi 2009. 7. 9.
728x90
반응형
SPI는 시리얼 케이블을 통해 연결되는 디바이스와의 인터페이스를 의미하며,
예를 들어 임베디드 보드에 시리얼 케이블로 연결되는 새로운 센서모듈이 존재할 경우,
임베디드 보드와 센서 모듈간의 통신에 대한 API라 할 수 있다.

• SPI 인터페이스 

SPI 버스는 4가지 로직 시그널이 존재

SCLK - Serial Clock (Master로 부터의 출력)
MOSI/SIMO – Master Output, Slaver Input (Master로 부터의 출력)
MISO/SOMI – Master Input, Slave Output (Master로 부터의 출력)
SS – Slave Select (Master로 부터의 출력)

위 로직 시그널은 아래와 같은 용어로도 사용되며 주로 MOSI/MISO등을 사용 함

SCK – serial clock (master로 부터의 출력)
SDI,DI,SI – Serial Data In
SDO, DO, SO – Serial Data Out
nCS, CS, nSS, STE – Chip Select, Slave Transmit Enable (master로 부터의 출력)


• SPI 레지스터 


SPCR : SPI Control Register 
SPSR : SPI Status Register 
SPDR : SPI Data Register 

SPCR은 SPI를 사용하기 위한 각종 설정을 관리하는 레지스터이다

Bit7 : SPIE(SPI Interrupt Enable) - SPI에 인터럽트 사용 여부
(1 - 사용 / 0 - 미사용) 
Bit6 : SPE(SPI Enable) - SPI 사용 여부(1 - 사용 / 0 - 미사용) 
Bit5 : DORD(Data Order) - 데이터 전송 순서(1 - LSB/0 - MSB) 
Bit4 : MSTR(Master) - Master/Slave 여부(1 - Master / 0 - Slave) 
Bit3 : CPOL(Clock Polarity) - Clock의 형태(1 - Idle High / 0 - Idle Low) 
Bit2 : CPHA(Clock Phase) - 데이터 읽기 시점(1 - Trailing / 0 - Leading) 
Bit1 : SPR1(SPI Clock Rate 1) - Clock의 속도 
Bit0 : SPR0(SPI Clock Rate 0) - Clock의 속도
(00 - 4분주/01 - 16분주/10 - 64분주/11 - 128분주)

Slave가 Mater 보다 2배 이상 빠른 SPI 통신이 가능한 경우에 2배속 모드를 사용함
2배속 모드 세팅 비트는 SPSR에 있으며, SPSR은 다음과 같은 비트 구조임

Bit7 : SPIF(SPI Interrupt Flag) – 데이터 전송 완료 여부
(1 - 완료 / 0 - 전송안함 또는 미완료) 
Bit6 : WCOL(Write Collision Flag) - 데이터 전송 충돌 여부
(1 - 전송중 / 0 - 전송안함) 
Bit5 : 예약공간 
Bit4 : 예약공간 
Bit3 : 예약공간 
Bit2 : 예약공간 
Bit1 : 예약공간 
Bit0 : SPI2X(SPI Double Speed Mode) - 2배속 모드(1 - 2배속 / 0 - 기본) 

SPDR은 SPI로 주고받는 데이터가 저장되는 8bit 레지스터임


• SPI 적용 예

데이터/명령 송신

① Busy 상태인가 확인 후 NON BUSY 상태 체크
② SPI control 레지스터에 SPI 사용 가능 및 클럭, Continuous 모드 설정
③ SPI Data 레지스터에 명령/데이터 송신
④ Busy 상태인가 확인 후 NON BUSY 상태 체크
⑤ 3,4의 과정(명령/데이터 송신 및 NON Busy 체크)을 데이터의 끝/마지막 명령까지 반복
⑥ 마지막 데이터의 경우 SPI Control 레지스터에 Continuous 모드를 제거하고 송신

데이터/명령 수신

① Busy 상태인가 확인 후 NON BUSY 상태 체크
② SPI control 레지스터에 SPI 사용 가능 및 클럭, Continuous 모드 설정
③ SPI Data 레지스터에 명령/데이터 송신
④ Busy 상태인가 확인 후 NON BUSY 상태 체크
⑤ SPI Data 레지스터에 0x00 패킷 송신
⑥ Busy 상태인가 확인 후 NON BUSY 상태 체크
⑦ SPI Data 레지스터에서 값을 읽음
⑧ 4-7을 마지막 데이터/명령까지 반복.
⑨ 마지막 데이터/명령인 경우 SPI Control 레지스터에 Continuous 모드 제거


SPI 통신 초기화

void SPI_Init(void)
{
/* CS, SCLK, TX : output */
/* RX : input */
/* CS 핀을 high로 설정한다 -> SPI 모듈 초기화 */
/* SPI 사용가능 모드 설정, CPOL=1, CPHA=0, clk=Fosc/8=1MHz */
/* SPI 초기화 완료 */
}


16비트로 구성된 명령을 송신 및 수신

void SPI_Cmd(unsigned short cmd, unsigned short *data)

/* high byte를 먼저 송신 */
/* 송신 완료될때까지 대기 */
/* 수신된 데이터를 저장. 이 데이터는 high byte이다 */
/* low byte를 송신 */
/* 송신 완료될때까지 대기 */
/* 수신된 low byte를 저장 */
}
728x90
반응형

댓글