handledning: Arduino och SPI-bussen

detta är det första av två kapitel där vi ska börja undersöka SPI-databussen och hur vi kan styra enheter som använder den med våra Arduino-system.

SPI-bussen kan tyckas vara ett komplext gränssnitt att behärska, men med en kort studie av denna förklaring och praktiska exempel kommer du snart att bli bussmästare! För att göra detta kommer vi att lära oss den nödvändiga teorin och sedan tillämpa den genom att styra en mängd olika enheter. I denna handledning kommer saker att hållas så enkla som möjligt.

men först och främst, vad är det? Och lite teori…

SPI är en akronym för”Serial Peripheral Interface”. Det är en synkron seriell databuss – data kan färdas i båda riktningarna samtidigt, i motsats till (till exempel) I2C-bussen som inte kan göra det. För att möjliggöra synkron dataöverföring använder SPI-bussen fyra ledningar. De kallas:

  • MOSI – Master-out, Slave-in. Denna linje bär data från vår Arduino till SPI-styrda enhet (er);
  • MISO – Master-in, Slave out. Denna linje bär data från SPI-styrd enhet(er) tillbaka till Arduino;
  • SS – Slav-välj. Denna linje berättar enheten på bussen vi vill kommunicera med den. Varje SPI-enhet behöver en unik SS-linje tillbaka till Arduino;
  • SCK – seriell klocka.

inom dessa handledning anser vi att Arduino-styrelsen är befälhavaren och SPI-enheterna som slavar. På våra Arduino Uno och kompatibla brädor är stiften som används:

  • SS – digital 10. Du kan använda Andra digitala stift, men 10 är i allmänhet standard eftersom det är bredvid de andra SPI-stiften;
  • MOSI-digital 11;
  • MISO-digital 12;
  • SCK-digital 13;

Arduino Mega användare – MISO är 50, MOSI är 51, SCK är 52 och SS är vanligtvis 53. Om du använder en Arduino Leonardo finns SPI-stiften på ICSP-header-stiften. Se här för mer information. Du kan styra en eller flera enheter med SPI-bussen. Till exempel för en enhet skulle ledningarna vara:

sspiss1

Data färdas fram och tillbaka längs mosi-och MISO-linjerna mellan vår Arduino och SPI-enheten. Detta kan bara hända när SS-linjen är inställd på låg. Med andra ord, för att kommunicera med en viss SPI-enhet på bussen ställer vi SS-linjen till den enheten till låg, kommunicerar sedan med den och ställer sedan tillbaka linjen till hög. Om vi har två eller flera SPI-enheter på bussen, skulle ledningarna likna följande:

sspiss2

Lägg märke till hur det finns två SS – linjer-vi behöver en för varje SPI-enhet på bussen. Du kan använda valfri gratis digital utgångsstift på din Arduino som en SS-linje. Kom bara ihåg att ha alla SS-linjer höga förutom linjen ansluten till SPI-enheten du vill använda vid den tiden.

Data skickas till SPI-enheten i byte-form. Du borde veta vid det här laget att åtta bitar gör en byte, vilket representerar ett binärt tal med ett värde mellan noll och 255.

När vi kommunicerar med våra SPI – enheter måste vi veta vilket sätt enheten hanterar data-MSB eller LSB först. MSB (mest betydande bit) är den vänstra sidan av det binära numret, och LSB (minst signifikant bit) är den högra sidan av numret. Det är:

binnum

förutom att skicka numeriska värden längs SPI-bussen kan binära tal också representera kommandon. Du kan representera åtta på / av-inställningar med en byte av data, så en enhets parametrar kan ställas in genom att skicka en byte av data. Dessa parametrar varierar med varje enhet och bör illustreras i den specifika enhetens datablad. Till exempel en digital potentiometer IC med sex krukor:

sdata1

denna enhet kräver två byte data. ADDR-byten berättar för enheten vilken av sex potentiometrar som ska kontrolleras (numrerad 0 till 5), och DATABYTET är värdet för potentiometern (0~255). Vi kan använda heltal för att representera dessa två värden. Till exempel, för att ställa in potentiometer nummer två till 125, skulle vi skicka 2 sedan 125 till enheten.

Hur skickar vi data till SPI-enheter i våra skisser?

först och främst måste vi använda SPI-biblioteket. Den ingår i standardinstallationen Arduino IDE, så sätt följande i början av din skiss:

#include "SPI.h"

nästa, I void.setup () förklara vilka stift som ska användas för SS och ställ in dem som utgång. Till exempel

pinMode(ss, OUTPUT);

där ss tidigare har deklarerats som ett heltal av värde tio. Nu, för att aktivera SPI-bussen:

SPI.begin();

och slutligen måste vi berätta skissen vilket sätt att skicka data, MSB eller LSB först genom att använda

SPI.setBitOrder(MSBFIRST);

eller

SPI.setBitOrder(LSBFIRST);

När det är dags att skicka data ner SPI-bussen till vår enhet, tre saker måste hända. Ställ först in den digitala stiftet med SS till låg:

digitalWrite(SS, LOW);

skicka sedan data i byte, en byte i taget med:

SPI.transfer(value);

värde kan vara ett heltal/byte mellan noll och 255. Slutligen, när du är klar med att skicka data till din enhet, avsluta överföringen genom att ställa in SS hög:

digitalWrite(ss, HIGH);

att skicka data är ganska enkelt. Generellt är den svåraste delen för människor att tolka enhetsdatabladet för att förstå hur kommandon och data behöver struktureras för överföring. Men med lite övning kan dessa små hinder övervinnas.

nu för några praktiska exempel!

dags att komma på SPI-bussen och styra vissa enheter. Genom att följa exemplen nedan bör du få en praktisk förståelse för hur SPI-bussen och enheterna kan användas med våra Arduino-brädor.

MCP4162 exempel

vårt första exempel kommer att använda en enkel men intressant del – en digital potentiometer (vi använde också en i I2C-handledningen). Den här gången har vi en mikrochip MCP4162-serie 10K reostat:

digipotss

här är databladet för din granskning. För att kontrollera det måste vi skicka två byte data – den första byten är kontrollbyten, och tack och lov för det här exemplet är det alltid noll (eftersom adressen för torkarvärdet är 00h ). Den andra byten är värdet för att ställa in torkaren, som styr motståndet. Så för att ställa in torkaren måste vi göra tre saker i vår skiss…

Ställ först in SS (slave select) – linjen till låg:

digitalWrite(10, LOW);

skicka sedan de två byerna av data:

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

slutligen ställa SS-linjen tillbaka till hög:

digitalWrite(10, HIGH);

enkelt gjort. Anslutning till vår Arduino styrelse är mycket enkel – överväga MCP4162 pinout:

mcp4162pinout

Vdd ansluter till 5V, Vss till GND, CS till digital 10, SCK till digital 13, SDI till digital 11 och SDO till digital 12. Låt oss nu gå igenom de tillgängliga värdena för MCP4162 i följande skiss:

/* 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 för att se resultaten av skissen. I följande videoklipp, a vi kör upp genom motståndsområdet och mäter reostatvärdet med en multimeter:

innan du går framåt, om digitala potentiometrar är nya för dig, överväga att läsa den här korta guiden skriven av mikrochip om skillnaderna mellan mekaniska och digitala potentiometrar.

ett annat exempel:

i det här exemplet använder vi de analoga enheterna AD5204 fyrkanals digital potentiometer (datablad.pdf). Den innehåller fyra 10K ohm linjära potentiometrar, och varje potentiometer är justerbar till en av 256 positioner.

inställningarna är flyktiga, vilket innebär att de inte kommer ihåg när strömmen är avstängd. Därför när strömmen appliceras är potentiometrarna alla förinställda till mitten av skalan. Vårt exempel är SOIC-24 ytmonteringsexempel, men det tillverkas också i DIP-format också.

ad5204ss

för att göra livet enklare kan det lödas på ett SOIC breakout-kort som konverterar det till ett genomgående hålpaket:

ad5204boardss1

i det här exemplet kontrollerar vi ljusstyrkan på fyra lysdioder. Kabeldragning är väldigt enkelt. Pinouts finns i databladet.

ex34p2schematic1

och skissen:

#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() och allOn() används för att ställa in potentiometrarna till minimum respektive maximum. Vi använder allOff () i början av skissen för att stänga av lysdioderna. Detta är nödvändigt eftersom torkarna i allmänhet är inställda halvvägs vid uppstart.

dessutom använder vi dem i blinkAll () – funktionen för att … blinka lysdioderna. Funktionen setPot () accepterar ett torkarnummer (0~3) och värde för att ställa in torkaren (0~255). Slutligen funktionen indFade () gör ett bra jobb med att blekna varje LED på och av i ordning – vilket orsakar en effekt som mycket liknar pulsbreddsmodulering.

slutligen, här är det i aktion:

så där har du det – förhoppningsvis en lättförståelig introduktion till SPI-bussens värld och hur man styr enheterna inom. Som alltid är det nu upp till dig och din fantasi att hitta något att kontrollera eller komma upp till andra shenanigans. I nästa SPI-artikel kommer vi att titta på läsning och skrivning av data via SPI-bussen.

det här inlägget kom till dig av pmdway.com-allt för tillverkare och elektronikentusiaster, med gratis leverans över hela världen.

för att hålla dig uppdaterad med nya inlägg på tronixstuff.com, prenumerera på e-postlistan i rutan till höger, eller följ oss på twitter @tronixstuff.

Vänligen dela med andra:

Skriv ut

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *