- SPI в STM32F103C8
- Контакты SPI в Arduino
- Необходимые компоненты
- Принципиальная схема и подключения для STM32 SPI Tutorial
- Программирование STM32 SPI
- Пояснение к программированию Master STM32 SPI
- Пояснение к программированию Slave 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.
Чтобы узнать больше о коммуникации SPI, обратитесь к нашим предыдущим статьям.
- Как использовать SPI в Arduino: связь между двумя платами Arduino
- Связь SPI с PIC микроконтроллером 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 |
MOSI |
11 или ICSP-4 |
MISO |
12 или ICSP-1 |
SCK |
13 или ICSP-3 |
СС |
10 |
Необходимые компоненты
- STM32F103C8
- Ардуино
- ЖК 16x2 - 2
- Потенциометр 10k - 4
- Макетная плата
- Подключение проводов
Принципиальная схема и подключения для STM32 SPI Tutorial
В таблице ниже показаны контакты, подключенные для связи STM32 SPI с Arduino.
Вывод SPI |
STM32F103C8 |
Ардуино |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
В таблице ниже показаны контакты, подключенные для двух ЖК-дисплеев (16x2) с STM32F103C8 и Arduino отдельно.
ЖК-вывод |
STM32F103C8 |
Ардуино |
VSS |
GND |
GND |
VDD |
+ 5В |
+ 5В |
V0 |
К центральному контакту потенциометра для контраста ЖК-дисплея |
К центральному контакту потенциометра для контраста ЖК-дисплея |
RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
А |
+ 5В |
+ 5В |
K |
GND |
GND |
Важный:
- Не забудьте соединить Arduino GND и STM32F103C8 GND вместе.
Программирование STM32 SPI
Программирование похоже на код Arduino. Такой же
В этом примере STM32 SPI мы будем использовать Arduino UNO в качестве подчиненного устройства и STM32F103C8 в качестве главного устройства с двумя ЖК-дисплеями 16X2, прикрепленными друг к другу отдельно. Два потенциометра также подключены к STM32 (PA0) и Arduino (A0) для определения передаваемых значений (от 0 до 255) от ведущего к ведомому и ведомого к ведущему, изменяя потенциометр.
Аналоговый вход принимается на вывод PA0 STM32F10C8 (от 0 до 3,3 В) путем вращения потенциометра. Затем это входное значение преобразуется в аналоговое значение в цифровое (от 0 до 4096), и это цифровое значение дополнительно отображается на (от 0 до 255), поскольку мы можем отправлять только 8-битные (байтовые) данные через связь SPI за один раз.
Точно так же на стороне Slave мы берем значение аналогового входа на выводе A0 Arduino от (0 до 5 В) с помощью потенциометра. И снова это входное значение преобразуется в аналоговое значение в цифровое (от 0 до 1023), и это цифровое значение дополнительно отображается на (от 0 до 255).
В этом руководстве есть две программы: одна для главного STM32, а другая - для подчиненного Arduino. Полные программы для обеих сторон представлены в конце этого проекта с демонстрационным видео.
Пояснение к программированию Master STM32 SPI
1. Прежде всего, нам нужно включить библиотеку SPI для использования функций связи SPI и библиотеку LCD для использования функций LCD. Также определите контакты LCD для LCD 16x2. Узнайте больше о взаимодействии ЖК-дисплея с STM32 здесь.
#включают
2. В void setup ()
- Начните последовательную связь со скоростью 9600 бод.
Serial.begin (9600);
- Затем начните коммуникацию SPI
SPI.begin ();
- Затем установите делитель часов для связи SPI. Я установил делитель 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Затем установите контакт SS на ВЫСОКИЙ, поскольку мы не начали передачу на подчиненный Arduino.
digitalWrite (SS, HIGH);
3. В пустом цикле ()
- Перед отправкой любого значения на подчиненное устройство нам нужно НИЗКОЕ значение выбора подчиненного устройства, чтобы начать передачу на подчиненное устройство от мастера.
digitalWrite (SS, LOW);
- Затем считайте аналоговое значение с главного POT STM32F10C8, подключенного к выводу PA0.
int pot = analogRead (PA0);
Затем преобразуйте это значение в один байт (от 0 до 255).
байт MasterSend = map (pot, 0,4096,0,255);
- Вот важный шаг: в следующем утверждении мы отправляем преобразованное значение POT, хранящееся в переменной Mastersend, на подчиненный Arduino, а также получаем значение от подчиненного Arduino и сохраняем его в переменной mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Затем отобразите эти полученные значения от подчиненного Arduino с задержкой в 500 микросекунд, а затем непрерывно получите и отобразите значения.
Serial.println («От подчиненного Arduino к главному 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 (СС, ВЫСОКИЙ);
Примечание. Мы используем serial.println () для просмотра результата в последовательном двигателе Arduino IDE.
Пояснение к программированию Slave Arduino SPI
1. Так же, как и в мастере, в первую очередь нам нужно включить библиотеку SPI для использования функций связи I2C и библиотеку LCD для использования функций LCD. Также определите контакты LCD для LCD 16x2.
#включают
2. В void setup ()
- Мы запускаем последовательную связь со скоростью 9600 бод.
Serial.begin (9600);
- Нижеприведенный оператор устанавливает MISO как OUTPUT (необходимо отправлять данные в Master IN), поэтому данные отправляются через MISO ведомого Arduino.
pinMode (MISO, ВЫХОД);
- Теперь включите SPI в ведомом режиме с помощью регистра управления SPI.
SPCR - = _BV (SPE);
- Затем включите прерывание для связи SPI. Если данные получены от мастера, вызывается процедура обслуживания прерывания, и полученное значение берется из SPDR (регистр данных SPI).
SPI.attachInterrupt ();
- Значение от мастера берется из SPDR и сохраняется в переменной Slavereceived . Это происходит в следующей функции процедуры прерывания.
ISR (SPI_STC_vect) {Slavereceived = SPDR; получено = правда; }
3. Далее в void loop ()
- Считайте аналоговое значение с ведомого устройства Arduino POT, подключенного к выводу A0.
int pot = analogRead (A0);
- Преобразуйте это значение в один байт как от 0 до 255.
Slavesend = карта (горшок, 0,1023,0,255);
- Следующим важным шагом является отправка преобразованного значения в Master STM32F10C8, поэтому поместите значение в регистр SPDR. Регистр SPDR используется для отправки и получения значений.
SPDR = Slavesend;
- Затем отобразите полученное значение ( SlaveReceive ) от ведущего STM32F103C8 на ЖК-дисплее с задержкой в 500 микросекунд, а затем непрерывно получите и отобразите это значение.
lcd.setCursor (0,0); lcd.print («Подчиненный: Arduino»); lcd.setCursor (0,1); lcd.print ("МастерВал:"); Serial.println («От главного STM32 к подчиненному Arduino»); Serial.println (SlaveReceived); lcd.print (SlaveReceived); задержка (500);
При вращении потенциометра с одной стороны, вы можете увидеть различные значения на ЖК - дисплее на другой стороне:
Вот как происходит коммуникация SPI в STM32. Теперь вы можете подключить любой датчик SPI к плате STM32.
Полное кодирование для Master STM32 и Slave Arduino приведено ниже с демонстрационным видео.