- SPI sa STM32F103C8
- SPI Pins sa Arduino
- Kinakailangan ang Mga Bahagi
- Circuit Diagram at Mga Koneksyon para sa STM32 SPI Tutorial
- STM32 SPI Programming
- Paliwanag ng Master STM32 SPI Programming
- Alipin Arduino SPI Programming Paliwanag
Sa aming nakaraang mga tutorial, nalaman namin ang tungkol sa SPI at I2C na komunikasyon sa pagitan ng dalawang Arduino board. Sa tutorial na ito papalitan namin ang isang Arduino board ng Blue Pill board na STM32F103C8 at makikipag-usap sa Arduino board gamit ang SPI bus. Sa Halimbawa ng STM32 SPI na ito, gagamitin namin ang Arduino UNO bilang Alipin at STM32F103C8 bilang Master na may Dalawang 16X2 LCD display na magkakabit sa bawat isa nang magkahiwalay. Dalawang Potentiometers ay konektado din sa STM32 (PA0) at Arduino (A0) upang matukoy ang pagpapadala ng mga halaga (0 hanggang 255) mula sa panginoon sa alipin at alipin sa panginoon sa pamamagitan ng pag-iba ng potensyomiter.
SPI sa STM32F103C8
Sa paghahambing ng SPI bus sa Arduino & STM32F103C8 Blue Pill board, ang STM32 ay mayroong 2 SPI bus dito habang ang Arduino Uno ay mayroong isang SPI bus. Ang Arduino Uno ay mayroong ATMEGA328 microcontroller, at ang STM32F103C8 ay mayroong ARM Cortex- M3 na ginagawang mas mabilis kaysa sa Arudino Board.
Upang matuto nang higit pa tungkol sa komunikasyon ng SPI, mag-refer sa aming nakaraang mga artikulo
- Paano gamitin ang SPI sa Arduino: Komunikasyon sa pagitan ng dalawang Arduino Boards
- Pakikipag-usap sa SPI sa PIC Microcontroller PIC16F877A
- Komunikasyon sa SPI sa pamamagitan ng Bit Banging
- Ang Raspberry Pi Hot Water Tank Leak Detector na gumagamit ng SPI Modules
- ESP32 Real Time Clock gamit ang DS3231 Module
STM32 SPI Pins STM32F103C8
Linya ng SPI1 | I-pin sa STM32F103C8 |
MOSI1 | PA7 o PB5 |
MISO1 | PA6 o PB4 |
SCK1 | PA5 o PB3 |
SS1 | PA4 o PA15 |
Linya ng SPI2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI Pins sa Arduino
Linya ng SPI |
I-pin sa Arduino |
MOSI |
11 o ICSP-4 |
MISO |
12 o ICSP-1 |
SCK |
13 o ICSP-3 |
SS |
10 |
Kinakailangan ang Mga Bahagi
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k Potentiometer - 4
- Breadboard
- Mga Koneksyon sa Mga Wires
Circuit Diagram at Mga Koneksyon para sa STM32 SPI Tutorial
Ipinapakita ng Talahanayan sa ibaba ang Mga Pin na Nakakonekta para sa komunikasyon ng STM32 SPI kay Arduino.
SPI Pin |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Ipinapakita ng talahanayan sa ibaba ang mga pin na konektado para sa Dalawang LCD (16x2) na may hiwalay na STM32F103C8 at Arduino.
LCD pin |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Sa Potentiometer Center PIN para sa LCD na kaibahan |
Sa Potentiometer Center PIN para sa LCD na kaibahan |
Ang RS |
PB0 |
2 |
RW |
GND |
GND |
E |
PB1 |
3 |
D4 |
PB10 |
4 |
D5 |
PB11 |
5 |
D6 |
PC13 |
6 |
D7 |
PC14 |
7 |
A |
+ 5V |
+ 5V |
K |
GND |
GND |
Mahalaga:
- Huwag kalimutan na ikonekta ang Arduino GND at STM32F103C8 GND magkasama.
STM32 SPI Programming
Ang programa ay katulad ng Arduino code. Pareho
Sa Halimbawa ng STM32 SPI na ito, gagamitin namin ang Arduino UNO bilang Alipin at STM32F103C8 bilang Master na may Dalawang 16X2 LCD display na magkakabit sa bawat isa nang magkahiwalay. Dalawang Potentiometers ay konektado din sa STM32 (PA0) at Arduino (A0) upang matukoy ang pagpapadala ng mga halaga (0 hanggang 255) mula sa panginoon sa alipin at alipin sa panginoon sa pamamagitan ng pag-iba ng potensyomiter.
Ang input ng analog ay kinuha sa STM32F10C8 pin PA0 (0 hanggang 3.3V) sa pamamagitan ng pag-ikot ng potensyomiter. Pagkatapos ang halaga ng pag-input na ito ay na-convert sa halaga ng Analog sa Digital (0 hanggang 4096) at ang digital na halagang ito ay karagdagang nai-map sa (0 hanggang 255) dahil maaari lamang kaming magpadala ng 8-bit (byte) na data sa pamamagitan ng komunikasyon ng SPI nang sabay-sabay.
Katulad din sa Slave side kumukuha kami ng halaga ng pag-input ng analog sa Arduino pin A0 mula sa (0 hanggang 5V) sa pamamagitan ng paggamit ng potentiometer. At muli ang halagang input na ito ay na-convert sa halaga ng Analog sa Digital (0 hanggang 1023) at ang digital na halagang ito ay karagdagang nai-map sa (0 hanggang 255)
Ang tutorial na ito ay may dalawang mga programa isa para sa master STM32 at iba pa para sa alipin na Arduino. Ang mga kumpletong programa para sa magkabilang panig ay ibinibigay sa pagtatapos ng proyektong ito na may isang demonstrasyong Video.
Paliwanag ng Master STM32 SPI Programming
1. Una sa lahat kailangan nating isama ang SPI library para sa paggamit ng mga pagpapaandar ng komunikasyon ng SPI at LCD library para sa paggamit ng mga pagpapaandar ng LCD. Tukuyin din ang mga pin ng LCD para sa 16x2 LCD. Dagdagan ang nalalaman tungkol sa interfacing LCD sa STM32 dito.
# isama
2. Sa void setup ()
- Simulan ang Serial Communication sa Baud Rate 9600.
Serial.begin (9600);
- Susunod na simulan ang komunikasyon sa SPI
SPI.begin ();
- Pagkatapos itakda ang Clock divider para sa komunikasyon ng SPI. Itinakda ko ang divider 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Susunod na itakda ang SS pin MATAAS dahil hindi namin sinimulan ang anumang paglipat sa alipin arduino.
digitalWrite (SS, TAAS);
3. Sa void loop ()
- Bago magpadala ng anumang halaga sa alipin kailangan nating MABABA ang halaga ng pagpili ng alipin upang simulang ilipat sa alipin mula sa panginoon.
digitalWrite (SS, LOW);
- Susunod na basahin ang halaga ng analog mula sa master STM32F10C8 POT na nakakabit sa pin PA0.
int pot = analogRead (PA0);
Pagkatapos ay i-convert ang halagang ito sa mga tuntunin ng isang byte (0 hanggang 255).
byte MasterSend = mapa (palayok, 0,4096,0,255);
- Narito ang mahalagang hakbang, sa sumusunod na pahayag ipinadala namin ang na-convert na halaga ng POT na nakaimbak sa variable ng Mastersend sa alipin na Arduino, at tumatanggap din ng halaga mula sa alipin na Arduino at naimbak iyon sa mastereceive variable.
Mastereceive = SPI.transfer (Mastersend);
- Susunod na ipakita ang mga natanggap na halaga mula sa alipin arduino na may pagkaantala ng 500 microsecond at pagkatapos ay patuloy na makatanggap at ipakita ang mga halaga.
Serial.println ("Alipin Arduino sa Master STM32"); Serial.println (MasterReceive lcd.setCursor (0,0); lcd.print ("Master: STM32"); lcd.setCursor (0,1); lcd.print ("SalveVal:"); lcd.print (pagkaantala ng MasterReceive (500); digitalWrite (SS, TAAS);
Tandaan: Gumagamit kami ng serial.println () upang matingnan ang resulta sa Serial Motor ng Arduino IDE.
Alipin Arduino SPI Programming Paliwanag
1. Parehas bilang master, una sa lahat kailangan nating isama ang SPI library para sa paggamit ng mga pagpapaandar ng komunikasyon ng I2C at LCD library para sa paggamit ng mga LCD function. Tukuyin din ang mga pin ng LCD para sa 16x2 LCD.
# isama
2. Sa void setup ()
- Nagsisimula Kami ng Serial Communication sa Baud Rate 9600.
Serial.begin (9600);
- Itinakda sa ibaba ang pahayag na MISO bilang OUTPUT (Kailangang Magpadala ng data sa Master IN). Kaya't ang data ay ipinadala sa pamamagitan ng MISO ng Slave Arduino.
pinMode (MISO, OUTPUT);
- Ngayon I-on ang SPI sa Slave Mode sa pamamagitan ng paggamit ng SPI Control Rehistro
SPCR - = _BV (SPE);
- Pagkatapos ay i-ON ang makagambala para sa komunikasyon ng SPI. Kung ang isang data ay natanggap mula sa master ang Interrupt Service Routine ay tinatawag at ang natanggap na halaga ay kinuha mula sa SPDR (SPI Data register)
SPI.attachInterrupt ();
- Ang halaga mula sa master ay kinuha mula sa SPDR at nakaimbak sa Slavereceived variable. Nagaganap ito sa pagsunod sa pag-andar ng Nakagambala na Rutin.
ISR (SPI_STC_vect) {Slavereceived = SPDR; natanggap = totoo; }
3. Susunod sa void loop ()
- Basahin ang halagang analog mula sa Slave Arduino POT na nakakabit sa pin A0.
int pot = analogRead (A0);
- I-convert ang halagang iyon sa mga tuntunin ng isang byte na 0 hanggang 255.
Slavesend = mapa (palayok, 0,1023,0,255);
- Susunod na mahalagang hakbang ay upang ipadala ang na-convert na halaga sa Master STM32F10C8, kaya ilagay ang halaga sa rehistro ng SPDR. Ang rehistro ng SPDR ay ginagamit upang magpadala at tumanggap ng mga halaga.
SPDR = Slavesend;
- Pagkatapos ay ipakita ang natanggap na halaga ( SlaveReceive ) mula sa Master STM32F103C8 sa LCD na may pagkaantala ng 500 microsecond at pagkatapos ay patuloy na makatanggap at ipakita ang halagang iyon.
lcd.setCursor (0,0); lcd.print ("Alipin: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); pagkaantala (500);
Sa pamamagitan ng pag- ikot ng Potentiometer sa isang gilid, makikita mo ang iba't ibang mga halaga sa LCD sa isa pang panig:
Kaya't ganito nagaganap ang komunikasyon sa SPI sa STM32. Ngayon ay maaari mong i-interface ang anumang sensor ng SPI na may board na STM32.
Ang kumpletong pag-coding para sa Master STM32 at Slave Arduino ay ibinibigay sa ibaba na may isang demonstration video