STM32F103 SPI CUBEMX 로 LL 드라이버 초기설정 하는 예제입니다.
STM32F103 SPI 통신 LL 드라이버 목차
이전에 다룬 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로 설정했다.
설정 결과는 아래와 같다.
다 됐다. 코드를 생성하면 끝이다.
좌측 상단의 톱니바퀴 버튼을 누르고
내용 입력해주고
드라이버를 LL 드라이버로 바꾸어 준다.
그다음 생성하면 끝!
추신 >
혹여나 하드웨어 핀 연결 고민을 하는 분이 계실 것 같아서 첨언하자면, MOSI는 Master Output Slave Input의 약자고 MISO는 Master Input Slave Output의 약자이다.
따라서 MOSI는 MOSI핀과, MISO는 MISO핀과 연결해야 한다. USART처럼 서로 핀을 엇갈리게 연결하면 동작하지 않으므로 유의하도록 한다.