본문으로 바로가기

자이로센서 myGyro300SPI의 통신문제 해결

category Robot/Project 2009. 6. 22. 12:01
자이로센서의 출력에 온도를 고려하기에서 자이로센서 myGyro300SPI를 사용할때 데이터가 하나씩 밀려들어오는 부분을 이야기했었습니다. 그리고 역시 Withrobot의 irmus님께서 정말 고맙게도 직접 오셔서 그 답변을 달아주셨다는...쿨럭... 그래서 그 답변대로 테스트를 해보았습니다.


위 답변인데요. 본래 제 코드의 문제점이 CS의 ON, OFF 부분


그리고 데이터 밀림은 dummy를 하나 받음으로 해결한다...


였습니다. 그래서 코드를


위와 같이 ReadGyro함수를 변경하고


기존의 코드에서 타이머핸들러 부분을 위와같이 두었습니다. ReadGyro 함수를 보면 어차피 여러개의 데이터를 받을거면 dummy를 읽는 부분이 좀 중복되긴 하지만, 사용상의 편의를 위해 그냥 저렇게 두었습니다. 그런데 자이로의 출력이 정상적으로 나오질 않습니다. 음 정상적이라고 할 수 있는데 중간중간에 4000대의 값이 불규칙적으로 들어온다는 것을 확인했습니다.

그래서 혹시나 하고 다시


위와 같이 CS ON-OFF를 사이사이에 삽입했습니다. ... 음... 깨끗한 데이터 출력을 보장받을 수 있더군요... 헉... 이.. 이건 또 무엇인지...

그러나 뭐... 제가 의도한데로 데이터출력이 나타나길래 일단 패스~~~~
원인이 무엇이었을까요? ㅎㅎㅎ...ㅜ.ㅜ

댓글을 달아 주세요

  1. BlogIcon irmus 2009.06.22 12:38

    첫번째 개선함수에서...
    cs assert
    put cmd
    get dummy
    cs deassert <- 추가
    cs assert <- 추가
    put dummy
    get data
    cs deassert

    처럼 되어야 정상이겠지요....
    SPI 통신에서 full-duplex의 의미와 CS를 통한 frame의 시작/종료를 한번 타이밍 차트를 그려서 생각해 보세요.

    두번째로 수정한것처럼 했을때 동작하는것 처럼 보이는 것은 SSI peripheral의 state machine때문일 것입니다. 해보지 않아 확신하지는 못하지만, 아마 오실로스코프로 관찰하면 CS핀이 아주 짧은 시간(1 usec 이하) 흔들린 다음에 SPI 프레임이 하나 지나가는 형태로 동작할 것이라 츠측됩니다. 어쨌든 비정상인 것이죠.

    SPI랑 상관은 좀 떨어지지만...
    SPI 통신을 1Mbps로 설정해서 사용하면서 100Hz로 제어하는 타이머 돌고 있는 상황에, 4개 값을 얻기 위해 SPI 통신에만 무려 8개 프레임, 128usec를 낭비하는건 좀 바람직하지 않은 상황입니다. SPI 통신속도를 높이거나, 인터럽트와 FIFO를 사용해서 대기시간을 활용하거나, pipeline처럼 적용해서 SPI 프레임 갯수를 줄여서 시간낭비를 줄여보세요.

    • BlogIcon PinkWink 2009.06.22 16:19 신고

      헤...답변감사합니다... 제가 질문내용중 실수를 한 부분이 있네요...
      http://pinkwink.kr/81 에서 다시 정리했습니다.

    • BlogIcon PinkWink 2009.06.22 16:39 신고

      아..그리고 시간에 관한 조언 감사합니다.
      저도 낭비라는 생각 가지고있습니다.^^.
      그부분은 계속 노력해야지요...(하...발등에 불을 끄느라..)
      아무래도 잘 모르는게 많으니 예제대로 꾸며서
      아마 그럴겁니다...^^