- SPI в STM32F103C8
- SPI щифтове в Arduino
- Необходими компоненти
- Електрическа схема и връзки за урок STM32 SPI
- STM32 SPI програмиране
- Основно STM32 SPI програмиране Обяснение
- Обяснение на програмирането на Slave Arduino SPI
В предишните ни уроци научихме за SPI и I2C комуникацията между две Arduino платки. В този урок ще заменим една платка Arduino с платката Blue Pill, която е STM32F103C8, и ще комуникира с платката Arduino с помощта на SPI шина. В този пример за STM32 SPI ще използваме Arduino UNO като Slave и STM32F103C8 като Master с два 16X2 LCD дисплея, прикрепени един към друг поотделно. Два потенциометра също са свързани със STM32 (PA0) и Arduino (A0), за да определят изпращащите стойности (от 0 до 255) от главен на подчинен и подчинен на главен чрез промяна на потенциометъра.
SPI в STM32F103C8
Сравнявайки SPI шината в Arduino и STM32F103C8 Blue Pill board, STM32 има 2 SPI шина в себе си, докато Arduino Uno има една SPI шина. Arduino Uno има ATMEGA328 микроконтролер в себе си, а STM32F103C8 има ARM Cortex-M3, което го прави по-бърз от Arudino Board.
За да научите повече за SPI комуникацията, вижте нашите предишни статии
- Как да използвам SPI в Arduino: Комуникация между две Arduino платки
- SPI комуникация с PIC микроконтролер PIC16F877A
- SPI комуникация чрез Bit Banging
- Детектор за теч на резервоар за топла вода Raspberry Pi с помощта на модули SPI
- Часовник в реално време ESP32 с помощта на модул DS3231
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 |
SPI щифтове в Arduino
SPI линия |
ПИН в Arduino |
МОСИ |
11 или ICSP-4 |
MISO |
12 или ICSP-1 |
SCK |
13 или ICSP-3 |
SS |
10 |
Необходими компоненти
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k потенциометър - 4
- Макет
- Свързване на проводници
Електрическа схема и връзки за урок STM32 SPI
Таблицата по-долу показва изводите, свързани за STM32 SPI комуникация с Arduino.
SPI щифт |
STM32F103C8 |
Arduino |
МОСИ |
PA7 |
11. |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Таблицата по-долу показва щифтовете, свързани за два LCD (16x2) със STM32F103C8 и Arduino поотделно.
LCD щифт |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Към централния ПИН на потенциометъра за LCD контраст |
Към централния ПИН на потенциометъра за LCD контраст |
RS |
PB0 |
2 |
RW |
GND |
GND |
Е. |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
К |
GND |
GND |
Важно:
- Не забравяйте да свържете заедно Arduino GND и STM32F103C8 GND.
STM32 SPI програмиране
Програмирането е подобно на кода на Arduino. Същото
В този пример за STM32 SPI ще използваме Arduino UNO като Slave и STM32F103C8 като Master с два 16X2 LCD дисплея, прикрепени един към друг поотделно. Два потенциометра също са свързани със STM32 (PA0) и Arduino (A0), за да определят изпращащите стойности (от 0 до 255) от главен на подчинен и подчинен на главен чрез промяна на потенциометъра.
Аналоговият вход се приема на STM32F10C8 щифт PA0 (0 до 3.3V) чрез завъртане на потенциометъра. След това тази входна стойност се преобразува в аналогова в цифрова стойност (0 до 4096) и тази цифрова стойност се преобразува допълнително в (0 до 255), тъй като можем да изпращаме само 8-битови (байтови) данни чрез SPI комуникация наведнъж.
По същия начин в Slave страна приемаме аналогова входна стойност на Arduino pin A0 от (0 до 5V) с помощта на потенциометър. И отново тази входна стойност се преобразува в аналогова в цифрова стойност (0 до 1023) и тази цифрова стойност се преобразува допълнително в (0 до 255)
Този урок има две програми - една за главен STM32 и друга за slave Arduino. Пълни програми за двете страни са дадени в края на този проект с демонстрационно видео.
Основно STM32 SPI програмиране Обяснение
1. На първо място трябва да включим SPI библиотека за използване на комуникационни функции SPI и LCD библиотека за използване на LCD функции. Определете също LCD щифтове за LCD 16x2. Научете повече за свързването на LCD със STM32 тук.
#include
2. При настройка за невалидност ()
- Стартирайте серийната комуникация със скорост на предаване 9600.
Serial.begin (9600);
- След това започнете SPI комуникацията
SPI.begin ();
- След това задайте делителя на часовника за SPI комуникация. Задал съм разделител 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- След това задайте SS пина HIGH, тъй като не стартирахме прехвърляне към slave arduino.
digitalWrite (SS, HIGH);
3. In void loop ()
- Преди да изпратим каквато и да е стойност на подчинен, трябва да НАМАЛИМ избраната подчинена стойност, за да започнем прехвърляне към подчинен от главен
digitalWrite (SS, LOW);
- След това прочетете аналоговата стойност от главния STM32F10C8 POT, прикрепен към щифт PA0.
int pot = analogRead (PA0);
След това преобразувайте тази стойност в един байт (0 до 255).
байт MasterSend = карта (пот, 0,4096,0,255);
- Тук идва важната стъпка, в следващото изявление ние изпращаме преобразуваната стойност на POT, съхранена в променливата Mastersend, на подчинения Arduino, а също така получаваме стойност от подчинения Arduino и съхраняваме тази в променливата mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- След това покажете получените стойности от подчиненото arduino със закъснение от 500 микросекунди и след това непрекъснато получавайте и показвайте стойностите.
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 delay (500); digitalWrite (SS, HIGH);
Забележка: Използваме serial.println (), за да видим резултата в Serial Motor на Arduino IDE.
Обяснение на програмирането на Slave Arduino SPI
1. Същото като master, на първо място трябва да включим SPI библиотека за използване на комуникационни функции I2C и LCD библиотека за използване на LCD функции. Определете също LCD щифтове за LCD 16x2.
#include
2. При настройка за невалидност ()
- Започваме серийна комуникация със скорост на предаване 9600.
Serial.begin (9600);
- По-долу изявлението задава MISO като ИЗХОД (Трябва да изпращате данни на Master IN). Така данните се изпращат чрез MISO на Slave Arduino
pinMode (MISO, OUTPUT);
- Сега включете SPI в режим Slave, като използвате SPI Control Register
SPCR - = _BV (SPE);
- След това включете прекъсването за SPI комуникация. Ако данните са получени от главен, се извиква рутинната услуга за прекъсване и получената стойност се взема от SPDR (регистър на данни SPI)
SPI.attachInterrupt ();
- Стойността от master се взема от SPDR и се съхранява в Slavereceived променлива. Това се случва в следната функция за прекъсване.
ISR (SPI_STC_vect) {Slavereceived = SPDR; получено = вярно; }
3. Следващ цикъл void ()
- Прочетете аналоговата стойност от Slave Arduino POT, прикрепен към щифт A0.
int pot = analogRead (A0);
- Преобразувайте тази стойност в един байт като 0 до 255.
Slavesend = карта (пот, 0,1023,0,255);
- Следващата важна стъпка е да изпратите преобразуваната стойност към Master STM32F10C8, така че поставете стойността в регистъра SPDR. Регистърът SPDR се използва за изпращане и получаване на стойности.
SPDR = Slavesend;
- След това покажете получената стойност ( SlaveReceive ) от Master STM32F103C8 на LCD със закъснение от 500 микросекунди и след това непрекъснато получавайте и показвайте тази стойност.
lcd.setCursor (0,0); lcd.print ("Slave: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); забавяне (500);
Чрез завъртане на потенциометъра от едната страна можете да видите различните стойности на LCD от другата страна:
Така че, как се осъществява комуникацията SPI в STM32. Сега можете да свържете всеки SPI сензор с платка STM32.
Пълното кодиране за Master STM32 и Slave Arduino е дадено по-долу с демонстрационно видео