티스토리 뷰
이번글에서는 stm32f103의 SPI 통신에 대해서 설명하도록 하겠다.
위의 블럭도에 나오는것처럼 stm32f103에는 두개의 SPI가 있다. APB2버스에 SPI1이 있고, APB1버스에 SPI2가 하나 더 연결되어 있다.
이번 글에서는 SPI1을 이용한 SPI 통신을 구현해 보는것을 설명하도록 하겠다.
먼저 SPI블럭이 어떻게 구성되어 있는지 알아보기 위하여 블럭도부터 분석해본다.
다른 기능들과 마찬가지로 SPI에도 다양한 설정을 이용하여 다양한 동작을 수행할 수 있으나, 가장 기본적인 동작은 CR1레지스터와 SR레지스터만 이용하여 동작 시킬 수 있다.
각 레지스터에 있는 비트필드에 대한 설명은 reference manual에 자세히 나와 있으므로 여기에서는 생략하기로 하겠다.
SPI 통신 기능 확인을 위한 회로 구성은 AVR 입문 과정중 SPI에서 설정하였던것처럼 SPI를 통한 ISP 회로 구성을 이용하겠다. 단지 차이점이라면 slave로 사용하였던 ATmega328대신에 ATtiny85를 이용하였다.
위의 그림이 SPI1에 연결된 핀이 어떤것인지 보여준다. SCK는 PA5에, MISO는 PA6에, MOSI는 PA7에 연결된다. Slave를 선택하기 위한 CS 신호는 PA4를 사용하는것으로 설정하였다.
위의 그림은 ATtiny85의 핀구성도이다. SCK, MISO, MOSI 핀들을 서로 연결하고 stm32f103의 PA4와 ATtiny85의 /RESET(PB5) 핀을 서로 연결한다. 물론 VCC와 GND도 알맞게 연결해 주어야 한다.
하드웨어 구성이 제대로 연결된것을 확인한 후 SPI를 이용하여 ATtiny85의 signiture ID값을 읽어 보도록 하겠다.
SPI를 초기화 하기 위한 코드는 위와 같다. CS 핀 동작을 software로 설정하도록 하기 위하여 SSM, SSI 비트를 set 한다.
SPI의 동작 속도는 slave의 동작 환경을 고려하여 설정한다. 이번 예에서는 ATtiny85의 동작 속도가 1MHz이고, ISP를 위하여 SPI 속도는 1/4 이하이어야 하므로 250KHz 이하가 되어야 한다. 따라서 BR prescale값을 256으로 설정하였다.
Master로 동작시키기 위하여 MSTR비트를 set한 후 enable 시켜준다.
SPI 데이터 송수신을 위한 코드는 위와 같다.
먼저, TX buffer가 empty 상태인지를 확인한 후 empty 상태이면 data register에 Tx data를 쓴다.
그 이후에 Rx buffer에 data가 들어 올때까지 기다리다가 data를 수신하면 data register에서 값을 읽어 return 해 준다.
실제 필요한 데이터를 송신하거나 수신할 때에는 위의 함수를 사용하면 된다.
이렇게 위에서 설명한 세개의 함수를 이용하여 실제 ATtiny85에서 signiture ID를 읽어 오도록 해 보겠다.
8번 줄에서 SPI 통신에 이용되는 핀들에 대해서 클럭 공급을 위하여 PORT A를 enable 시켜준다.
13번 줄에서는 SPI1을 enable 시킨다.
10,15~17번 줄은 해당 핀의 모드를 설정하는 부분이다.
11번줄은 CS 핀의 신호를 high로 유지 시켜주기 위한 코드이다.
Signature ID를 읽어 오기 위한 코드는 위와 같다.
이 부분은 AVR 입문과정을 참고하면 충분히 이해할 것이다.
프로그램을 빌드한 후 보드에서 실행 시켜 그 결과를 확인해 본다.
실행결과는 위와 같다.
읽어 온 signature ID는 0x1E, 0x93, 0x0B이다. 이 값이 맞는 값인지를 data sheet 문서를 보고 확인해 본다.
문서와 비교한 결과 정상적으로 signature ID를 SPI를 통해서 읽어왔음을 알수 있었다.
'ARM Cortex-M' 카테고리의 다른 글
DMA - UART (0) | 2017.05.22 |
---|---|
DMA (2) | 2017.05.13 |
I2C (0) | 2017.04.22 |
시스템 클럭 72MHz로 동작 시키는 방법 (0) | 2017.04.19 |
ADC (3) | 2017.04.15 |