- SPI i STM32F103C8
- SPI Pins i Arduino
- Komponenter krävs
- Kretsschema och anslutningar för STM32 SPI-handledning
- STM32 SPI-programmering
- Master STM32 SPI Programmering Förklaring
- Slave Arduino SPI Programmering Förklaring
I våra tidigare handledning har vi lärt oss om SPI- och I2C-kommunikation mellan två Arduino-kort. I den här handledningen kommer vi att ersätta ett Arduino-kort med Blue Pill-kortet som är STM32F103C8 och kommunicera med Arduino-kortet med SPI-buss. I detta STM32 SPI-exempel kommer vi att använda Arduino UNO som Slave och STM32F103C8 som Master med två 16X2 LCD-skärmar fästa varandra separat. Två potentiometrar är också anslutna till STM32 (PA0) och Arduino (A0) för att bestämma sändningsvärdena (0 till 255) från master till slave och slave till master genom att variera potentiometern.
SPI i STM32F103C8
Jämförelse av SPI-buss i Arduino & STM32F103C8 Blue Pill-kort, har STM32 2 SPI-bussar i sig medan Arduino Uno har en SPI-buss. Arduino Uno har ATMEGA328 mikrokontroller i sig, och STM32F103C8 har ARM Cortex-M3 vilket gör det snabbare än Arudino Board.
För att lära dig mer om SPI-kommunikation, se våra tidigare artiklar
- Hur man använder SPI i Arduino: Kommunikation mellan två Arduino-kort
- SPI-kommunikation med PIC-mikrokontroller PIC16F877A
- SPI-kommunikation via Bit Banging
- Raspberry Pi varmvattentankläckardetektor med SPI-moduler
- ESP32 Realtidsklocka med DS3231-modul
STM32 SPI-stift STM32F103C8
SPI Line1 | Stift i STM32F103C8 |
MOSI1 | PA7 eller PB5 |
MISO1 | PA6 eller PB4 |
SCK1 | PA5 eller PB3 |
SS1 | PA4 eller PA15 |
SPI Line2 | |
MOSI2 | PB15 |
MISO2 | PB14 |
SCK2 | PB13 |
SS2 | PB12 |
SPI Pins i Arduino
SPI Line |
Stift i Arduino |
MOSI |
11 eller ICSP-4 |
MISO |
12 eller ICSP-1 |
SCK |
13 eller ICSP-3 |
SS |
10 |
Komponenter krävs
- STM32F103C8
- Arduino
- LCD 16x2 - 2
- 10k potentiometer - 4
- Bakbord
- Anslutande ledningar
Kretsschema och anslutningar för STM32 SPI-handledning
Tabellen nedan visar stiften anslutna för STM32 SPI-kommunikation med Arduino.
SPI-stift |
STM32F103C8 |
Arduino |
MOSI |
PA7 |
11 |
MISO |
PA6 |
12 |
SCK |
PA5 |
13 |
SS1 |
PA4 |
10 |
Tabellen nedan visar stiften anslutna för Two LCD (16x2) med STM32F103C8 och Arduino separat.
LCD-stift |
STM32F103C8 |
Arduino |
VSS |
GND |
GND |
VDD |
+ 5V |
+ 5V |
V0 |
Till Potentiometer Center PIN för LCD kontrast |
Till Potentiometer Center PIN för LCD kontrast |
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 |
Viktig:
- Glöm inte att ansluta Arduino GND och STM32F103C8 GND tillsammans.
STM32 SPI-programmering
Programmeringen liknar Arduino-koden. Det samma
I detta STM32 SPI-exempel kommer vi att använda Arduino UNO som Slave och STM32F103C8 som Master med två 16X2 LCD-skärmar fästa varandra separat. Två potentiometrar är också anslutna till STM32 (PA0) och Arduino (A0) för att bestämma sändningsvärdena (0 till 255) från master till slave och slave till master genom att variera potentiometern.
Analog ingång tas vid STM32F10C8 stift PA0 (0 till 3,3 V) genom att vrida potentiometern. Sedan konverteras detta ingångsvärde till Analog till Digital-värde (0 till 4096) och detta digitala värde mappas vidare till (0 till 255) eftersom vi bara kan skicka 8-bitars (byte) data via SPI-kommunikation på en gång.
På samma sätt i slavsidan tar vi analogt ingångsvärde vid Arduino-stift A0 från (0 till 5V) med hjälp av potentiometer. Och återigen konverteras detta ingångsvärde till Analog till Digital-värde (0 till 1023) och detta digitala värde kartläggs ytterligare till (0 till 255)
Denna handledning har två program, ett för master STM32 och ett för slav Arduino. Kompletta program för båda sidor ges i slutet av detta projekt med en demonstrationsvideo.
Master STM32 SPI Programmering Förklaring
1. Först och främst måste vi inkludera SPI-biblioteket för att använda SPI-kommunikationsfunktioner och LCD-bibliotek för att använda LCD-funktioner. Definiera även LCD-stift för 16x2 LCD. Läs mer om gränssnitt mellan LCD och STM32 här.
#omfatta
2. I ogiltig installation ()
- Starta seriekommunikation vid överföringshastighet 9600.
Serial.begin (9600);
- Därefter börjar SPI-kommunikationen
SPI.begin ();
- Ställ sedan in klockavdelaren för SPI-kommunikation. Jag har ställt in avdelare 16.
SPI.setClockDivider (SPI_CLOCK_DIV16);
- Sätt sedan SS-stiftet HIGH eftersom vi inte startade någon överföring till slavarduino.
digitalWrite (SS, HIGH);
3. I ogiltig slinga ()
- Innan vi skickar något värde till slaven måste vi LÅGA slavvalvärdet för att börja överföra till slav från master.
digitalWrite (SS, LOW);
- Läs sedan det analoga värdet från master STM32F10C8 POT ansluten till stift PA0.
int pot = analogRead (PA0);
Konvertera sedan detta värde i termer av en byte (0 till 255).
byte MasterSend = karta (pot, 0,4096,0,255);
- Här kommer det viktiga steget, i följande uttalande skickar vi det konverterade POT-värdet som är lagrat i Mastersend- variabeln till slaven Arduino, och vi får också värde från slaven Arduino och lagrade det i mastereceive- variabeln.
Mastereceive = SPI.transfer (Mastersend);
- Nästa visar de mottagna värdena från slaven arduino med en fördröjning på 500 mikrosekunder och tar sedan kontinuerligt emot och visar värdena.
Serial.println ("Slave Arduino till 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);
Obs: Vi använder serial.println () för att visa resultatet i Serial Motor of Arduino IDE.
Slave Arduino SPI Programmering Förklaring
1. Samma som master, först och främst behöver vi inkludera SPI-biblioteket för att använda I2C-kommunikationsfunktioner och LCD-bibliotek för att använda LCD-funktioner. Definiera även LCD-stift för 16x2 LCD.
#omfatta
2. I ogiltig installation ()
- Vi börjar seriekommunikation med överföringshastighet 9600.
Serial.begin (9600);
- Nedanstående uttalande anger MISO som OUTPUT (Måste skicka data till Master IN). Så data skickas via MISO från Slave Arduino.
pinMode (MISO, OUTPUT);
- Aktivera nu SPI i slavläge med SPI Control Register
SPCR - = _BV (SPE);
- Slå sedan på PÅ-avbrott för SPI-kommunikation. Om en data tas emot från mastern anropas Interrupt Service Routine och det mottagna värdet tas från SPDR (SPI data Register)
SPI.attachInterrupt ();
- Värdet från mastern hämtas från SPDR och lagras i Slavereceived variable. Detta sker i följande avbryt rutinfunktion.
ISR (SPI_STC_vect) {Slavereceived = SPDR; mottagen = sant; }
3. Nästa i ogiltig slinga ()
- Läs det analoga värdet från Slave Arduino POT ansluten till stift A0.
int pot = analogRead (A0);
- Konvertera det värdet i termer av en byte som 0 till 255.
Slavesend = karta (pot, 0,1023,0,255);
- Nästa viktiga steg är att skicka det konverterade värdet till Master STM32F10C8, så placera värdet i SPDR-registret. SPDR-registret används för att skicka och ta emot värden.
SPDR = Slavesend;
- Visa sedan det mottagna värdet ( SlaveReceive ) från Master STM32F103C8 på LCD-skärmen med en fördröjning på 500 mikrosekunder och ta sedan kontinuerligt emot och visa dessa värden.
lcd.setCursor (0,0); lcd.print ("Slav: Arduino"); lcd.setCursor (0,1); lcd.print ("MasterVal:"); Serial.println ("Master STM32 to Slave Arduino"); Serial.println (SlaveReceived); lcd.print (SlaveReceived); fördröjning (500);
Genom att vrida potentiometern på ena sidan kan du se de olika värdena på LCD-skärmen på en annan sida:
Så detta är hur SPI-kommunikation sker i STM32. Nu kan du ansluta vilken SPI-sensor som helst med STM32-kortet.
Den fullständiga kodningen för Master STM32 och Slave Arduino ges nedan med en demonstrationsvideo