Tämä on ensimmäinen kahdesta luvusta, joissa alamme tutkia SPI-dataväylää ja sitä käyttävien laitteiden hallintaa Arduino-järjestelmillämme.
SPI-väylä voi tuntua monimutkaiselta käyttöliittymältä hallita, mutta kun tätä selitystä ja käytännön esimerkkejä tutkitaan vähän, sinusta tulee pian väylämestari! Voit tehdä tämän opimme tarvittavan teorian, ja sitten soveltaa sitä ohjaamalla erilaisia laitteita. Tässä opetusohjelmassa asiat pidetään mahdollisimman yksinkertaisina.
mutta ensinnäkin, mikä se on? Ja joku teoria…
SPI on lyhenne sanoista ”Serial Peripheral Interface”. Se on synkroninen sarjadataväylä – data voi kulkea molempiin suuntiin samaan aikaan, toisin kuin (esimerkiksi) I2C-väylä, joka ei voi tehdä niin. Synkronisen tiedonsiirron mahdollistamiseksi SPI-väylä käyttää neljää johtoa. Niitä kutsutaan:
- MOSI – Master-out, Slave-in. Tämä linja kuljettaa dataa arduinostamme SPI-ohjattaviin laitteisiin;
- MISO-Master-in, Slave out. Tämä linja kuljettaa tietoja SPI-ohjatuista laitteista takaisin Arduinoon;
- SS – Orja-select. Tämä linja kertoo laitteen bussissa haluamme kommunikoida sen kanssa. Jokainen SPI-laite tarvitsee uniikin SS-linjan takaisin Arduino;
- SCK-Sarjakelloon.
näissä oppikirjoissa pidämme Arduinon lautaa isäntänä ja SPI-laitteita orjina. Meidän Arduino Uno ja yhteensopivat levyt käytetään nastat ovat:
- SS – digital 10. Voit käyttää muitakin digitaalisia PIN-koodeja, mutta 10 on yleensä oletusarvo, koska se on muiden SPI-PIN-koodien vieressä;
- MOSI-digital 11;
- MISO-digital 12;
- SCK-digital 13;
Arduino Mega users – MISO on 50, MOSI 51, SCK on 52 ja SS on yleensä 53. Jos käytät Arduino Leonardo-ohjelmaa, SPI-nastat ovat ICSP-otsikkokehän pinneillä. Katso lisätietoja täältä. Voit hallita yhtä tai useampaa laitetta SPI-väylällä. Esimerkiksi yhdelle laitteelle johdotus olisi:
Data kulkee edestakaisin MOSI-ja MISO-linjoja pitkin Arduinon ja SPI-laitteen välillä. Tämä voi tapahtua vain, kun SS-linja on asetettu matalaksi. Toisin sanoen, kommunikoidaksemme tietyn SPI-laitteen kanssa bussissa, asetamme SS-linjan kyseiseen laitteeseen matalaksi, sitten kommunikoimme sen kanssa, asetamme linjan takaisin korkeaksi. Jos väylässä on kaksi tai useampia SPI – laitteita, johdotus muistuttaa seuraavaa:
huomaa, miten on kaksi SS-linjaa-tarvitsemme yhden jokaista väylän SPI-laitetta varten. Voit käyttää mitä tahansa ilmainen digitaalinen lähtö pin teidän Arduino kuin SS linja. Muista vain, että kaikki SS-linjat ovat korkealla lukuun ottamatta linjaa, joka on kytketty SPI-laitteeseen, jota haluat käyttää.
tiedot lähetetään SPI-laitteelle tavumuodossa. Sinun pitäisi jo tietää, että kahdeksan bittiä muodostavat yhden tavun, joten ne edustavat binäärilukua, jonka arvo on nollan ja 255: n välillä.
kun kommunikoimme SPI – laitteidemme kanssa, meidän on tiedettävä ensin, miten laite käsittelee dataa-MSB vai LSB. MSB (merkittävin bitti) on binääriluvun vasen puoli ja LSB (vähiten merkitsevä bitti) luvun oikea puoli. Se on:
lukuunottamatta numeeristen arvojen lähettämistä SPI-väylää pitkin, myös binääriluvut voivat esittää komentoja. Voit esittää kahdeksan on / off-asetusta yhdellä datatavulla, joten laitteen parametrit voidaan asettaa lähettämällä datatavu. Nämä parametrit vaihtelevat kunkin laitteen ja olisi havainnollistettava kyseisen laitteen tiedotteessa. Esimerkiksi digitaalinen potentiometri IC, jossa on kuusi ruukkua:
Tämä laite vaatii kaksi tavua dataa. ADDR-tavu kertoo laitteelle, mitä kuudesta potentiometristä ohjataan (numeroitu 0-5), ja DATATAVU on potentiometrin arvo (0~255). Voimme käyttää kokonaislukuja edustamaan näitä kahta arvoa. Esimerkiksi asettaa potentiometri numero kaksi 125, lähettäisimme 2 sitten 125 laitteeseen.
miten lähetämme tietoja SPI-laitteille luonnoksissamme?
Ensinnäkin on käytettävä SPI-kirjastoa. Se sisältyy Arduino IDE: n oletusasennukseen, joten laita sketsi alkuun seuraava:
#include "SPI.h"
seuraava, mitätön.setup () ilmoita, mitä pin(t) käytetään SS ja aseta ne tulosteeksi. Esimerkiksi
pinMode(ss, OUTPUT);
, jossa ss on aiemmin ilmoitettu arvon kymmenen kokonaisluvuksi. Nyt SPI-väylän aktivoimiseksi:
SPI.begin();
ja lopuksi täytyy kertoa sketsi, mihin suuntaan data lähetetään, MSB vai LSB ensin käyttämällä
SPI.setBitOrder(MSBFIRST);
tai
SPI.setBitOrder(LSBFIRST);
kun on aika lähettää dataa SPI-bussissa laitteellemme pitää tapahtua kolme asiaa. Aseta ensin SS: n digitaalinen pin-koodi alhaiseksi:
digitalWrite(SS, LOW);
lähetä tiedot sitten tavuina, yksi tavu kerrallaan käyttäen:
SPI.transfer(value);
arvo voi olla kokonaisluku / tavu välillä nolla-255. Lopuksi, kun olet lähettänyt tiedon laitteellesi, lopeta lähetys asettamalla SS-arvo:
digitalWrite(ss, HIGH);
tietojen lähettäminen on melko yksinkertaista. Yleensä vaikeinta ihmisille on laitteen tietolomakkeen tulkitseminen sen ymmärtämiseksi, miten komennot ja tiedot on jäsenneltävä lähetystä varten. Mutta pienellä harjoittelulla nämä pienet esteet voidaan voittaa.
nyt muutama käytännön esimerkki!
aika nousta SPI-väylälle ja ohjata joitakin laitteita. Seuraamalla alla olevia esimerkkejä, sinun pitäisi saada käytännön käsitys siitä, miten SPI-väylää ja laitteita voidaan käyttää Arduino-levyjemme kanssa.
MCP4162 esimerkki
ensimmäinen esimerkkimme käyttää yksinkertaista mutta mielenkiintoista osaa – digitaalista potentiometriä (käytimme yhtä myös I2C-opetusohjelmassa). Tällä kertaa mukana on mikrosiru MCP4162-sarjan 10k rheostat:
tässä on peruslomakkeen tiedot. Hallita sitä meidän täytyy lähettää kaksi tavua tietoja-ensimmäinen tavu on ohjaus tavu, ja onneksi tässä esimerkissä se on aina nolla (kuten osoite pyyhin arvo on 00h ). Toinen tavu on arvo, jolla pyyhin asetetaan, joka ohjaa vastusta. Joten pyyhkijän asettamiseksi meidän täytyy tehdä luonnoksessamme kolme asiaa…
aseta ensin SS (slave select) – rivi matalaksi:
digitalWrite(10, LOW);
lähetä sitten kaksi byes of data:
SPI.transfer(0); // command byteSPI.transfer(value); // wiper value
aseta lopuksi SS-rivi takaisin korkeaksi:
digitalWrite(10, HIGH);
helposti tehty. Yhteys Arduino – lautaamme on hyvin yksinkertainen-harkitse MCP4162 pinout:
Vdd yhdistää 5V: hen, Vss: ään GND: hen, CS: ään digitaaliseen 10: een, SCK: hen digitaaliseen 13: een, SDI: hen digitaaliseen 11: een ja SDO: hen digitaalinen 12. Käydään nyt läpi MCP4162: n käytettävissä olevat arvot seuraavassa sketsissä:
/* 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); }}
nyt nähdäksemme sketsin tulokset. Seuraavassa videopätkä, me ajaa läpi vastus alue ja mitata rheostat arvo yleismittarilla:
ennen eteenpäin menoa, jos digitaaliset potentiometrit ovat sinulle uusia, kannattaa lukea tämä mikrosirun kirjoittama lyhyt opas mekaanisten ja digitaalisten potentiometrien eroista.
toinen esimerkki:
tässä esimerkissä käytetään analogisia laitteita AD5204 nelikanavainen digitaalinen potentiometri (datalehti.pdf). Se sisältää neljä 10K ohmin lineaarista potentiometriä, ja jokainen potentiometri on säädettävissä yhteen 256 asennosta.
asetukset ovat ailahtelevia, eli niitä ei muisteta virran ollessa pois päältä. Siksi kun valtaa käytetään potentiometrit ovat kaikki valmiiksi asetettu asteikon keskelle. Meidän esimerkki on SOIC – 24 pintaliitos esimerkki, mutta se on myös valmistettu DIP muodossa samoin.
elämän helpottamiseksi se voidaan juottaa SOISEEN purkautumistauluun, joka muuntaa sen läpireikäiseksi paketiksi:
tässä esimerkissä valvotaan neljän kirkkautta ledit. Johdotus on hyvin yksinkertainen. Pinoutit ovat tiedotteessa.
ja sketsi:
#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);}
funktiota allOff() ja allonia() käytetään potentiometrien asettamiseen minimiin ja maksimiin. Sketsin alussa käytetään alloffia (), jolla LEDit sammutetaan. Tämä on tarpeen, koska virrankulutuksen pyyhkimet asetetaan yleensä puolitiehen.
lisäksi käytämme niitä blinkAll () – funktiossa … vilkkumaan ledejä. Toiminto setPot () hyväksyy pyyhkimen numeron (0~3) ja arvon, jolla pyyhin asetetaan (0~255). Lopuksi toiminto indFade () tekee mukavaa työtä häipyminen kunkin LED päälle ja pois järjestyksessä – aiheuttaa vaikutus hyvin samanlainen pulssin leveys modulaatio.
vihdoin, täällä se on toiminnassa:
joten siinä se on – toivottavasti helppo ymmärtää johdatus SPI-väylän maailmaan ja siihen, miten laitteita ohjataan sisällä. Kuten aina, nyt on sinun ja mielikuvituksesi tehtävä löytää jotain, mitä hallita tai ryhtyä muihin metkuihin. Seuraavassa SPI-artikkelissa tarkastelemme tietojen lukemista ja kirjoittamista SPI-väylän kautta.
tämän postauksen toi pmdway.com-kaikki päättäjille ja elektroniikan harrastajille, ilmainen toimitus maailmanlaajuisesti.
pitää ajan tasalla uusista viroista tronixstuff.com tilaa oikealla olevassa laatikossa oleva postituslista tai seuraa meitä Twitterissä @tronixstuff.