Tutorial: Arduino og SPI-bussen

dette er det første af to kapitler, hvor vi skal begynde at undersøge SPI-databussen, og hvordan vi kan kontrollere enheder, der bruger den med vores Arduino-systemer.

SPI-bussen kan synes at være en kompleks grænseflade at mestre, men med en kort undersøgelse af denne forklaring og praktiske eksempler bliver du snart en busmester! For at gøre dette vil vi lære den nødvendige teori, og derefter anvende den ved at styre en række enheder. I denne tutorial tingene vil blive holdt så enkel som muligt.

men først og fremmest, hvad er det? Og nogle teori…

SPI er et akronym for”Serial Peripheral Interface”. Det er en synkron seriel databus – data kan køre i begge retninger på samme tid i modsætning til (for eksempel) I2C-bussen, der ikke kan gøre det. For at tillade synkron dataoverførsel bruger SPI-bussen fire ledninger. De kaldes:

  • MOSI – Master-out, Slave-in. Denne linje bærer data fra vores Arduino til den SPI-styrede enhed(er);
  • MISO – Master-in, Slave out. Denne linje bærer data fra den SPI-styrede enhed(er) tilbage til Arduino;
  • SS-Slave-vælg. Denne linje fortæller enheden på bussen, at vi ønsker at kommunikere med den. Hver SPI-enhed har brug for en unik SS – linje tilbage til Arduino;
  • SCK-serielt ur.

inden for disse tutorials betragter vi Arduino-tavlen som mesteren og SPI-enhederne som slaver. På vores Arduino Uno og kompatible tavler er de anvendte stifter:

  • SS – digital 10. Du kan bruge andre digitale pins, men 10 er generelt standard, da den er ved siden af de andre SPI-pins;
  • MOSI – digital 11;
  • MISO – digital 12;
  • SCK – digital 13;

Arduino Mega users – MISO er 50, MOSI er 51, SCK er 52 og SS er normalt 53. Hvis du bruger en Arduino Leonardo, er SPI-stifterne på ICSP-overskriftstifterne. Se her for mere information. Du kan styre en eller flere enheder med SPI-bussen. For eksempel for en enhed ville ledningerne være:

sspiss1

Data bevæger sig frem og tilbage langs Mosi-og MISO-linjerne mellem vores Arduino og SPI-enheden. Dette kan kun ske, når SS-linjen er indstillet til lav. Med andre ord, for at kommunikere med en bestemt SPI-enhed på bussen, indstiller vi SS-linjen til den enhed til lav, kommunikerer derefter med den og indstiller derefter linjen tilbage til høj. Hvis vi har to eller flere SPI – enheder på bussen, vil ledningerne ligne følgende:

sspiss2

bemærk, hvordan der er to SS-linjer-vi har brug for en til hver SPI-enhed på bussen. Du kan bruge enhver gratis digital output pin på din Arduino som en SS linje. Husk bare at have alle SS-linjer høje bortset fra linjen tilsluttet den SPI-enhed, du ønsker at bruge på det tidspunkt.

Data sendes til SPI-enheden i byte-form. Du bør vide nu, at otte bits gør en byte, derfor repræsenterer et binært tal med en værdi på mellem nul og 255.

Når vi kommunikerer med vores SPI – enheder, skal vi først vide, hvilken vej enheden behandler dataene-MSB eller LSB. MSB (mest signifikante bit) er venstre side af det binære tal, og LSB (mindst signifikante bit) er højre side af nummeret. Det er:

binnum

bortset fra at sende numeriske værdier langs SPI-bussen, kan binære tal også repræsentere kommandoer. Du kan repræsentere otte on / off-indstillinger ved hjælp af en byte af data, så en enheds parametre kan indstilles ved at sende en byte af data. Disse parametre varierer med hver enhed og skal illustreres i den pågældende enheds datablad. For eksempel et digitalt potentiometer IC med seks Potter:

sdata1

denne enhed kræver to bytes data. ADDR byte fortæller enheden, hvilken af seks potentiometre der skal styres (nummereret 0 til 5), og DATA byte er værdien for potentiometeret (0~255). Vi kan bruge heltal til at repræsentere disse to værdier. For eksempel for at indstille potentiometer nummer to til 125, ville vi sende 2 derefter 125 til enheden.

hvordan sender vi data til SPI-enheder i vores skitser?

først og fremmest skal vi bruge SPI-biblioteket. Det er inkluderet i standard Arduino IDE-installationen, så sæt følgende i starten af din skitse:

#include "SPI.h"

næste, i void.opsætning () angiv, hvilke pin (er) der skal bruges til SS, og indstil dem som OUTPUT. For eksempel

pinMode(ss, OUTPUT);

hvor ss tidligere er blevet erklæret som et heltal af værdi ti. For at aktivere SPI-bussen:

SPI.begin();

og endelig skal vi fortælle skitsen, hvilken vej der skal sendes data, MSB eller LSB først ved at bruge

SPI.setBitOrder(MSBFIRST);

eller

SPI.setBitOrder(LSBFIRST);

Når det er tid til at sende data ned spi-bussen til vores enhed, tre ting skal ske. Indstil først den digitale pin med SS til lav:

digitalWrite(SS, LOW);

send derefter dataene i bytes, en byte ad gangen ved hjælp af:

SPI.transfer(value);

værdi kan være et heltal/byte mellem nul og 255. Endelig, når du er færdig med at sende data til din enhed, skal du afslutte transmissionen ved at indstille SS high:

digitalWrite(ss, HIGH);

afsendelse af data er ret simpelt. Generelt er den sværeste del for folk at fortolke enhedsdatabladet for at forstå, hvordan kommandoer og data skal struktureres til transmission. Men med en vis praksis kan disse små forhindringer overvindes.

nu for nogle praktiske eksempler!

tid til at komme på SPI-bussen og styre nogle enheder. Ved at følge eksemplerne nedenfor skal du få en praktisk forståelse af, hvordan SPI-bussen og enhederne kan bruges sammen med vores Arduino-tavler.

MCP4162 eksempel

vores første eksempel vil bruge en simpel, men interessant del – et digitalt potentiometer (vi brugte også en i I2C tutorial). Denne gang har vi en mikrochip MCP4162-serie 10K rheostat:

digipotss

Her er databladet til din gennemgang. For at kontrollere det skal vi sende to bytes data – den første byte er kontrolbyte, og heldigvis for dette eksempel er det altid nul (da adressen til viskerværdien er 00h ). Den anden byte er værdien for at indstille viskeren, som styrer modstanden. Så for at indstille viskeren skal vi gøre tre ting i vores skitse…

Indstil først SS (slave select) – linjen til lav:

digitalWrite(10, LOW);

send derefter de to byes af data:

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

Indstil endelig SS-linjen tilbage til høj:

digitalWrite(10, HIGH);

nemt udført. Forbindelse til vores Arduino board er meget enkel – overvej MCP4162 pinout:

mcp4162pinout

Vdd forbinder til 5V, Vss til GND, CS til digital 10, SCK til digital 13, SDI til digital 11 og SDO til digital 12. Lad os nu gennemgå de tilgængelige værdier for MCP4162 i følgende skitse:

/* 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); }}

nu for at se resultaterne af skitsen. I det følgende videoklip løber vi op gennem modstandsområdet og måler reostatværdien med et multimeter:

før du går videre, hvis digitale potentiometre er nye for dig, kan du overveje at læse denne korte guide skrevet af Microchip om forskellene mellem mekaniske og digitale potentiometre.

et andet eksempel:

i dette eksempel bruger vi de analoge enheder AD5204 firekanals digitalt potentiometer (datablad.pdf). Den indeholder fire 10K ohm lineære potentiometre, og hvert potentiometer kan justeres til en af 256 positioner.

indstillingerne er flygtige, hvilket betyder, at de ikke huskes, når strømmen er slukket. Derfor, når der anvendes strøm, er potentiometrene alle forudindstillet til midten af skalaen. Vores eksempel er SOIC-24 surface mount eksempel, men det er også fremstillet i DIP format samt.

ad5204ss

for at gøre livet lettere kan det loddes på et SOIC breakout-kort, der konverterer det til en gennemgående hulpakke:

ad5204boardss1

i dette eksempel styrer vi lysstyrken på fire led ‘ er. Ledninger er meget enkle. Pinouts er i databladet.

eks34p2schematic1

og skitsen:

#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);}

funktionen allOff() og allOn() bruges til at indstille potentiometrene til henholdsvis minimum og maksimum. Vi bruger allOff () i starten af skitsen for at slukke for LED ‘ erne. Dette er nødvendigt, da viskerne ved opstart generelt er indstillet halvvejs.

desuden bruger vi dem i blinkAll () – funktionen til … at blinke LED ‘ erne. Funktionen setPot () accepterer et viskernummer (0~3) og værdi for at indstille den visker (0~255). Endelig gør funktionen indFade () et godt stykke arbejde med at falme hver LED til og fra for at forårsage en effekt, der ligner pulsbreddemodulation.

endelig er det her i aktion:

så der har du det – forhåbentlig en letforståelig introduktion til SPI-busens verden og hvordan man styrer enhederne indeni. Som altid er det nu op til dig og din fantasi at finde noget at kontrollere eller komme op til andre shenanigans. I den næste SPI-artikel vil vi se på læsning og skrivning af data via SPI-bussen.

dette indlæg bragt til dig af PMD.com-alt for producenter og elektronikentusiaster, med gratis levering over hele verden.

for at holde dig opdateret med nye indlæg på tronixstuff.com, abonner venligst på postlisten i boksen til højre, eller følg os på kvidre.

del venligst med andre:

Udskriv

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *