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