Home » Post » STM » STM32F103 SPI 통신 CUBEMX로 초기 설정하기

STM32F103 SPI 통신 CUBEMX로 초기 설정하기

STM32F103 SPI 통신 목차

  1. STM32F103 SPI 통신 CUBEMX로 초기 설정하기 (현재 포스팅)
  2. STM32F103 SPI 통신 코드 작성하기

인터넷을 뒤져봐도 국내 블로그에서는 SPI를 다룬 글이 잘 없다. 요즘 근 일주일 동안 SPI 통신 칩 데이터 시트를 뒤져보고 HAL 드라이버도 뺑이쳐보고 온갖 삽질을 다해봤는데, 그 중에서 성공했던 세팅만 이 포스팅에 요약하고자 한다. 언제나 그렇듯 CUBEMX를 실행시킨다.

CUBEMX 설정

언제나 반갑다

이번에도 F103RB 칩을 사용한 NUCLEO 보드를 사용할 것이다.

 SPI2를 사용하는 것이 합당해 보이지만 뉴클레오 보드에서 Male to Male 핀으로 쉽게 연결하기 쉬운 핀이 SPI1에 있다. 따라서 LD2를 Disable(Reset State)로 한 뒤, SPI1을 활성화(Full-Duplex Master) 한다.

필자는 직접 NSS를 컨트롤 할 것이므로 Disable로 설정하였다. 여기서 NSS핀은 Low로 주었을 때 통신 시그널이 동작하고 High일 때 시그널에 영향을 받지 않게 설정하는 핀으로, Chip Select하는 기능을 수행한다 보면 된다.

마지막으로 PA4핀을 GPIO_Output으로 설정한다. 굳이 PA4핀일 이유는 없다. 자신이 꼽기 쉬운 핀으로 설정하도록 한다.

위 사진처럼 설정했다.

Configuration 탭으로 가서 SPI1을 실행한다.

SPI 세부 설정이 가능하다.

클럭이 18Mhz이상 설정이 불가하므로, 분주비(Prescaler)를 설정해줘야 한다. 여기서, 제어하고자 하는 칩의 스펙을 참고해서 최대로 통신할 수 있는 주파수가 몇인지 확인해봐야 한다.

데이터 시트 참고하기

    위의 데이터시트를 보면, 제어하고자 하는 칩의 최대 속도는 1/(100 X 10^-9) = 10Mhz임을 알 수 있다. 따라서 분주비를 조절해 10Mhz이하가 되도록 해야한다. 필자는 64 분주비를 사용해 1Mhz로 설정했다.

설정 항목에서 Clock Polarity(CPOL)와 Clock Phase(CPHA)항목이 있는데, 이 역시 칩마다 세팅이 다르므로 잘 고려해야한다.

이를테면, Clock Polarity는 idle 상태에서 Clock 핀이 high인지, Low인지 설정하는 항목이다.

Clock Phase는 클럭에서 첫 번째 엣지에서 신호를 캡쳐할 것인지, 두 번째 엣지에서 캡처할 것인지를 세팅하는 항목이다.  이 역시 제어하고자 하는 칩의 타이밍 다이어그램을 첨부해 이해를 돕고자 한다.

이 다이어그램 하나로 Clock Polarity와 Clock Phase을 결정한다.

  위에서 SCLK항목에서 통신을 하지 않을 때, High 상태를 유지함을 알 수 있다.  따라서 Clock Polarity는 High를 선택한다. 그리고, 클럭이 시작하는 순간을 보면 처음에는 Falling edge(High에서 Low로 클럭이 변함), 두번 째에는 Rising edge(Low에서 High로 클럭이 변함)임을 알 수 있다.

여기서 MSB(Most Significant Bit, 통신의 첫번 째 비트를 의미한다.)의 위치가 Rising edge에 위치함을 알 수 있다. 따라서 클럭의 첫번 째 edge가 아니고, 두번 째 edge에 위치하므로 2 Edge로 설정한다. 또한 First Bit에 MSB이 있다는 점도 눈여겨보자.

설정 마무리

따라서 필자는 아래와 같이 설정하였다.

따지고 보면 그리 어렵지 않다.

 필자는 직접 NSS핀을 컨트롤 할 것이므로, GPIO 설정도 해야한다.

이젠 GPIO이다.

NSS는 칩을 사용하지 않으면 High 상태였다가 사용할 때 Low가 되어야한다. 따라서 GPIO output level 을 High로 설정한다. 그리고, SPI 통신 속도가 굉장히 빠르므로, output speed도 High로 설정한다. 라벨도 NSS로 설정했다.

설정 결과는 아래와 같다.

다 됐다. 코드를 생성하면 끝이다.

다음 포스트 : STM32F103 SPI 통신 코드 작성하기

추신 >

혹여나 하드웨어 핀 연결 고민을 하는 분이 계실 것 같아서 첨언하자면, MOSI는 Master Output Slave Input의 약자고 MISO는 Master Input Slave Output의 약자이다.

따라서 MOSI는 MOSI핀과, MISO는 MISO핀과 연결해야 한다. USART처럼 서로 핀을 엇갈리게 연결하면 동작하지 않으므로 유의하도록 한다.

“STM32F103 SPI 통신 CUBEMX로 초기 설정하기”의 9개의 댓글

  1. STM32L151C8U6과 RHS2116을 SPI로 통신하려 하는데 여러 포스트 중에 가장 도움이 됐어요! 감사합니다!ㅠㅠ
    혹시 clock configuration은 어떻게 하나요??
    datasheet의 어떤 부분을 봐야하나요?
    아! 그리고 clock의 수는 코드 작성할 때, uint16_t Size로 정해주는게 맞나요?

    1. 안녕하세요! 칩이 보니까 학부에서 사용할 법한 칩이 아닌듯하니, 저랑 비슷하게 대학원 생활을 하시는 동지이신듯 하네요 ㅎㅎ
      L시리즈의 경우 제가 사용하는 F1시리즈랑 clock 설정이 다소 다를 수 있습니다. clock configuration은 굳이 안만지셔도 SPI1 configuration에서 클럭을 나눠서 쓰실 수 있습니다.
      만약에서 클럭을 직접 다루고 싶으시다면 해당 칩의 reference manual에서 클럭 공급이 어떻게 되어있고, 어떤 클럭을 만지셔야하는지를 보셔야 할듯 합니다.
      데이터시트에서 사용하시는 칩의 29페이지를 참고하셔서 클럭이 idle 상태에 클럭이 low인지, 클럭의 1번째 2번째 엣지 중 어떤것을 사용하는지, 그리고 데이커를 보내는 것이 MSB First인지, LSB First인지를 두고 다루시는 것을 추천드립니다.
      그러나, 제가 이 칩을 직접적으로 다뤄본적이 없으므로, 레지스터 설정까지 도와드리기는 힘들듯 합니다.
      건승하십쇼!

      1. 아! 넵! 감사합니다 학부생인데 대학원 인턴 중이라 모르는 것이 너무 많네요ㅠㅠㅠ
        참고해서 완성하겠습니다!
        빠르고 상세한 답변 정말 감사합니다!

        1. 훌륭하세요! 포기하지 않고 끊임없이 도전하시길 기원드리겠습니다.
          좋은 하루 보내세요!

    1. 통신하고자 하는 칩과 연계하여 동작중이라면 오실로스코프에 찍히지 않을 이유가 없습니다.
      아마도 칩과 연결하지 않고 무작정 보드와 물려서 계측을 시도하고자 하시는 듯한 것으로 추정중입니다만, 옆에서 직접 상황을 보지 않는 한 정확한 답변이 힘듭니다.

  2. 안녕하세요.
    STM32F-411RE의 TIM Encoder 32bit를 STM32F4-Discovery 로 전송할려고 하는데 잘 안됩니다.
    8bit 0~255까지는 전송이 잘되는데 그 이상의 숫자는 전송이 되질 안습니다.
    조언 부탁드립니다.

    1. 안녕하세요! 폰에서 알림이 안떠서 확인이 늦었습니다 하하;
      인코더가 SPI로 통신하는 듯 하네요. 제가 해당 모델을 모르니 정확하지 않을 수 있다는 점 미리 양해 부탁드립니다.
      아마 타이머의 데이터 전송이 1byte(8bit)씩 되는 듯 합니다. 그렇다면 데이터의 주소는 8비트씩 총 4개이므로 spi로 4개의 주소에 접속해서 데이터를 읽는 식으로 접근하셔야 할 듯 합니다.
      이를테면 데이터의 베이스 주소가 0x50이라고 한다면
      0x50으로 접근해서 데이터 1개
      0x51으로 접근해서 데이터 1개
      0x52으로 접근해서 데이터 1개
      0x53으로 접근해서 데이터 1개

      총 4개의 데이터를 읽는 것이 맞을 듯 합니다. HAL드라이버는 한 줄로 해결할 수 있게 잘 구성되어 있으니 다양하게 접근해서 공부해 보시는것을 추천드립니다.

      도움이 되셨길 바랍니다!

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.