Tutorial: Arduino og spi bus

Dette er den første av to kapitler der vi skal begynne å undersøke SPI databussen, og hvordan vi kan styre enheter som bruker Den med Våre arduino-systemer.

spi bussen kan synes å være et komplekst grensesnitt for å mestre, men med noen korte studier av denne forklaringen og praktiske eksempler vil du snart bli en buss master! For å gjøre dette vil vi lære den nødvendige teorien, og deretter bruke den ved å kontrollere en rekke enheter. I denne opplæringen ting vil bli holdt så enkelt som mulig.

men først av alt, hva er det? OG noen teori…

SPI ER et akronym for «Serial Peripheral Interface». Det er en synkron seriell databuss – data kan reise i begge retninger samtidig, i motsetning til (for eksempel) I2C-bussen som ikke kan gjøre det. FOR å tillate synkron dataoverføring bruker SPI-bussen fire ledninger. DE kalles:

  • MOSI-Master-out, Slave-in. Denne linjen bærer data fra Vår Arduino TIL DEN SPI-kontrollerte enheten (e);
  • MISO – Master-in, Slave out. Denne linjen bærer data fra DEN SPI-kontrollerte enheten(e) tilbake Til Arduino;
  • SS – Slave-velg. Denne linjen forteller enheten på bussen vi ønsker å kommunisere med den. Hver SPI-enhet trenger en unik SS-linje tilbake Til Arduino;
  • SCK-Seriell klokke.

Innenfor disse veiledningene anser Vi arduino-styret å være mesteren og SPI-enhetene som slaver. På Våre Arduino Uno og kompatible brett er pinnene som brukes:

  • SS – digital 10. Du kan bruke andre digitale pins, men 10 er vanligvis standard som den er ved siden AV DE ANDRE spi-pinnene;
  • MOSI – digital 11;
  • MISO – digital 12;
  • SCK – digital 13;ARDUINO Mega – brukere-MISO er 50, MOSI er 51, SCK er 52 OG SS er vanligvis 53. Hvis Du bruker En Arduino Leonardo, ER SPI-pinnene på ICSP-topptappene. Se her for mer informasjon. Du kan styre en eller flere enheter MED spi-bussen. For eksempel, for en enhet vil ledningene være:

    sspiss1

    Data reiser frem og tilbake langs MOSI-og MISO-linjene mellom Vår Arduino og SPI-enheten. DETTE kan bare skje når SS-linjen er satt TIL LAV. Med andre ord, for å kommunisere med EN BESTEMT SPI-enhet på bussen, setter VI SS-linjen TIL den enheten TIL LAV, kommuniserer med den, og setter deretter linjen TILBAKE TIL HØY. Hvis vi har to eller flere SPI-enheter på bussen, vil ledningene ligne på følgende:

    sspiss2

    Legg merke til hvordan det er to SS – linjer-vi trenger en FOR HVER SPI-enhet på bussen. Du kan bruke noen gratis digital utgang pin På Arduino som EN SS linje. Bare husk å ha ALLE SS linjer høy bortsett fra linjen koblet TIL SPI enheten du ønsker å bruke på den tiden.

    Data sendes TIL SPI-enheten i byte-skjema. Du bør vite nå at åtte biter gjør en byte, og representerer derfor et binært tall med en verdi på mellom null og 255.

    når vi kommuniserer MED VÅRE SPI-enheter, må vi vite hvilken måte enheten håndterer dataene – MSB eller LSB først. MSB (most significant bit) er venstre side av det binære tallet, OG lsb (least significant bit) er høyre side av nummeret. Det er:

    binnum

    bortsett fra å sende numeriske verdier langs spi-bussen, kan binære tall også representere kommandoer. Du kan representere åtte på / av-innstillinger ved hjelp av en byte med data, slik at enhetens parametere kan settes ved å sende en byte med data. Disse parametrene vil variere med hver enhet og bør illustreres i den aktuelle enhetens datablad. For eksempel, et digitalt potensiometer IC med seks potter:

    sdata1

    denne enheten krever to byte med data. ADDR-byten forteller enheten hvilken av seks potensiometre som skal styres (nummerert 0 til 5), OG databyten er verdien for potensiometeret (0~255). Vi kan bruke heltall til å representere disse to verdiene. For eksempel, for å sette potensiometer nummer to til 125, ville vi sende 2 deretter 125 til enheten.

    hvordan sender vi data til SPI-enheter i skissene våre?

    Først av alt må VI bruke spi-biblioteket. Den følger med Standard Arduino IDE-installasjonen, så legg følgende i starten av skissen:

    #include "SPI.h"

    Neste, i tomrom.setup () erklære hvilke pin (s) vil bli brukt FOR SS og sette dem som UTGANG. For eksempel

    pinMode(ss, OUTPUT);

    der ss tidligere har blitt erklært som et heltall av verdien ti. Nå, for å aktivere spi-bussen:

    SPI.begin();

    og til slutt må vi fortelle skissen hvilken vei å sende data, msb eller lsb først ved å bruke

    SPI.setBitOrder(MSBFIRST);

    eller

    SPI.setBitOrder(LSBFIRST);

    når det er på tide å sende data ned spi bussen til enheten vår, tre ting må skje. Først sett den digitale pinnen med SS til lav:

    digitalWrite(SS, LOW);

    send deretter dataene I byte, en byte om gangen ved hjelp av:

    SPI.transfer(value);

    Verdien kan være et heltall/byte mellom null og 255. Til slutt, når du er ferdig med å sende data til enheten, avslutter du overføringen ved å sette SS høy:

    digitalWrite(ss, HIGH);

    Sending av data er ganske enkelt. Vanligvis er den vanskeligste delen for folk å tolke enhetens datablad for å forstå hvordan kommandoer og data må struktureres for overføring. Men med litt øvelse kan disse små hindrene overvinnes.

    nå for noen praktiske eksempler!

    Tid for Å komme PÅ SPI bussen og kontrollere noen enheter. Ved å følge eksemplene nedenfor, bør du få en praktisk forståelse av hvordan SPI-bussen og enhetene kan brukes med Våre Arduino-brett.MCP4162 Eksempel

    Vårt første eksempel vil bruke en enkel, men interessant del-et digitalt potensiometer (vi brukte også en i i2c-opplæringen). Denne gangen har Vi En Microchip MCP4162-serie 10K rheostat:

    digipotss

    her er databladet for gjennomlesingen. For å kontrollere det må vi sende to byte data – den første byten er kontrollbyten – og heldigvis for dette eksemplet er det alltid null (da adressen til viskerverdien er 00h ). Den andre byten er verdien for å sette viskeren, som styrer motstanden. Så for å sette viskeren må vi gjøre tre ting i skissen vår…

    først sett SS-linjen (slave select) til lav:

    digitalWrite(10, LOW);

    send deretter de to byes av data:

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

    endelig sett SS-linjen tilbake til høy:

    digitalWrite(10, HIGH);

    enkelt gjort. Tilkobling til Vårt arduino – kort er veldig enkelt-vurder MCP4162 pinout:

    mcp4162pinout

    Vdd kobles TIL 5V, Vss TIL GND, CS til digital 10, SCK til digital 13, SDI til digital 11 og SDO til digital 12. La oss nå gå GJENNOM DE tilgjengelige verdiene TIL MCP4162 i følgende skisse:

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

    nå for å se resultatene av skissen. I det følgende videoklippet løper vi opp gjennom motstandsområdet og måler reostatverdien med et multimeter:Før du går videre, hvis digitale potensiometre er nye for deg, bør du vurdere å lese Denne korte veiledningen skrevet Av Microchip om forskjellene mellom mekaniske og digitale potensiometre.

    Et annet eksempel:

    I dette eksemplet bruker Vi Analoge Enheter AD5204 firekanals digitalt potensiometer (datablad.pdf). Den inneholder fire 10k ohm lineære potensiometre, og hvert potensiometer er justerbart til en av 256 stillinger.

    innstillingene er flyktige, noe som betyr at de ikke blir husket når strømmen er slått av. Derfor når makt er brukt potensiometre er alle pre satt til midten av skalaen. Vårt eksempel ER soic-24 surface mount eksempel, men det er også produsert I DIP-format også.

    ad5204ss

    for å gjøre livet enklere kan det bli loddet på EN SOIC breakout bord som konverterer den til en gjennomgående hull pakke:

    ad5204boardss1

    I dette eksemplet vil vi kontrollere lysstyrken på fire lysdioder. Kabling er veldig enkelt. Pinouts er i databladet.

    ex34p2schematic1

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

    funksjonen allOff() og allOn() brukes til å sette potensiometrene til henholdsvis minimum og maksimum. Vi bruker allOff () ved starten av skissen for å slå Av Lysdiodene. Dette er nødvendig som på power-up vindusviskere er vanligvis satt halvveis.

    videre bruker vi dem i blinkAll () – funksjonen til å blinke Lysdiodene. Funksjonen setPot () aksepterer et viskernummer (0~3) og verdi for å angi den viskeren (0~255). Endelig gjør funksjonen indFade () en fin jobb med å falme HVER LED på og av i rekkefølge-forårsaker en effekt som ligner på pulsbreddemodulasjon.

    Endelig, her er det i aksjon:

    Så der har du det-forhåpentligvis en lett å forstå introduksjon TIL VERDEN AV SPI buss og hvordan du styrer enhetene innenfor. Som alltid, nå er det opp til deg og din fantasi å finne noe å kontrollere eller komme opp til andre shenanigans. I NESTE SPI-artikkel vil vi se på å lese og skrive data via SPI-bussen.

    dette innlegget brakt til deg av pmdway.com-alt for produsenter og elektronikkentusiaster, med gratis levering over hele verden.

    for å holde deg oppdatert med nye innlegg på tronixstuff.com, vennligst abonner på mailinglisten i boksen til høyre, eller følg oss på twitter @tronixstuff.

    vennligst del med andre:

    Skriv ut

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *