Tutorial: Arduino en de SPI bus

Dit is het eerste van twee hoofdstukken waarin we gaan beginnen met het onderzoeken van de SPI data bus, en hoe we apparaten kunnen controleren die deze gebruiken met onze Arduino systemen.

de SPI-bus lijkt misschien een complexe interface voor master, maar met een korte studie van deze uitleg en praktische voorbeelden zul je binnenkort een bus-master worden! Om dit te doen zullen we de nodige theorie te leren, en vervolgens toe te passen door het beheersen van een verscheidenheid van apparaten. In deze tutorial worden de dingen zo eenvoudig mogelijk gehouden.

maar eerst, wat is het? En sommige theorie…

SPI is een acroniem voor”Serial Peripheral Interface”. Het is een synchrone seriële databus – gegevens kunnen tegelijkertijd in beide richtingen reizen, in tegenstelling tot (bijvoorbeeld) de I2C-bus die dat niet kan. Om synchrone datatransmissie mogelijk te maken, gebruikt de SPI-bus vier draden. Ze worden genoemd:

  • MOSI-Master-out, Slave-in. Deze lijn draagt gegevens van onze Arduino naar het SPI-gestuurde apparaat (en);
  • MISO – Master-in, Slave out. Deze lijn draagt gegevens van het SPI-gecontroleerde apparaat (en) terug naar Arduino;
  • SS-Slave-select. Deze lijn vertelt het apparaat op de bus dat we ermee willen communiceren. Elk SPI-apparaat heeft een unieke SS-lijn nodig terug naar de Arduino;
  • SCK-seriële klok.

in deze tutorials beschouwen we het Arduino bord als de master en de SPI apparaten als slaves. Op onze Arduino Uno en compatibele borden zijn de gebruikte pinnen:

  • SS-digital 10. U kunt Andere digitale pins gebruiken, maar 10 is over het algemeen de standaard omdat het naast de andere SPI pins staat;
  • MOSI-digital 11;
  • MISO-digital 12;
  • SCK-digital 13;

Arduino Mega gebruikers-MISO is 50, MOSI is 51, SCK is 52 en SS is meestal 53. Als u een Arduino Leonardo gebruikt, zijn de SPI pinnen op de ICSP header pinnen. Zie hier voor meer informatie. U kunt één of meerdere apparaten bedienen met de SPI bus. Bijvoorbeeld:

sspiss1

gegevens reizen heen en weer langs de MOSI en MISO lijnen tussen onze Arduino en het SPI apparaat. Dit kan alleen gebeuren als de SS lijn op laag staat. Met andere woorden, om te communiceren met een bepaald SPI-apparaat in de bus, zetten we de SS-lijn naar dat apparaat op laag, dan communiceren met het, dan zetten we de lijn terug naar hoog. Als we twee of meer SPI-apparaten in de bus hebben, zou de bedrading op het volgende lijken:

sspiss2

merk op dat er twee SS – lijnen zijn-we hebben er één nodig voor elk SPI-apparaat in de bus. U kunt om het even welke vrije digitale outputspeld op uw Arduino als SS lijn gebruiken. Vergeet niet om alle SS-lijnen hoog te hebben, behalve de lijn die is aangesloten op het SPI-apparaat dat u op dat moment wilt gebruiken.

Data wordt in byte naar het SPI-apparaat gestuurd. Je zou inmiddels moeten weten dat acht bits één byte vormen, dus een binair getal met een waarde tussen nul en 255.

wanneer we communiceren met onze SPI apparaten, moeten we eerst weten op welke manier het apparaat omgaat met de data – MSB of LSB. MSB (meest significante bit) is de linkerkant van het binaire getal, en LSB (minst significante bit) is de rechterkant van het getal. Dat is:

binnum

behalve het verzenden van numerieke waarden langs de SPI-bus, kunnen binaire getallen ook commando ‘ s vertegenwoordigen. U kunt Acht aan/uit-instellingen weergeven met één byte aan gegevens, zodat de parameters van een apparaat kunnen worden ingesteld door een byte aan gegevens te verzenden. Deze parameters variëren per apparaat en moeten worden geïllustreerd in het gegevensblad van het betreffende apparaat. Bijvoorbeeld, een digitale potentiometer IC met zes potten:

sdata1

Dit apparaat heeft twee bytes aan data nodig. De addr byte vertelt het apparaat welke van zes potentiometers te controleren( genummerd 0 tot 5), en de data byte is de waarde voor de potentiometer (0~255). We kunnen gehele getallen gebruiken om deze twee waarden weer te geven. Om bijvoorbeeld potentiometer nummer twee in te stellen op 125, zouden we 2 dan 125 naar het apparaat sturen.

hoe sturen we gegevens naar SPI-apparaten in onze schetsen?

Allereerst moeten we de SPI bibliotheek gebruiken. Het is inbegrepen bij de standaard Arduino IDE installatie, dus zet het volgende aan het begin van je schets:

#include "SPI.h"

volgende, in void.setup() declareer welke pin (s) gebruikt zullen worden voor SS en stel ze in als uitvoer. Bijvoorbeeld,

pinMode(ss, OUTPUT);

waar ss eerder is gedeclareerd als een geheel getal van waarde tien. Nu, om de SPI-bus te activeren:

SPI.begin();

en tot slot moeten we de sketch vertellen op welke manier gegevens moeten worden verzonden, MSB of LSB eerst met

SPI.setBitOrder(MSBFIRST);

of

SPI.setBitOrder(LSBFIRST);

wanneer het tijd is om gegevens te verzenden via de SPI-bus voor ons apparaat moeten er drie dingen gebeuren. Stel eerst de digitale pin met SS in op laag:

digitalWrite(SS, LOW);

stuur dan de gegevens in bytes, één byte per keer met behulp van:

SPI.transfer(value);

waarde kan een geheel getal/byte tussen nul en 255 zijn. Tot slot, wanneer u klaar bent met het verzenden van gegevens naar uw apparaat, beëindigt u de overdracht door SS high in te stellen:

digitalWrite(ss, HIGH);

het verzenden van gegevens is vrij eenvoudig. Over het algemeen is het moeilijkste deel voor mensen het interpreteren van het apparaat datasheet om te begrijpen hoe opdrachten en gegevens moeten worden gestructureerd voor transmissie. Maar met wat oefening kunnen deze kleine hindernissen worden overwonnen.

nu enkele praktische voorbeelden!

tijd om op de SPI bus te stappen en sommige apparaten te bedienen. Door onderstaande voorbeelden te volgen, krijgt u een praktisch inzicht in hoe de SPI bus en apparaten gebruikt kunnen worden met onze Arduino boards.

MCP4162 voorbeeld

ons eerste voorbeeld zal een eenvoudig maar interessant Deel gebruiken – een digitale potentiometer (we hebben er ook een gebruikt in de I2C tutorial). Deze keer hebben we een microchip MCP4162-serie 10k reostat:

digipotss

Hier is het gegevensblad voor uw inzage. Om het te controleren moeten wij twee bytes van gegevens verzenden – de eerste byte is de controlebyte, en gelukkig voor dit voorbeeld is het altijd nul (aangezien het adres voor de wisserwaarde 00h is ). De tweede byte is de waarde om de wisser in te stellen, die de weerstand regelt. Dus om de wisser in te stellen moeten we drie dingen doen in onze schets…

Stel eerst de SS-lijn (slave select) in op laag:

digitalWrite(10, LOW);

stuur dan de twee byes van gegevens:

SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

stel uiteindelijk de SS-lijn terug op hoog:

digitalWrite(10, HIGH);

gemakkelijk gedaan. De verbinding met ons Arduino-bord is zeer eenvoudig-overweeg de MCP4162 pinout:

mcp4162pinout

VDD verbindt met 5V, VSS met GND, CS met digital 10, SCK met digital 13, SDI met digital 11 en SDO met digital 12. Laten we nu de beschikbare waarden van de MCP4162 in de volgende schets doornemen:

/* SPI bus demo using a Microchip MCP4162 digital potentiometer */#include "SPI.h" // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=200; // used for various delaysvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our MCP4162 requires data to be sent MSB (most significant byte) first}void setValue(int value){ digitalWrite(ss, LOW); SPI.transfer(0); // send command byte SPI.transfer(value); // send value (0~255) digitalWrite(ss, HIGH);}void loop(){ for (int a=0; a<256; a++) { setValue(a); delay(del); } for (int a=255; a>=0; --a) { setValue(a); delay(del); }}

om de resultaten van de schets te zien. In de volgende videoclip lopen we door het weerstandsbereik en meten we de reostatwaarde met een multimeter:als Digitale potentiometers nieuw voor u zijn, lees dan eerst deze korte handleiding van Microchip over de verschillen tussen mechanische en Digitale potentiometers.

een ander voorbeeld:

In dit voorbeeld gebruiken we de analoge apparaten AD5204 vierkanaals digitale potentiometer (Data sheet.pdf). Het bevat vier 10k ohm lineaire potentiometers, en elke potentiometer is instelbaar op een van 256 posities.

de instellingen zijn vluchtig, wat betekent dat ze niet worden onthouden wanneer de stroom is uitgeschakeld. Daarom zijn de potentiometers bij het toepassen van vermogen allemaal vooraf ingesteld op het midden van de schaal. Ons voorbeeld is het SOIC-24 opbouwvoorbeeld, maar het wordt ook in DIP-formaat vervaardigd.

ad5204ss

om het leven gemakkelijker te maken kan het worden gesoldeerd op een SOIC breakout board dat het converteert naar een door-hole pakket:

ad5204boardss1

In dit voorbeeld zullen we de helderheid van vier LEDs controleren. Bedrading is heel eenvoudig. Pinouts staan in het datablad.

ex34p2schematic1

en de schets:

#include <SPI.h> // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=5; // used for fading delayvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our AD5204 requires data to be sent MSB (most significant byte) first. See data sheet page 5 allOff(); // we do this as pot memories are volatile}void allOff()// sets all potentiometers to minimum value{ for (int z=0; z<4; z++) { setPot(z,0); }}void allOn()// sets all potentiometers to maximum value{ for (int z=0; z<4; z++) { setPot(z,255); }}void setPot(int pot, int level)// sets potentiometer 'pot' to level 'level'{ digitalWrite(ss, LOW); SPI.transfer(pot); SPI.transfer(level); digitalWrite(ss, HIGH);}void blinkAll(int count){ for (int z=0; zvoid indFade(){ for (int a=0; a<4; a++) { for (int l=0; l<255; l++) { setPot(a,l); delay(del); } for (int l=255; l>=0; --l) { setPot(a,l); delay(del); } }}void allFade(int count){ for (int a=0; a<count; a++)="" {="" for="" (int="" l="0;" l<255;="" l++)="" setpot(0,l);="" setpot(1,l);="" setpot(2,l);="" setpot(3,l);="" delay(del);="" }="">=0; --l) { setPot(0,l); setPot(1,l); setPot(2,l); setPot(3,l); delay(del); } }}void loop(){ blinkAll(3); delay(1000); indFade(); allFade(3);}

de functie allOff() en allOn() worden gebruikt om de potentiometers respectievelijk op minimum en maximum in te stellen. We gebruiken allOff () aan het begin van de schets om de LEDs uit te zetten. Dit is noodzakelijk omdat bij het inschakelen de ruitenwissers over het algemeen halverwege zijn ingesteld.

verder gebruiken we ze in de functie blinkAll () om de LEDs te knipperen. De functie setPot() keurt een wisseraantal (0~3) en waarde goed om die wisser (0~255) in te stellen. Tot slot doet de functie indFade () het goed om elke LED aan en uit te laten vervagen – waardoor een effect ontstaat dat erg lijkt op pulsbreedtemodulatie.

tenslotte is het hier in actie:

dus daar heb je het – hopelijk een makkelijk te begrijpen introductie tot de wereld van de SPI bus en hoe de apparaten erin te bedienen. Zoals altijd is het nu aan jou en je verbeelding om iets te vinden om te controleren of om andere shenanigans op te pakken. In het volgende SPI artikel zullen we kijken naar het lezen en schrijven van data via de SPI bus.

Dit bericht aangeboden door pmdway.com-alles voor makers en elektronica liefhebbers, met gratis levering wereldwijd.

om op de hoogte te blijven van nieuwe berichten op tronixstuff.com, abonneer u op de mailinglijst in het vak aan de rechterkant, of volg ons op twitter @tronixstuff.

deel met anderen:

Print

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *