SPI(Serial Peripheral Interface)는 Motorola사에 의하여 개발된 AVR과 주변 디바이스 또는 AVR사이에서 고속 동기식 데이터 전달을 할 수 있는 직렬통신 규약으로, MOSI, MISO, SCK, SS 4개의 통신선을 사용하는 고속 동기식 직렬통신 방식이다.
SPI 통신은 마스터가 각 슬레이브별로 독립적인 슬레이브 선택 신호 SS를 사용하여 슬레이브를 지정한 후에 통신을 수행한다. 이것은 슬레이브의 수가 증가하면 회로의 복잡성도 함께 증가한다는 의미이므로 슬레이브의 수가 많은 시스템에서는 SPI 통신이 적합하지 않을 수 있다.
SPI 통신은 I2C에 비하여 통신 제어가 간단하고 휠씬 높은 속도의 통신이 가능하다. 결국 SPI 직렬통신은 근거리에서 마스터와 슬레이브가 각각 1개씩 구성되는 시스템에서 고속으로 데이터를 전송하는데 적합한 통신방식이라고 할 수 있다.
PB0(SS) - 슬레이브 선택 핀으로 마스터가 여러 슬레이브 중에 활성화하는 슬이브를 선택하는 핀이다.(이 단자는 Low 신호가 입력되면 슬레이브가 선택된다.)
PB1(SCK) - SPI의 클럭이 출력되는 핀으로 마스터가 보내준다.
PB2(MOSI) - 마스터(출력), 슬레이브(입력) 핀으로 마스터에서 슬레이브로 시리얼 데이터를 출력
PB3(MISO) - 마스터(입력), 슬레이브(출력) 핀으로 슬레이브에서 마스터로 시리얼 데이터를 출력
◆SPI 인터럽트 벡터
Vector NO. | Program Address | Source | Interrupt Definition |
18 | 0x0022 | #pragma vector = SPI_STC_vect | SPI Serial Transfer Complete |
◆SPI 레지스터
SPCR(SPI Control Register) : SPI 제어 레지스터
이 레지스터는 SPI의 전반적인 동작을 제어하는 기능을 수행한다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 |
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
- SPIE(SPI Interrupt Enable)
SPI 전송이 완료되어 SPSR 레지스터의 SPIF 비트가 1로 되면서 인터럽트가 발생하는 것을 개별적으로 호용한다.
- SPE(SPI Enable)
SPI가 동작하는 것을 허용한다. SPI 직렬통신 모듈을 사용하려면 무조건 이를 1로 설정하여야 한다.
- DORD(Data Order)
SPI가 데이터를 직렬로 전송하는 순서를 지정하는데, 1로 설정하면 데이터를 LSB부터 전송하고, 0으로 설정하면 MSB부터 전송한다.
- MSTR(Master/Slave Select)
1로 설정하면 SPI 모듈이 마스터로 동작하도록 하고, 0으로 설정하면 SPI 모듈이 슬레이브로 동작하도록 한다. 만약 SPI를 마스터로 설정하였더라고 SS단자가 입력으로 설정되고 L상태로 드라이브되면 MSTR 비트는 자동으로 클리어되면서 슬레이브 모드로 되고 SPSR 레지스터에서 SPIF = 1로 되어 인터럽트가 발생된다.
- CPOL(Clock Polarity)
0으로 설정하면 통신을 수행하지 않을 때 SCK 클럭신호가 L상태에 있으며, 1로 설정되면 통신을 수행하지 않을 때 SCK 클럭신호가 H상태에 있게 된다.
CPOL | Leading Edge | Trailing Edge |
0 | Rising | Falling |
1 | Falling | Rising |
- CPHA(Clock Phase)
데이터 샘플링 동작이 수행되는 SCK 클럭신호의 위상을 설정한다. 이 비트를 0으로 설정하면 SCK 클럭신호에 의한 데이터 샘플링이 Leading Edge에서 수행되고, 1로 설정하면 데이터 샘플링이 Trailing Edge에서 수행된다.
CPHA | Leading Edge | Trailing Edge |
0 | Sample | Setup |
1 | Setup | Sample |
- SPR1, SPR0(SPI Clock Rate Select 1 and 0)
SPI가 마스터로 동작할 경우 SCK 클럭신호의 주파수를 결정한다. SPSR 레지스터에서 SPI2X = 1로 설정된 경우에는 주파수가 2배로 증가되어 2배소고 모드가 된다.
SPI2X | SPR1 | SPR0 | SCK Frequency |
0 | 0 | 0 | fosc/4 |
0 | 0 | 1 | fosc/16 |
0 | 1 | 0 | fosc/64 |
0 | 1 | 1 | fosc/128 |
1 | 0 | 0 | fosc/2 |
1 | 0 | 1 | fosc/8 |
1 | 1 | 0 | fosc/32 |
1 | 1 | 1 | fosc/64 |
SPSR(SPI Status Register) : SPI 상태 레지스터
이 레지스터는 SPI의 동작 상태를 나타내거나 SCK 클럭 신호의 주파수를 설정하는 기능을 수행한다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SPIF | WCOL | - | - | - | - | - | SPI2X |
R | R | R | R | R | R | R | R/W |
- SPIF(SPI Interrupt Flag)
SPI 전송이 완료되면 1로 세트 되면서 인터럽트가 요청된다. 또한 만약 SPI를 마스터로 설정하고 SS 단자가 입력으로 설정되어 L상태로 드라이브되면 MSTR 비트가 자동으로 클리어되면서 슬레이브 모드로 되고 SPIF = 1로 되어 인터럽트가 발생한다. 인터럽트가 처리되기 시작하면 이 비트는 자동으로 클리어 된다. 또한 사용자 프로그렘에서 SPSR 레지스터를 읽고 나서 SPDR 레지스터를 액세스하는 경우에도 이 비트가 클리어 된다.
- WCOL(Write COLIIsion Flag)
SPI가 데이터 전송을 수행하고 있는 동안에 SPDR 레지스터를 라이트하려고 시도하면 이 비트가 1로 세트된다. 사용자 프로그램에서 SPSR 레지스터를 읽고 나서 SPDR 레지스터를 액세스하면 SPIF와 WCOL 비트는 클리어 된다.
- SPI2X(Double SPI Speed Bit)
SPI가 마스터로 동작할 때 SCK 클럭신호의 주파수를 2배로 설정한다. 따라서 마스터 모드에서는 SCK 클럭신호의 주파수가 최고 fosc/2 까지 사용될 수 있다. 그러나 SPI가 슬레이브로 사용될 경우에는 SCK 클럭신호의 주파수가 fosc/4 이하에서만 올바른 동작이 보장된다.
SPDR(SPI Data Register) : SPI 데이터 레지스터
이 레지스터는 SPI가 송신할 데이터를 저장하거나 수신한 데이터를 저장한다.
SPDR 레지스터가 송신 버퍼로 사용되는 경우에는 단일 버퍼(Single Buffered Register)로 동작하며, 수신 버퍼로 사용되는 경우에는 이중 버퍼(Double Buffered Register)로 동작한다. 즉 송신에 경우에는 모든 데이터 비트가 시프트 아웃(shift out)되기 전에는 SPDR 레지스터에 그 다음에 송신할 데이터를 라이트할 수 없으나, 수신의 경우 수신 데이터는 그 다음 데이터의 모든 비트가 완전히 시프트인(shift in)되기 전까지만 SPDR 레지스터에서 읽어들이면 된다.
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
MSB | LSB | ||||||
R/W | R/W | R/W | R/W | R/W | R/W | R/W | R/W |
'소프트웨어 > AVR' 카테고리의 다른 글
TWI 직렬통신 (0) | 2012.01.02 |
---|---|
A/D 컨버터[Converter] (0) | 2011.10.05 |
아날로그 비교기 (0) | 2011.09.29 |
내부 EEPROM 읽기/쓰기 (0) | 2011.09.28 |
직렬통신[USART] (0) | 2011.09.27 |