1. SPI 통신에 대해
기본적으로 쓰이던 직렬 통신 USART는 1:1로만 쓰인다. 그러므로 여러 장치와 연결하려면 그에 대응하는 여러 개의 송수신기가 필요하므로 하드웨어에서 제약이 있다. 이를 개선하도록 송신, 수신, 클럭 각각의 회선에서 분기하여 또 다른 장치를 연결하는 통신이 1980년대에 모토로라(Motorola)사에 의해 개발되는데 이것을 SPI(Serial Peripheral Interface : 직렬 주변기기 인터페이스)라고 부른다. 이 SPI 통신에 대해 알아본다.
2. SPI 통신 결선도
그림과 같이 SPI
통신의 결선도는 MOSI(Master Out, Slave In)끼리, MISO(Master In, Slave Out)끼리, SCLK(Serial
Clock)끼리, SS#(Slave Select)끼리
연결한다. 장치가 마스터(Master, 주 장치)인지 슬레이브(Slave, 부하 장치)인지에 따라 MOSI와 MISO에
대한 송신 또는 수신의 방향이 결정되는 동기식 전이중 통신이다.
SS’는 저 레벨 활성(Low Level Active) 방식으로 평상시에는
고 레벨을 유지해야 한다. SCLK은 이 중 마스터만이 관리하고 클럭과 함께 MOSI로 데이터를 송신한다. 슬레이브는 받은 클럭에 맞춰 MISO로 송신한다. 통신속도는 정해져 있지 않으나 슬레이브의 동작
상한 이내로만 정하면 동작하는데 보통 1 Mbps 수준에서 50 Mbps이상까지
범위가 넓다.
그림과 같이 통신을 1:1에서 1:N으로 변경되도록 슬레이브를 추가한다. 슬레이브 장치가 2대로 될 때 마스터에서 SS2#로 연결하는 회선을 추가하고 1번과 통신할 때 SS1#에, 2번과 통신할 때 SS2#에 저 레벨 신호를 주어 통신하는 대상을 결정한다. 3대째가 추가될 때도 마스터에서 추가된 SS3#이 슬레이브의 SS#와 연결된다. 같은 방식으로 계속 추가할 경우 통신 자체에는 개수 제한이 없으나 마스터가 SS#를 제어할 개별회선의 개수에 제약을 받는다. 이에 SS#회선의 개수를 줄이는 대신 마스터의 명령과 슬레이브의 응답을 반드시 순서대로 하게 되는 데이지 체인(Daisy-chain) 결선방식도 존재하나 여기서는 생략한다.
3. SPI 통신의 동작 모드
SPI 통신은 다른 통신과 다르게 데이터를 인식할 시점을 클럭을 기준으로 정해야 한다. 그림과 같이 두 개의 값을 읽는 샘플링 위치는 각 데이터의 가운데가 기준이 된다. 이 때 클럭의 에지(Edge)가 첫 번째인지 두 번째인지, 클럭의 위상이 정상인지 반전인지에 따라 다르다. CLK0과 CLK1의 경우 둘 다 정상위상이지만 CLK0은 첫 번째 에지에서, CLK1은 두 번째 에지에서 읽는다. CLK2와 CLK3은 반전위상에서 CLK2는 첫 번째, CLK3은 두 번째 에지에서 읽는다. 이렇게 조합하여 선택할 수 있는 4가지를 SPI 모드로 정하고 이 중 하나를 마스터와 슬레이브가 동일하게 선택해야 통신이 가능하다. 4가지의 모드를 정리하면 다음과 같다.
SPI 모드 |
위상반전(CPOL) |
위상지연(CPHA) |
0 |
정상(0) |
즉시(0) |
1 |
정상(0) |
지연(1) |
2 |
반전(1) |
즉시(0) |
3 |
반전(1) |
지연(1) |
위의 그림과 비교하면 클럭을 기준으로 정상위상이 CPOL(Clock Polarity)=0, 반전위상이 CPOL=1, 샘플링 기준 첫 번째 에지가 CPHA(Clock Phase)=0, 두 번째 에지가 CPHA=1이라고 볼 수 있다. 제조사마다 표의 표현 방식과 다를 수 있으므로 파형과 모드 번호를 확인하는 것이 좋다.
4. SPI 통신 데이터 프레임
SPI 통신에서는 사실상 정해진 데이터 프레임이 없다. 활성상태(Active)와 비활성상태(Inactive)를 SS#의 레벨로 구분하고, 신호의 하강에지 시점부터 상승에지 까지가
송수신하는 데이터 프레임이 되는데 그 데이터 비트의 양이 정해져 있지 않기 때문이다. 그림과 같이 활성상태에서의
클럭(SPI 모드 0)에 대해서만 데이터로 간주하고 그 외에는
인식하지 않는다. 연결된 장치에 따라 대기상태(Idle)에서
‘0’일수도 있고 ‘1’일수도 있지만 모두 무시하게 된다.
그림에서는 8비트에 대해 MSB(Most
Significant Bit : 최상위 비트)부터 전송하는 것을 보여주고 있으나 필요에
따라 LSB(Least Significant Bit : 최하위 비트)
우선으로 변경할 수도 있다. 그리고 SS#의
길이에 따라 더 많은 양의 전송도 가능한데 보통 짧게는 8 비트부터 길게는 100 비트가 넘는 하나의 프레임을 처리할 수도 있다.
참고로 8 비트로 100회 통신하는
것과 800 비트 1회 통신을 비교한다 할 때 데이터의 양은
동일하더라도 프레임단위 전송을 반복하는 쪽이 오래 걸린다. 전송을 전송할 때마다 전환에 따른 지연과
대기상태의 시간도 누적되기 때문이다. 그렇기에 가급적 한 번에 보내는 것이 유리하지만 너무 많은 양은
수신부에서 처리하기 어려운 경우도 있으므로 통신 주기와 주변환경을 고려하여 데이터 프레임의 크기를 결정하도록 한다. 아래는 16비트 연속전송의 예시이다.
5. DSPI, QSPI 통신
SPI 통신 중 마스터가 요청한 후 슬레이브가 응답하는 구조처럼 송신과 수신이 동시에 이루어지지 않는 것을 전제로 두 회선을 모두 송수신이 가능하도록 변경된 하드웨어가 있다. 이것을 DSPI(Dual Serial Peripheral Interface : 2중 SPI)로 부르고 반이중 방식의 두 회선으로 송신과 수신 속도 모두를 2배로 증가시킨다. MOSI이 IO0되어 짝수 비트를, MISO가 IO1이 되어 홀수비트를 담당하면 클럭 4개째에 1 바이트의 전송이 가능하다.
DSPI에 다시 IO2와 IO3을 추가하고 IO0이 0과 4번 비트를, IO1이 1과 5번 비트를, IO2가 2와 6번 비트를, IO3이 3과 7번비트를 맡아 송수신 하도록 한다. 이렇게 클럭 2개째에 1 바이트 전송이 끝나는 QSPI(Quad Serial Peripheral Interface : 4중 SPI)도 있다. 이 통신들은 빠른 읽기와 쓰기가 필요한 고속 메모리 회로에서 자주 볼 수 있다.
6. 결론
RAM계열의 메모리나 다중채널 ADC/DAC, 컬러LCD와 같이 빠른 직렬통신이 필요할 때 SPI 통신을 검토하도록 한다.
댓글 없음:
댓글 쓰기