- STM32F103C8의 SPI
- Arduino의 SPI 핀
- 필요한 구성 요소
- STM32 SPI 튜토리얼을위한 회로도 및 연결
- STM32 SPI 프로그래밍
- 마스터 STM32 SPI 프로그래밍 설명
- 슬레이브 Arduino SPI 프로그래밍 설명
이전 튜토리얼에서 두 Arduino 보드 간의 SPI 및 I2C 통신에 대해 배웠습니다. 이 튜토리얼에서는 하나의 Arduino 보드를 STM32F103C8 인 Blue Pill 보드로 교체하고 SPI 버스를 사용하여 Arduino 보드와 통신합니다. 이 STM32 SPI 예제 에서는 Arduino UNO를 슬레이브로 사용하고 STM32F103C8을 마스터로 사용하고 두 개의 16X2 LCD 디스플레이를 별도로 연결합니다. 두 개의 전위차계는 또한 STM32 (PA0) 및 Arduino (A0)와 연결되어 전위차계를 변경하여 마스터에서 슬레이브로, 슬레이브에서 마스터로 전송 값 (0 ~ 255)을 결정합니다.
STM32F103C8의 SPI
Arduino 및 STM32F103C8 Blue Pill 보드의 SPI 버스를 비교하면 STM32에는 2 개의 SPI 버스 가 있고 Arduino Uno에는 1 개의 SPI 버스가 있습니다. Arduino Uno에는 ATMEGA328 마이크로 컨트롤러가 있으며 STM32F103C8에는 ARM Cortex- M3이있어 Arudino 보드보다 빠릅니다.
SPI 통신에 대한 자세한 내용은 이전 기사를 참조하십시오.
- Arduino에서 SPI를 사용하는 방법: 두 Arduino 보드 간의 통신
- PIC 마이크로 컨트롤러 PIC16F877A와 SPI 통신
- Bit Banging을 통한 SPI 통신
- SPI 모듈을 사용하는 Raspberry Pi 온수 탱크 누출 감지기
- DS3231 모듈을 사용하는 ESP32 실시간 클록
STM32 SPI 핀 STM32F103C8
SPI 라인 1 | STM32F103C8의 핀 |
MOSI1 | PA7 또는 PB5 |
MISO1 | PA6 또는 PB4 |
SCK1 | PA5 또는 PB3 |
SS1 | PA4 또는 PA15 |
SPI 라인 2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
Arduino의 SPI 핀
SPI 라인 |
Arduino의 핀 |
MOSI |
11 또는 ICSP-4 |
MISO |
12 또는 ICSP-1 |
SCK |
13 또는 ICSP-3 |
SS |
10 |
필요한 구성 요소
- STM32F103C8
- Arduino
- LCD 16x2-2
- 10k 전위차계 – 4
- 브레드 보드
- 전선 연결
STM32 SPI 튜토리얼을위한 회로도 및 연결
아래 표는 Arduino와 STM32 SPI 통신 을 위해 연결된 핀을 보여줍니다.
SPI 핀 |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
아래 표는 STM32F103C8 및 Arduino를 사용하는 2 개의 LCD (16x2)에 개별적으로 연결된 핀을 보여줍니다.
LCD 핀 |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
LCD 대비를위한 전위차계 센터 PIN으로 |
LCD 대비를위한 전위차계 센터 PIN으로 |
RS |
PB0 |
2 |
RW |
GND |
GND |
이자형 |
PB1 |
삼 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
ㅏ |
+ 5V |
+ 5V |
케이 |
GND |
GND |
중대한:
- Arduino GND와 STM32F103C8 GND를 함께 연결하는 것을 잊지 마십시오.
STM32 SPI 프로그래밍
프로그래밍은 Arduino 코드와 유사합니다. 똑같다
이 STM32 SPI 예제 에서는 Arduino UNO를 슬레이브로 사용하고 STM32F103C8을 마스터로 사용하고 두 개의 16X2 LCD 디스플레이를 별도로 연결합니다. 두 개의 전위차계는 또한 STM32 (PA0) 및 Arduino (A0)와 연결되어 전위차계를 변경하여 마스터에서 슬레이브로, 슬레이브에서 마스터로 전송 값 (0 ~ 255)을 결정합니다.
전위차계를 회전하여 STM32F10C8 핀 PA0 (0 ~ 3.3V)에서 아날로그 입력을받습니다. 그런 다음이 입력 값은 Analog to Digital 값 (0 ~ 4096)으로 변환되고이 디지털 값은 SPI 통신을 통해 한 번에 8 비트 (바이트) 데이터 만 보낼 수 있으므로 (0 ~ 255)에 더 매핑됩니다.
마찬가지로 슬레이브 측에서는 전위차계를 사용하여 Arduino 핀 A0의 아날로그 입력 값을 (0 ~ 5V)에서 가져옵니다. 다시이 입력 값은 Analog to Digital 값 (0 ~ 1023)으로 변환되고이 디지털 값은 (0 ~ 255)에 추가로 매핑됩니다.
이 튜토리얼에는 마스터 STM32 용 프로그램과 슬레이브 Arduino 용 프로그램이 있습니다. 양측을위한 완전한 프로그램 은 데모 비디오 와 함께이 프로젝트의 끝에 제공됩니다.
마스터 STM32 SPI 프로그래밍 설명
1. 먼저 SPI 통신 기능을 사용하기위한 SPI 라이브러리 와 LCD 기능을 사용하기위한 LCD 라이브러리 를 포함 해야 합니다. 16x2 LCD 용 LCD 핀도 정의합니다. 여기에서 STM32와 LCD 인터페이스에 대해 자세히 알아보십시오.
#포함
2. void setup ()에서
- Baud Rate 9600에서 직렬 통신을 시작합니다.
Serial.begin (9600);
- 다음으로 SPI 통신 시작
SPI.begin ();
- 그런 다음 SPI 통신을 위해 클록 분배기를 설정합니다. 칸막이 16을 설정했습니다.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- 다음으로 슬레이브 arduino 로의 전송을 시작하지 않았으므로 SS 핀을 HIGH로 설정하십시오.
digitalWrite (SS, HIGH);
3. void loop ()에서
- 슬레이브로 값을 보내기 전에 마스터에서 슬레이브로 전송을 시작하기 위해 슬레이브 선택 값을 낮춰야합니다.
digitalWrite (SS, LOW);
- 다음으로 핀 PA0에 연결된 마스터 STM32F10C8 POT에서 아날로그 값을 읽습니다.
int pot = analogRead (PA0);
그런 다음이 값을 1 바이트 (0 ~ 255)로 변환합니다.
바이트 MasterSend = map (pot, 0,4096,0,255);
- 중요한 단계는 다음과 같습니다. 다음 명령문에서 Mastersend 변수에 저장된 변환 된 POT 값을 슬레이브 Arduino로 보내고 슬레이브 Arduino에서 값을 받아 mastereceive 변수에 저장 합니다.
Mastereceive = SPI.transfer (Mastersend);
- 다음으로 500 마이크로 초의 지연으로 슬레이브 arduino에서 수신 된 값을 표시 한 다음 계속해서 값을 수신하고 표시합니다.
Serial.println ("Slave Arduino to Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (MasterReceive 지연 (500); digitalWrite (SS, HIGH);
참고: Arduino IDE의 Serial Motor에서 결과를보기 위해 serial.println ()을 사용합니다.
슬레이브 Arduino SPI 프로그래밍 설명
1. 마스터와 동일하게 먼저 I2C 통신 기능을 사용하기위한 SPI 라이브러리 와 LCD 기능을 사용하기위한 LCD 라이브러리 를 포함 해야 합니다. 16x2 LCD 용 LCD 핀도 정의합니다.
#포함
2. void setup ()에서
- Baud Rate 9600에서 직렬 통신을 시작합니다.
Serial.begin (9600);
- 아래 문은 MISO를 OUTPUT (Have to Send data to Master IN)로 설정하므로 Slave Arduino의 MISO를 통해 데이터를 전송합니다.
pinMode (MISO, OUTPUT);
- 이제 SPI 제어 레지스터를 사용하여 슬레이브 모드에서 SPI를 켭니다.
SPCR-= _BV (SPE);
- 그런 다음 SPI 통신을 위해 인터럽트를 켭니다. 마스터로부터 데이터가 수신되면 인터럽트 서비스 루틴이 호출되고 수신 된 값은 SPDR (SPI 데이터 레지스터)에서 가져옵니다.
SPI.attachInterrupt ();
- 마스터의 값은 SPDR에서 가져와 Slavereceived 변수에 저장됩니다. 이는 다음 인터럽트 루틴 기능에서 발생합니다.
ISR (SPI_STC_vect) {Slavereceived = SPDR; 받은 = 참; }
3. 다음 무효 루프 ()
- 핀 A0에 연결된 Slave Arduino POT에서 아날로그 값을 읽습니다.
int pot = analogRead (A0);
- 이 값을 1 바이트 단위로 0에서 255로 변환합니다.
노예 = map (pot, 0,1023,0,255);
- 다음 중요한 단계는 변환 된 값을 마스터 STM32F10C8로 보내는 것이므로 값을 SPDR 레지스터에 배치합니다. SPDR 레지스터는 값을 보내고받는 데 사용됩니다.
SPDR = 노예;
- 그런 다음 마스터 STM32F103C8에서 수신 된 값 ( SlaveReceive )을 500 마이크로 초의 지연으로 LCD에 표시 한 다음 해당 값을 계속 수신하여 표시합니다.
lcd.setCursor (0,0); lcd.print ("슬레이브: 아두 이노"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("마스터 STM32에서 슬레이브 Arduino로"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); 지연 (500);
에 의해 한쪽에서 전위차계 회전, 다른 측면에서 LCD에 다양한 값을 볼 수 있습니다:
그래서 이것이 STM32에서 SPI 통신이 일어나는 방식입니다. 이제 모든 SPI 센서를 STM32 보드와 인터페이스 할 수 있습니다.
Master STM32 및 Slave Arduino의 전체 코딩은 데모 비디오와 함께 아래에 제공됩니다.