- Hvad er SPI?
- Arbejde i SPI
- SPI Pins i Arduino UNO
- Brug af SPI i Arduino
- Komponenter, der kræves til Arduino SPI-kommunikation
- Arduino SPI kommunikations kredsløbsdiagram
- Sådan programmeres Arduino til SPI-kommunikation:
- Arduino SPI Master Programming Forklaring
- Arduino SPI Slave Programming Forklaring
- Hvordan fungerer SPI på Arduino? - Lad os teste det!
En mikrocontroller bruger mange forskellige protokoller til at kommunikere med forskellige sensorer og moduler. Der er mange forskellige typer kommunikationsprotokoller til trådløs og kablet kommunikation, og den mest anvendte kommunikationsteknik er seriel kommunikation. Seriel kommunikation er processen med at sende data en bit ad gangen sekventielt over en kommunikationskanal eller -bus. Der er mange typer seriel kommunikation som UART, CAN, USB, I2C og SPI-kommunikation.
I denne vejledning lærer vi om SPI-protokollen, og hvordan man bruger den i Arduino. Vi bruger SPI-protokol til kommunikation mellem to Arduinos. Her vil en Arduino fungere som mester og en anden vil fungere som slave, to lysdioder og trykknapper vil være forbundet til begge Arduino. For at demonstrere SPI-kommunikation vil vi styre lysdioden på mastersiden ved at trykke på knappen på slave-siden og omvendt ved hjælp af SPI Serial Communication Protocol.
Hvad er SPI?
SPI (Serial Peripheral Interface) er en seriel kommunikationsprotokol. SPI-interface blev fundet af Motorola i 1970. SPI har en full-duplex-forbindelse, hvilket betyder, at dataene sendes og modtages samtidigt. Det vil sige, at en master kan sende data til en slave, og en slave kan sende data til masteren samtidigt. SPI er synkron seriel kommunikation betyder, at uret er nødvendigt til kommunikationsformål.
SPI-kommunikation er tidligere forklaret i andre mikrocontrollere:
- SPI-kommunikation med PIC Microcontroller PIC16F877A
- Interfacing 3,5 tommer berøringsskærm TFT LCD med Raspberry Pi
- Programmering af AVR-mikrocontroller med SPI-ben
- Interfacing Nokia 5110 Grafisk LCD med Arduino
Arbejde i SPI
Et SPI har en master / slave kommunikation ved hjælp af fire linjer. Et SPI kan kun have en master og kan have flere slaver. En master er normalt en mikrokontroller, og slaverne kan være en mikrokontroller, sensorer, ADC, DAC, LCD osv.
Nedenfor er blokdiagramrepræsentationen af SPI Master med Single Slave.
SPI har følgende fire linjer MISO, MOSI, SS og CLK
- MISO (Master in Slave Out) - Slave-linjen til at sende data til masteren.
- MOSI (Master Out Slave In) - Masterlinjen til afsendelse af data til det perifere udstyr.
- SCK (Serial Clock) - Urimpulser, der synkroniserer datatransmission genereret af masteren.
- SS (Slave Select) –Master kan bruge denne pin til at aktivere og deaktivere bestemte enheder.
SPI Master med flere slaver
For at starte kommunikation mellem master og slave er vi nødt til at indstille den krævede enheds Slave Select (SS) pin til LOW, så den kan kommunikere med master. Når det er højt, ignorerer det mesteren. Dette giver dig mulighed for at have flere SPI-enheder, der deler de samme MISO-, MOSI- og CLK-linjer af master. Som du kan se i ovenstående billede er der fire slaver, hvor SCLK, MISO, MOSI er fælles forbundet til master, og SS for hver slave er forbundet separat til individuelle SS-ben (SS1, SS2, SS3) af master. Ved at indstille den krævede SS-pin LAV kan en master kommunikere med den slave.
SPI Pins i Arduino UNO
Billedet nedenfor viser SPI-benene, der er Arduino UNO (i rød boks).
SPI Line |
Pin i Arduino |
MOSI |
11 eller ICSP-4 |
MISO |
12 eller ICSP-1 |
SCK |
13 eller ICSP-3 |
SS |
10 |
Brug af SPI i Arduino
Inden du starter programmeringen til SPI-kommunikation mellem to Arduinos. Vi er nødt til at lære om Arduino SPI-biblioteket, der bruges i Arduino IDE.
Biblioteket
1. SPI.begin ()
BRUG: At initialisere SPI-bussen ved at indstille SCK, MOSI og SS til udgange, trække SCK og MOSI lavt og SS højt.
2. SPI.setClockDivider (skillevæg)
BRUG: At indstille SPI-urdeleren i forhold til systemuret. De tilgængelige skillevægge er 2, 4, 8, 16, 32, 64 eller 128.
Skillevægge:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (handler)
BRUG: Denne funktion kaldes, når en slaveenhed modtager data fra masteren.
4. SPI.transfer (val)
BRUG: Denne funktion bruges til samtidig at sende og modtage data mellem master og slave.
Så lad os starte med praktisk demonstration af SPI-protokol i Arduino. I denne vejledning bruger vi to arduino en som mester og anden som slave. Begge Arduino er fastgjort med en LED og en trykknap separat. Master LED kan styres ved hjælp af slave Arduinos trykknap og slave Arduinos LED kan styres af master Arduinos trykknap ved hjælp af SPI-kommunikationsprotokol til stede i arduino.
Komponenter, der kræves til Arduino SPI-kommunikation
- Arduino UNO (2)
- LED (2)
- Trykknap (2)
- Modstand 10k (2)
- Modstand 2.2k (2)
- Brødbræt
- Tilslutning af ledninger
Arduino SPI kommunikations kredsløbsdiagram
Nedenstående kredsløbsdiagram viser, hvordan du bruger SPI på Arduino UNO, men du kan følge den samme procedure for Arduino Mega SPI-kommunikation eller Arduino nano SPI-kommunikation. Næsten alt forbliver det samme bortset fra pinkoden. Du er nødt til at kontrollere pinout af Arduino nano eller mega for at finde Arduino nano SPI-stifter og Arduino Mega-stifter, når du først har gjort, at alt andet vil være det samme.
Jeg har bygget det ovenfor viste kredsløb over et brødbræt, du kan se kredsløbsopsætningen, som jeg brugte til test nedenfor.
Sådan programmeres Arduino til SPI-kommunikation:
Denne vejledning har to programmer, et til master Arduino og et andet til slave Arduino. Komplette programmer for begge sider gives i slutningen af dette projekt.
Arduino SPI Master Programming Forklaring
1. Først og fremmest skal vi inkludere SPI-biblioteket til brug af SPI-kommunikationsfunktioner.
#omfatte
2. I ugyldig opsætning ()
- Vi starter seriel kommunikation med baudrate 115200.
Serial.begin (115200);
- Fastgør LED til pin 7 og trykknap til pin 2, og indstil disse pins henholdsvis OUTPUT og INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Dernæst begynder vi SPI-kommunikationen
SPI.begin ();
- Dernæst indstiller vi Clockdivider til SPI-kommunikation. Her har vi indstillet skillevæg 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Indstil derefter SS-stiften HØJ, da vi ikke startede nogen overførsel til slave arduino.
digitalWrite (SS, HIGH);
3. I ugyldig løkke ():
- Vi læser status for trykknapstiften, der er tilsluttet pin2 (Master Arduino) for at sende disse værdier til slaven Arduino.
buttonvalue = digitalRead (ipbutton);
- Indstil logik til indstilling af x-værdi (skal sendes til slave) afhængigt af input fra pin 2
hvis (buttonvalue == HIGH) { x = 1; } andet { x = 0; }
- Før vi sender værdien, er vi nødt til at LAVE slavevalgværdien for at begynde overførslen til slave fra master.
digitalWrite (SS, LOW);
- Her kommer det vigtige trin, i den følgende erklæring sender vi trykknapværdien gemt i Mastersend- variablen til slave arduino og modtager også værdi fra slave, der vil blive gemt i Mastereceive- variabel.
Mastereceive = SPI.transfer (Mastersend);
- Derefter afhænger af Mastereceive- værdien, at vi tænder eller slukker for Master Arduino LED.
hvis (Mastereceive == 1) { digitalWrite (LED, HIGH); // Sætter pin 7 HIGH Serial.println ("Master LED ON"); } andet { digitalWrite (LED, LOW); // Sætter pin 7 LOW Serial.println ("Master LED OFF"); }
Bemærk: Vi bruger serial.println () til at se resultatet i Serial Motor of Arduino IDE. Tjek videoen i slutningen.
Arduino SPI Slave Programming Forklaring
1. Først og fremmest skal vi inkludere SPI-biblioteket til brug af SPI-kommunikationsfunktioner.
#omfatte
2. I ugyldig opsætning ()
- Vi starter seriel kommunikation med baudrate 115200.
Serial.begin (115200);
- Fastgør LED til pin 7 og trykknap til pin2, og indstil disse pins henholdsvis OUTPUT og INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Det vigtige trin her er følgende udsagn
pinMode (MISO, OUTPUT);
Ovenstående erklæring indstiller MISO som OUTPUT (skal sende data til Master IN). Så data sendes via MISO fra Slave Arduino.
- Tænd nu SPI i Slave Mode ved hjælp af SPI Control Register
SPCR - = _BV (SPE);
- Tænd derefter afbrydelsen TIL SPI-kommunikation. Hvis der modtages data fra master kaldes Interrupt Routine, og den modtagne værdi hentes fra SPDR (SPI data Register)
SPI.attachInterrupt ();
- Værdien fra master hentes fra SPDR og lagres i Slavereceived- variabel. Dette finder sted i følgende Afbryd rutinefunktion.
ISR (SPI_STC_vect) { Slavereceived = SPDR; modtaget = sandt; }
3. Dernæst indstiller vi i ugyldig sløjfe () Slave arduino-LED'en til at tænde eller slukke afhængigt af den slavermodtagne værdi.
hvis (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Indstiller pin 7 som HIGH LED ON Serial.println ("Slave LED ON"); } andet { digitalWrite (LEDpin, LOW); // Indstiller pin 7 som LOW LED OFF Serial.println ("Slave LED OFF"); }
- Dernæst læser vi status på Slave Arduino-trykknappen og gemmer værdien i Slavesend for at sende værdien til Master Arduino ved at give værdi til SPDR-registeret.
buttonvalue = digitalRead (buttonpin); hvis (buttonvalue == HIGH) {x = 1; } andet {x = 0; } Slavesend = x; SPDR = Slavesend;
Bemærk: Vi bruger serial.println () til at se resultatet i Serial Motor of Arduino IDE. Tjek videoen i slutningen.
Hvordan fungerer SPI på Arduino? - Lad os teste det!
Nedenfor er billedet af den endelige opsætning til SPI-kommunikation mellem to Arduino-kort.
Når der trykkes på trykknap på mastersiden, tænder den hvide lysdiode på slave-siden.
Og når der trykkes på trykknappen på slave-siden, tænder den røde lysdiode på mastersiden.
Du kan tjekke videoen nedenfor for at se demonstrationen af Arduino SPI-kommunikation. Hvis du har spørgsmål, bedes du lade dem være i kommentarfeltet, og brug vores fora.