반응형

1. SPI(Serial Peripheral Interface) 통신의 특징?

-. SPI를 인터넷에 검색해보면 I2C와 비교해서 설명하는 경우가 왕왕 있는데 비슷하면서도 다른 방식입니다. (근데 비교하며 설명한다는 거 자체가 I2C를 알고 있다는 전제가 깔리는 거니 제 블로그 취지와는 안 맞으므로 SPI만 별도로 설명하겠습니다.)

 

-. SPIMaterSlave가 동시에 통신이 가능한 전이중방식입니다. 동작 속도는 보통 400kHz를 사용하고요. CAN보다는 짧은 거리에서 사용 가능하기 때문에 보통 제어기 내부의 칩과 칩 사이의 통신을 위해서 많이 사용합니다. I2C통신보다는 빠르기 때문에(I2C 일반모드가 100kHz) 업데이트나 영상신호와 같은 대용량 데이터가 오갈 때 많이 사용됩니다.

 

-. SPIMasterSlave들의 연결방식을 서로 달리할 수 있는데 아래 사진의 1연결방식과 같은 독립 Slave연결 방식(각각의 SlaveMasterMOSI / MISO로 직접 연결되는 방식)2연결방식과 같은 Daisy-Chain Slave 연결방식 (Slave들끼리 MOSI/MISO를 엮어서 전체 입출력 라인을 하나로 묶은 것)으로 구성할 수 있습니다.

 

 

 

2. SPI통신의 구성 요소들

1) MOSI/MISO

-. 먼저 MOSI(Master out, Slave In)는 해석 그대로 마스터에서 데이터를 출력하기 위한 신호 선으로 SDI, DI, SI 등으로 불리기도 합니다. 다음으로 MISO(Master In, Slave Out)MOSI와 반대로 슬레이브에서 데이터를 출력하기 위한 신호 선으로 SDO, DO, SO 등으로 불리기도 합니다. 이때, MaserSlave 각각의 출력 신호 선이 따로 있기 때문에 전이중 방식(마치 전화통화처럼 동시에 송/수신을 할 수 있는 방식)이 가능합니다..

 

2) SCLK

-. SCLK(Slave Clock)클럭선입니다. , 클럭 주파수를 맞추기 위한 신호 선으로 동기 방식이기 Maser에서 Slave들에게 동작 타이밍을 맞추라는 의미의 클럭 신호를 쏴 주는데 이 신호가 흐르는 라인입니다. SCK, CLK라고 부르기도 합니다.

 

3) SS

-. SS(Slave Select) Master가 여러 개의 Slave 중 통신을 하고 싶은 Slave를 선택하기 위한 신호 선입니다. 예를 들어 위 그림에서 Slave1과 통신하기를 원한다면 SS1Low로 바꾸고, SS2High를 유지하면 Slave1과 통신이 시작되고 Slave2SCLKMOSI신호가 들어오더라도 그냥 무시하고 있는 거죠. Slave가 늘어날수록 SS#신호선도 늘어나야 되기 때문에 Slave가 여러 개인 시스템이라면 SPI통신을 하기에는 효율이 떨어집니다. CS(Chip Select), CE(chip Enable) 등으로 부르기도 합니다.

 

4) 통신순서

-. 위 내용들을 정리하자면 ① Master는 송수신할 Slave를 선택하기 위해 해당되는 SS# 신호를 보냅니다Slave선택 후 SCK 신호선을 통해 클럭 신호를 보내 SlaveMaster의 클럭을 맞춰주고, (클럭 신호는 MasterSlave만 맞추면 되기 때문에 High에서 보내든 Low에서 보내든 상관없습니다. 밑에 Rising/Falling edge 설명할 때 필요한 건데 모르셔도 됩니다.) ③ 클럭 신호에 따라 MOSI or MISO를 통해 데이터를 송수신합니다. ④ 마지막으로 데이터 송수신이 끝나면 SS를 끊고 통신을 종료하는 순서로 통신하게 됩니다.

 

-. 예를 들어 연결방식 1번 구조에서 MasterSlave1에게 11011011이라는 신호를 주고 동시에 Slave1Master에게 00100100이라는 신호를 주는 상황일 때의 SCLK, MOSI, MISO, SS1, SS2의 신호를 표현하면 다음과 같다. (Rising edge 가정, SS enable = Low 가정)

 

 

 

3. SPI모드 (Rising edge / Falling edge)

-. 처음에는 SPI의 통신 방식이나 와이어 구성을 통한 통신 인터페이스 이런 걸 써내려 가다가 이런 건 몰라도 제어기 이해하고 품질문제 다루는데 문제없겠다 싶어서 그냥 다 빼버렸습니다. 사실 빼는 김에 Rising/falling edge도 빼 버렸었는데 다시 생각해보니 타이밍 이슈 발생하면 이 정도는 알고 있어야 개선대책이 이해될 거 같아 싹 지운걸 처음부터 다시 쓰네요 ㅜㅜ

 

-. 동기식 통신인 SPI통신은 SCLK에 맞추어 데이터를 하나씩 교환합니다. 그럼 SCLK에 맞춰서 데이터를 교환한다는 건 알겠는데 뭘 어떻게 맞춘다는 걸까요? 클럭에 맞추는 방법은 크게 4가지입니다. 클럭이 High일 때 신호선이 HighData1Low0으로, 클럭이 Low일 때 신호선이 HighData1Low0으로, 클럭이 0에서 1로 바뀔 때(Rising edge) 신호선이 HighData1Low0으로, 클럭이 1에서 0으로 바뀔 때(Falling edge) 신호선이 HighData1Low0으로 인식하는 방법입니다. 좀 더 보기 좋게 쓰면 다음과 같습니다.

    • 클럭이 High 일 때 맞추어 Data Line의 상태로 Data 전송
    • 클럭이 Low 일 때 맞추어 Data Line의 상태로 Data 전송
    • 클럭이 Low 에서 High로 바뀔 때 맞추어 Data Line의 상태로 Data 전송 _ Rising Edge 방식
    • 클럭이 High에서 Low로 바뀔 때 맞추어 Data Line의 상태로 Data 전송 _ Falling Edge 방식

 

-. 보통 High 일 때 혹인 Low일 때 인식하는 방식은 잘 사용하지 않고 Rising/Falling edge 방식을 많이 사용하는데 이유는 클럭 라인에 노이즈가 유입될 경우 클럭신호가 왜곡되면서 잘못된 순간에 신호선의 상태를 Data로 취득해버릴 수도 있기 때문에 상대적으로 노이즈에 강한 Rising/falling edge방식을 많이 사용합니다.

 

-. 다시 원래 목적인 SPI의 모드로 돌아가 SCLK의 기본값이 0일 수도 있고 1일 수도 있습니다. 거기다 Rising Edge 방식을 사용할지, Falling Edge 방식을 사용할지에 따라 총 4가지 모드를 선택할 수 있는데요 그림으로 표현하면 대충 이런 식이 되겠네요. (빨강선이 신호를 읽는 순간)

 

반응형

+ Recent posts