- Wat is SPI?
- Werking van SPI
- SPI-pinnen in Arduino UNO
- SPI gebruiken in Arduino
- Vereiste componenten voor Arduino SPI-communicatie
- Arduino SPI-communicatiecircuitschema
- Arduino programmeren voor SPI-communicatie:
- Uitleg over Arduino SPI Master Programming
- Arduino SPI Slave Programming Toelichting
- Hoe werkt SPI op Arduino? - Laten we het testen!
Een Microcontroller gebruikt veel verschillende protocollen om met verschillende sensoren en modules te communiceren. Er zijn veel verschillende soorten communicatieprotocollen voor draadloze en bedrade communicatie, en de meest gebruikte communicatietechniek is seriële communicatie. Seriële communicatie is het proces waarbij gegevens bit voor bit achtereenvolgens worden verzonden via een communicatiekanaal of bus. Er zijn veel soorten seriële communicatie, zoals UART-, CAN-, USB-, I2C- en SPI-communicatie.
In deze tutorial leren we over het SPI-protocol en hoe je het in Arduino kunt gebruiken. We zullen het SPI-protocol gebruiken voor communicatie tussen twee Arduino's. Hier zal een Arduino fungeren als Master en een andere als Slave, twee LED's en drukknoppen worden op beide Arduino aangesloten. Om SPI-communicatie te demonstreren, zullen we de master side LED aansturen met de drukknop aan de slave-zijde en vice versa met behulp van het SPI Serial communicatieprotocol.
Wat is SPI?
SPI (Serial Peripheral Interface) is een serieel communicatieprotocol. De SPI-interface is gevonden door Motorola in 1970. SPI heeft een full-duplex verbinding, wat betekent dat de data tegelijkertijd verzonden en ontvangen wordt. Dat wil zeggen dat een master data naar een slave kan sturen en een slave tegelijkertijd data naar de master kan sturen. SPI is synchrone seriële communicatie, wat betekent dat de klok nodig is voor communicatiedoeleinden.
SPI-communicatie is eerder uitgelegd in andere microcontrollers:
- SPI-communicatie met PIC-microcontroller PIC16F877A
- Aansluiting van 3,5 inch TFT LCD-touchscreen met Raspberry Pi
- Programmering AVR-microcontroller met SPI-pinnen
- Koppeling van de Nokia 5110 Grafische LCD met Arduino
Werking van SPI
Een SPI heeft een master / slave-communicatie door vier lijnen te gebruiken. Een SPI kan slechts één master hebben en kan meerdere slaves hebben. Een master is meestal een microcontroller en de slaves kunnen een microcontroller, sensoren, ADC, DAC, LCD etc. zijn.
Hieronder ziet u de weergave in het blokschema van SPI Master met enkele slaaf.
SPI heeft de volgende vier regels MISO, MOSI, SS en CLK
- MISO (Master in Slave Out) - De Slave-lijn voor het verzenden van gegevens naar de master.
- MOSI (Master Out Slave In) - De masterlijn voor het verzenden van gegevens naar de randapparatuur.
- SCK (Serial Clock) - De klokpulsen die de door de master gegenereerde gegevensoverdracht synchroniseren.
- SS (Slave Select) - Master kan deze pin gebruiken om specifieke apparaten in en uit te schakelen.
SPI Master met meerdere slaves
Om de communicatie tussen master en slave te starten, moeten we de Slave Select (SS) -pin van het vereiste apparaat op LOW zetten, zodat het met de master kan communiceren. Als het hoog is, negeert het de meester. Hierdoor kunt u meerdere SPI-apparaten hebben die dezelfde MISO-, MOSI- en CLK-masterlijnen delen. Zoals je kunt zien in de bovenstaande afbeelding zijn er vier slaves waarin de SCLK, MISO, MOSI gemeenschappelijk zijn verbonden met de master en de SS van elke slave afzonderlijk is verbonden met individuele SS-pinnen (SS1, SS2, SS3) van de master. Door de vereiste SS-pin LOW in te stellen kan een master met die slave communiceren.
SPI-pinnen in Arduino UNO
De onderstaande afbeelding toont de aanwezige SPI-pinnen Arduino UNO (in rode doos).
SPI-lijn |
Pin in Arduino |
MOSI |
11 of ICSP-4 |
MISO |
12 of ICSP-1 |
SCK |
13 of ICSP-3 |
SS |
10 |
SPI gebruiken in Arduino
Voordat u begint met programmeren voor SPI-communicatie tussen twee Arduino's. We moeten meer weten over de Arduino SPI-bibliotheek die wordt gebruikt in Arduino IDE.
De bibliotheek
1. SPI.begin ()
GEBRUIK: Om de SPI-bus te initialiseren door SCK, MOSI en SS op uitgangen in te stellen, SCK en MOSI laag en SS hoog te trekken.
2. SPI.setClockDivider (verdeler)
GEBRUIK: Om de SPI-klokverdeler in te stellen ten opzichte van de systeemklok. De beschikbare verdelers zijn 2, 4, 8, 16, 32, 64 of 128.
Verdelers:
- 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)
GEBRUIK: Deze functie wordt aangeroepen wanneer een slave-apparaat gegevens van de master ontvangt.
4. SPI.transfer (val)
GEBRUIK: Deze functie wordt gebruikt voor het gelijktijdig verzenden en ontvangen van gegevens tussen master en slave.
Laten we nu beginnen met een praktische demonstratie van het SPI-protocol in Arduino. In deze tutorial zullen we twee arduino gebruiken, de ene als master en de andere als slave. Beide Arduino zijn afzonderlijk bevestigd met een LED en een drukknop. Master LED kan worden bediend met behulp van de drukknop van de slaaf Arduino en de LED van de slaaf Arduino kan worden bediend met de drukknop van de master Arduino met behulp van het SPI-communicatieprotocol dat aanwezig is in Arduino.
Vereiste componenten voor Arduino SPI-communicatie
- Arduino UNO (2)
- LED (2)
- Drukknop (2)
- Weerstand 10k (2)
- Weerstand 2,2k (2)
- Breadboard
- Verbindingsdraden
Arduino SPI-communicatiecircuitschema
Het onderstaande schakelschema laat zien hoe u SPI op Arduino UNO gebruikt, maar u kunt dezelfde procedure volgen voor Arduino Mega SPI-communicatie of Arduino nano SPI-communicatie. Bijna alles blijft hetzelfde, behalve de pincode. Je moet de pinout van Arduino nano of mega controleren om de Arduino nano SPI-pinnen en Arduino Mega-pinnen te vinden, als je dat eenmaal hebt gedaan, zal al het andere hetzelfde zijn.
Ik heb het hierboven getoonde circuit over een breadboard gebouwd, je kunt hieronder de circuitopstelling zien die ik heb gebruikt voor het testen.
Arduino programmeren voor SPI-communicatie:
Deze tutorial heeft twee programma's, een voor master Arduino en een voor slave Arduino. Aan het einde van dit project worden volledige programma's voor beide kanten gegeven.
Uitleg over Arduino SPI Master Programming
1. Allereerst moeten we de SPI-bibliotheek opnemen voor het gebruik van SPI-communicatiefuncties.
# omvatten
2. In ongeldige opstelling ()
- We starten seriële communicatie op baudrate 115200.
Serial.begin (115200);
- Bevestig LED aan pin 7 en drukknop aan pin 2 en stel die pinnen OUTPUT en INPUT respectievelijk in.
pinMode (ipbutton, INPUT); pinMode (LED, UITGANG);
- Vervolgens beginnen we met de SPI-communicatie
SPI.begin ();
- Vervolgens stellen we de Clockdivider in voor SPI-communicatie. Hier hebben we verdeler 8 ingesteld.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Stel vervolgens de SS-pin HIGH in, omdat we geen overdracht naar de slave-arduino hebben gestart.
digitalWrite (SS, HIGH);
3. In lege lus ():
- We lezen de status van de drukknoppen die is aangesloten op pin2 (Master Arduino) om die waarde naar de slaaf Arduino te sturen.
buttonvalue = digitalRead (ipbutton);
- Stel de logica in voor het instellen van de x-waarde (te verzenden naar de slave) afhankelijk van de invoer van pin 2
if (buttonvalue == HIGH) { x = 1; } anders { x = 0; }
- Voordat we de waarde verzenden, moeten we de slaafselectiewaarde LAGE om de overdracht van de master naar de slave te starten.
digitalWrite (SS, LOW);
- Hier komt de belangrijke stap, in de volgende verklaring sturen we de drukknopwaarde die is opgeslagen in de Mastersend- variabele naar de slave-arduino en ontvangen ook de waarde van de slave die wordt opgeslagen in de Mastereceive- variabele.
Mastereceive = SPI.transfer (Mastersend);
- Daarna zullen we, afhankelijk van de Mastereceive- waarde, de Master Arduino-LED AAN of UIT zetten.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Stelt pin 7 HIGH Serial.println in ("Master LED ON"); } else { digitalWrite (LED, LOW); // Stelt pin 7 LOW Serial.println in ("Master LED UIT"); }
Opmerking: we gebruiken serial.println () om het resultaat te zien in Serial Motor of Arduino IDE. Bekijk de video aan het einde.
Arduino SPI Slave Programming Toelichting
1. Allereerst moeten we de SPI-bibliotheek opnemen voor het gebruik van SPI-communicatiefuncties.
# omvatten
2. In ongeldige opstelling ()
- We starten seriële communicatie op baudrate 115200.
Serial.begin (115200);
- Bevestig LED aan pin 7 en drukknop aan pin2 en stel die pinnen OUTPUT en INPUT respectievelijk in.
pinMode (ipbutton, INPUT); pinMode (LED, UITGANG);
- De belangrijkste stap hier zijn de volgende uitspraken
pinMode (MISO, OUTPUT);
De bovenstaande instructie stelt MISO in als OUTPUT (moet gegevens naar Master IN verzenden). Dus gegevens worden verzonden via MISO van Slave Arduino.
- Schakel nu SPI in Slave-modus in met behulp van SPI Control Register
SPCR - = _BV (SPE);
- Schakel vervolgens de onderbreking in voor SPI-communicatie. Als er gegevens van de master worden ontvangen, wordt de onderbrekingsroutine aangeroepen en wordt de ontvangen waarde uit SPDR (SPI-gegevensregister) gehaald
SPI.attachInterrupt ();
- De waarde van master wordt uit SPDR gehaald en opgeslagen in Slavereceived- variabele. Dit vindt plaats in de volgende Interrupt Routine-functie.
ISR (SPI_STC_vect) { Slavereceived = SPDR; ontvangen = waar; }
3. Vervolgens in void loop () zetten we de Slave arduino LED om AAN of UIT te zetten, afhankelijk van de Slavereceived waarde.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Stelt pin 7 in als HOGE LED AAN Serial.println ("Slave LED AAN"); } else { digitalWrite (LEDpin, LOW); // Stelt pin 7 in als LAGE LED UIT Serial.println ("Slave LED UIT"); }
- Vervolgens lezen we de status van de Slave Arduino-drukknop en slaan de waarde op in Slavesend om de waarde naar Master Arduino te sturen door waarde te geven aan het SPDR-register.
buttonvalue = digitalRead (buttonpin); if (buttonvalue == HIGH) {x = 1; } anders {x = 0; } Slavesend = x; SPDR = Slavesend;
Opmerking: we gebruiken serial.println () om het resultaat te zien in Serial Motor of Arduino IDE. Bekijk de video aan het einde.
Hoe werkt SPI op Arduino? - Laten we het testen!
Hieronder ziet u de afbeelding van de uiteindelijke configuratie voor SPI-communicatie tussen twee Arduino-kaarten.
Wanneer de drukknop aan de Master-zijde wordt ingedrukt, gaat de witte LED aan de Slave-zijde AAN.
En wanneer de drukknop aan de Slave-zijde wordt ingedrukt, gaat de rode LED aan de Master-zijde AAN.
Je kunt de onderstaande video bekijken om de demonstratie van Arduino SPI-communicatie te zien. Als je vragen hebt, laat ze dan achter in het commentaargedeelte of gebruik onze forums.