준호씨의 블로그

SPI 삽질 이야기~ SPI 파형을 잡아라~ 본문

개발이야기

SPI 삽질 이야기~ SPI 파형을 잡아라~

준호씨 2010.07.08 02:06

아직도 SPI에 대해서 잘은 알지 못합니다만 그동안 삽질한 내용들에 대해 정리해 보는 시간을 가져 볼까 합니다.

 

SPI 간략 설명

image

출처 : http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

 

지금 저 그림을 보니 "아하" 하고 무슨 의미인지 알거 같네요. 처음엔 도대체 뭐가 뭔가 모르겠더군요. 모든 통신이 그러하듯 SPI도 일종의 데이터를 주고 받는 방식 중 하나이고 네트워크 프로그래밍을 하다 보면 서버와 클라이언트가 있듯이 SPI통신에는 SPI Master와 SPI Slave 가 있습니다.

위의 용어는 SCLK, MOSI, MISO, SS는 문서에 따라 조금씩 다르게 적혀 있기도 합니다.

SCLK는 Serial Clock 이란 말인데 SCK, CLK 등으로 쓰여지기도 하며

MOSI 는 Master Output Slave Input의 약어로 SIMO, SDI (Serial Data In), SI 로 표기되기도 합니다.

MISO 는 Master Input, Slave Output의 약어이고 SOMI, SDO, DO, SO로

SS 는 Slave Select로 CS(Chip Select) 등으로 표기 되기도 합니다. (개인적으로 처음엔 SS랑 CS가 같은건지 다른건지 헷갈리더군요)

 

아무튼 클럭이 발생하고 있고 (SCLK 활성화!) 칩이 선택되어 있으면 (SS 활성화!) 데이터를 주고 받는다 라고 생각하시면 될 듯 하네요. 그러면 그 동안 Master가 MOSI 를 통해 데이터를 쏩니다. 그러고 Slave가 그 데이터를 받고 MISO를 통해 답을 합니다. MISO 에서 보낸 만큼 MOSI 로 받는 다고 하더군요. 예를 들어 3바이트를 보내면 3바이트를 받고 5바이트를 보내면 5바이트를 받습니다.

 

아무튼 사설은 여기서 줄이고 (사실 제대로 알고 쓰는건지도 잘 모릅니다. 틀린 부분은 과감하게 지적 부탁드립니다!) 삽질기 본론으로 들어가 보도록 하겠습니다. 오늘은 그냥 파형 잡기 삽질기에 대해 쓰고 다음엔 리눅스 드라이버 삽질기를 다뤄 볼까 합니다.

 

처음에 사용하라고 오실로스코프를 주긴 주던데 오실로스코프는 수업시간에 구형을 잠깐 써봤을뿐 사용 방법도 제대로 몰랐습니다. 당췌 무슨 선을 어디다가 연결해야 될지.. 어떤 신호가 어떤 모양으로 나타날지 아는게 없어서 한참 고뇌 했었습니다. 아무튼 기술지원으로 오신분께 대략적인 SPI측정 방법과 트리거 사용법을 듣고 계속 Try Try!!

 

접지와의 삽질

처음엔 대충 20V 정도의 주기적인 파형이 잡히던데 이거 제대로 된건지 제대로 안된건지도 모르겠더군요. 결론은 잘못된거.. 접지가 제대로 안되면 그렇게 되는 듯 하더군요. 분명 접지 되는 부분이라고 설명 들었던 부분에 접지를 시켰는데 해당 보드에 문제가 있었는지 다른 보드에서는 그냥 수평선 파형이 나오더군요. 아무리 봐도 처음에 봤던 20V급의 파형은 말이 안되는게 문서에는 3.3V과 0V로 표현된다고 적혀 있었거든요. 이 부분은 저같은 슈퍼 초보가 아닌 이상 다들 쉽게 풀어 버렸을 문제 였으리라 봅니다 -_-;

 

SPI 파형은 어떻게 나오는가

당췌 SPI 파형이라는 놈을 본적도 없고... 문서를 봐도

image

출처 : http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

이런 그림만 나오는데 오실로스코프에는 저렇게 깔삼한 파형이 안나오던데 말입니다 -_-; 게다가 파형이란건 정말 순식간에 지나가 버릴텐데 오실로스코프로 어떻게 잡아야 하는건지 모르겠더군요. 트리거 기능을 사용해서 잡는 다곤 하던데 트리거를 사용해도 도통 잡히는건 없고 또다시 무한 삽질로 접어 들더군요. 그러다가 우연히 I2C 모드로 트리거를 걸어 보니 뭔가 잡히기는 하더군요. 분명 SPI를 쓰고 있는데 왜 I2C 모드로 잡힌단 말이냐! 결국은 커널쪽 드라이버 소스 쪽에 문제가 있는거 같더군요. 드라이버를 우째저째 바꾸다 보니 (드라이버 얘기는 다음에)

SDC12298 

드디어 SPI 트리거 모드에서 뭔가 잡힙니다 ㅠㅠ 만쉐이 ㅠㅠ 그나저나 오실로스코프 정말 좋더군요. 학교에서 사용하던 오실로스코프와 차원이 다르더군요. 각 선 별로 색깔도 다르게 나오고 데이터 값도 나오구요. 윈도우XP가 올라가 있고 심지어 화면은 터치스크린도 되더군요 @_@

아무튼 Slave 칩을 제어하기 위해서 첫번째 단계는 이게 SPI모드로 잡히고 있냐 없냐 였습니다. 0x00 0x50 0x00 을 보내면 처음에는 아무 의미 없는 값이 넘어오고 두번째로 보내면 SPI모드이면 0x01을 보내준다고 문서에 적혀져 있더군요.

하지만... 처음에 데이터를 보낼때 4개를 보내면 6개가 찍히고 3개를 보내면 4개가 찍히고.. 사람 헷갈리게 만드는 데이터가 자꾸 나오더군요 -_-; 게다가 4개를 보내면 뒤에 두개의 데이터는 사라지더군요. 예를 들어 0x01, 0x02, 0x03, 0x04를 보내면 0x01, 0x02는 정상인데 뒤의 값들이 사라졌습니다.

위의 모습은 0x00 0x50 0x00 0x00 을 보냈을때의 모습이라고 보시면 되겠습니다. 처음에는 저모양으로 나오는 뒤에가 잘렸는지 안잘렸는지.. 왜 뒤에 두개의 데이터가 더 있는지 이해가 안되더군요. 데이터가 잘려나간다는 사실은 보내는 데이터를 바꿔보고서 알 수 있었고 이래저래 옵션을 바꿔 보니 3개를 보내면 6개가 찍히고 4개를 보내면 8개가 찍히더군요. 6개를 보내면 12개가 찍히구요.

일단 받아오는 데이터가 안찍히니 왜 자꾸 두배더 많은 데이터를 보내기만 하는가 고민에 빠졌었습니다. 혹시 뭔가 잘 못 되어서 MISO 에 찍혀야 될 값이 MOSI 에 찍히는걸까 생각도 들고 여러가지 가정만 쏟아져 나왔습니다.

결론은 보드에 문제가 있더군요. 다른 보드를 사용해 보니 정상 동작!! 기존 개발자가 만들다 만 드라이버와 보드 불량으로 엄청나게 많은 삽질을 해 버리고 말았습니다. 덕분에 공부는 많이 되었군요;;

 

SDC12336

이것이 바로 정상 작동된 파형입니다 ㅠㅠ 감격 감격! 위의 파형에 비해 중간 중간 간격이 생겼는데 역시 삽질하면서 테스트 해본 Delay 옵션 때문에 저렇습니다. (참고로 제일 위의 파형이 클럭이고 두번째가 칩셀렉트, 세번째가 MOSI, 네번째가 MISO 입니다.)

아직 앞길은 멀고 인턴쉽 기간은 점점 끝나가고.. 어디까지 할 수 있을까 모르겠네요. 아무튼 끝까지 화이팅입니다 :D

6 Comments
댓글쓰기 폼