- SPI в STM32F103C8
- SPI-шпильки в Arduino
- Потрібні компоненти
- Принципова схема та підключення для підручника STM32 SPI
- Програмування SPI STM32
- Пояснення щодо програмування майстра STM32 SPI
- Пояснення програмування підлеглого Arduino SPI
У наших попередніх підручниках ми дізналися про зв'язок SPI та I2C між двома платами Arduino. У цьому підручнику ми замінимо одну плату Arduino на плату Blue Pill, яка є STM32F103C8, і буде зв’язуватися з платою Arduino за допомогою шини SPI. У цьому прикладі STM32 SPI ми будемо використовувати Arduino UNO як підлеглий, а STM32F103C8 як ведучий з двома РК-дисплеями 16X2, прикріпленими один до одного окремо. Два потенціометри також підключені до STM32 (PA0) та Arduino (A0) для визначення значень передачі (від 0 до 255) від ведучого до веденого та від веденого до ведучого, варіюючи потенціометр.
SPI в STM32F103C8
Порівнюючи шину SPI в платі Arduino та STM32F103C8 Blue Pill, STM32 має 2 шини SPI, тоді як Arduino Uno має одну шину SPI. Arduino Uno має мікроконтролер ATMEGA328, а STM32F103C8 - ARM Cortex-M3, що робить його швидшим, ніж Arudino Board.
Щоб дізнатись більше про комунікацію SPI, зверніться до попередніх статей
- Як використовувати SPI в Arduino: Зв'язок між двома платами Arduino
- SPI-зв'язок з мікроконтролером PIC16F877A
- SPI-зв'язок через Bit Banging
- Детектор витоків гарячої води Raspberry Pi за допомогою модулів SPI
- Годинник реального часу ESP32 за допомогою модуля DS3231
STM32 SPI-шпильки STM32F103C8
SPI Line1 | Штифт у STM32F103C8 |
MOSI1 | PA7 або PB5 |
MISO1 | PA6 або PB4 |
SCK1 | PA5 або PB3 |
SS1 | PA4 або PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI-шпильки в Arduino
Лінія SPI |
Булавка в Arduino |
МОЗІ |
11 або ICSP-4 |
MISO |
12 або ICSP-1 |
SCK |
13 або ICSP-3 |
СС |
10 |
Потрібні компоненти
- STM32F103C8
- Ардуїно
- РК-дисплей 16x2 - 2
- Потенціометр 10k - 4
- Макет
- Підключення проводів
Принципова схема та підключення для підручника STM32 SPI
У таблиці нижче наведені контакти, підключені для зв'язку STM32 SPI з Arduino.
SPI Pin |
STM32F103C8 |
Ардуїно |
МОЗІ |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
У таблиці нижче наведені висновки, підключені для двох РК-дисплеїв (16x2) із STM32F103C8 та Arduino окремо.
РК-штифт |
STM32F103C8 |
Ардуїно |
VSS |
GND |
GND |
VDD |
+ 5В |
+ 5В |
V0 |
До центрального PIN-коду потенціометра для контрастності РК |
До центрального PIN-коду потенціометра для контрастності РК |
RS |
PB0 |
2 |
RW |
GND |
GND |
Е |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
ПК13 |
6 |
D7 |
ПК14 |
7 |
A |
+ 5В |
+ 5В |
К |
GND |
GND |
Важливо:
- Не забудьте з'єднати GND Arduino та STM32F103C8 GND разом.
Програмування SPI STM32
Програмування схоже на код Arduino. Так само
У цьому прикладі STM32 SPI ми будемо використовувати Arduino UNO як підлеглий, а STM32F103C8 як ведучий з двома РК-дисплеями 16X2, прикріпленими один до одного окремо. Два потенціометри також підключені до STM32 (PA0) та Arduino (A0) для визначення значень передачі (від 0 до 255) від ведучого до веденого та від веденого до ведучого, варіюючи потенціометр.
Аналоговий вхід приймається на контакт STM32F10C8 PA0 (від 0 до 3,3 В), обертаючи потенціометр. Потім це вхідне значення перетворюється в аналогове в цифрове значення (від 0 до 4096), і це цифрове значення додатково відображається до (від 0 до 255), оскільки ми можемо надсилати лише 8-бітові (байтові) дані за допомогою SPI-зв'язку одночасно.
Подібним чином на підлеглій стороні ми приймаємо значення аналогового входу на штифті Arduino A0 від (0 до 5 В) за допомогою потенціометра. І знову це вхідне значення перетворюється в аналогове в цифрове значення (від 0 до 1023), і це цифрове значення додатково відображається у (від 0 до 255)
Цей підручник має дві програми - одну для майстра STM32 та іншу для підлеглого Arduino. Повні програми для обох сторін наведені в кінці цього проекту з демонстраційним відео.
Пояснення щодо програмування майстра STM32 SPI
1. Перш за все нам потрібно включити бібліотеку SPI для використання функцій зв'язку SPI та бібліотеку LCD для використання функцій LCD. Також визначте РК-шпильки для РК-дисплеїв 16x2. Дізнайтеся більше про взаємодію РК із STM32 тут.
#включати
2. Налаштування void ()
- Почніть послідовний зв'язок зі швидкістю передачі даних 9600.
Serial.begin (9600);
- Далі розпочніть комунікацію SPI
SPI.begin ();
- Потім встановіть роздільник годинника для зв'язку SPI. Я встановив дільник 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Далі встановіть SS-штифт ВИСОКО, оскільки ми не розпочали жодну передачу на підлеглий arduino.
digitalWrite (SS, HIGH);
3. У циклі void ()
- Перш ніж відправляти будь-яке значення на ведений, нам потрібно ЗНИЖИТИ значення вибору веденого, щоб розпочати передачу на ведений з ведучого.
digitalWrite (SS, LOW);
- Далі прочитайте аналогове значення з ведучого STM32F10C8 POT, приєднаного до виводу PA0.
int pot = analogRead (PA0);
Потім перетворіть це значення в один байт (від 0 до 255).
байт MasterSend = карта (банк, 0,4096,0255);
- Ось важливий крок: у наступному твердженні ми надсилаємо перетворене значення POT, яке зберігається у змінній Mastersend, на підлеглий Arduino, а також отримуємо значення від підлеглого Arduino та зберігаємо це у змінній master .
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.
Пояснення програмування підлеглого Arduino SPI
1. Те саме, що і master, перш за все, нам потрібно включити бібліотеку SPI для використання функцій зв'язку I2C та бібліотеку LCD для використання функцій LCD. Також визначте РК-шпильки для РК-дисплеїв 16x2.
#включати
2. Налаштування void ()
- Ми починаємо послідовний зв'язок зі швидкістю передачі даних 9600.
Serial.begin (9600);
- Нижче оператор встановлює MISO як ВИХІД (потрібно надіслати дані Master IN), тому дані надсилаються через MISO Slave Arduino.
pinMode (MISO, OUTPUT);
- Тепер увімкніть SPI в режимі веденого, використовуючи реєстр керування SPI
SPCR - = _BV (SPE);
- Потім увімкніть переривання для зв'язку SPI. Якщо дані отримуються від ведучого, викликається процедура переривання служби, а отримане значення береться з SPDR (реєстру даних SPI)
SPI.attachInterrupt ();
- Значення з master береться з SPDR і зберігається у змінній Slavereceived . Це відбувається в наступній функції переривання.
ISR (SPI_STC_vect) {Slavereceived = SPDR; отримано = істина; }
3. Далі в циклі void ()
- Зчитайте аналогове значення з підлеглого Arduino POT, прикріпленого до виводу A0.
int pot = analogRead (A0);
- Перетворіть це значення в один байт як 0 на 255.
Slavesend = карта (горщик, 0,1023,0,255);
- Наступним важливим кроком є надсилання перетвореного значення на головний STM32F10C8, тому помістіть значення в реєстр SPDR. Регістр SPDR використовується для надсилання та отримання значень.
SPDR = Slavesend;
- Потім відображайте отримане значення ( SlaveReceive ) від Master STM32F103C8 на РК-дисплеї із затримкою в 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);
При обертанні потенціометра з одного боку, ви можете побачити різні значення на РК - дисплеї на іншій стороні:
Отже, так відбувається спілкування SPI в STM32. Тепер ви можете підключити будь-який датчик SPI до плати STM32.
Повне кодування Master STM32 і Slave Arduino наведено нижче з демонстраційним відео