Serial Peripheral Interface (SPI) on kehittänyt Motorola, jotta sen pelimerkkejä, jotta kommunikoida toistensa kanssa, niin paljon kuin Philips kehitti I2C serial bus omia integroituja piirejä. Vaikka nämä kaksi bussia tekevät pitkälti samaa työtä, molemmista on tullut lähes yhtä arkipäiväisiä, ja monet oheislaitteet käyttävät jompaakumpaa tai toista kommunikoidakseen isännän mikrokontrollerin kanssa. Tämän ubikviteetin vuoksi imps Tukee molempia.
SPI on joitakin etuja yli I2C, erityisesti tuki suurempi tiedonsiirtonopeus., SPI on myös duplex-ominaisuus, joka tekee siitä erityisen sopiva niille sovelluksia, jotka edellyttävät samanaikaisesti kaksisuuntainen viestintä.
toisaalta, SPI vaatii vähintään kolme johtoa, jaettu kaikki laitteet bussissa, ja useita laite-valinta linjat, yksi kutakin reuna liitetty säädin laitetta. I2C sen sijaan vaatii vain kaksi johtoa; se käyttää ainutlaatuisia osoitteita kaikkien bussin laitteiden tunnistamiseen., Tämä tekee useiden laitteiden kanssa työskentelystä suoraviivaisempaa kuin SPI: n osoitetiedot-vähemmän lähestymistapaa, vaikka jotkut kehittäjät mieluummin käyttävät laitteistoa laitteen valitsemiseen kuin osoitetietoja.
– Ohjaimet Ja Oheislaitteet
SPI-erottaa laitteet ’valvojat’ ja ’oheislaitteet’. Vain yksi laite voi lähettää ulos pulsseja ajoitus synkronoida tiedot, siirrot, ja se on yksi valittu ohjain. Kaikkia muita, jotka synkronoivat ajantajunsa ohjaimeen, pidetään toissijaisina oheislaitteina., Ohjain — mikä tuote on tällä hetkellä sen imp — ja sen oheislaitteet voivat kaikki lähettää ja vastaanottaa tietoja, mutta vain rekisterinpitäjä voi laatia aikataulu kuvio, johon ne kaikki toimivat. Tämä kiinteän ajoitusjärjestelmän luominen tekee SPI: stä, kuten I2C: stä, ”synkronisen” väylän.
Fyysinen Linja
imp on SPI täytäntöönpano on neljä riviä:
- SCLK, serial clock signaali-ohjain.
- COPI, lyhenne sanoista ”Controller Out, Peripheral In” (joskus merkitty Mosi vanhoissa tietosivuissa).,
- CIPO, lyhenne sanoista ”Controller In, Peripheral Out” (joskus merkitty MISO).
- CS, lyhyt ’Siru Valitse’ (joskus merkitty SS: n, nSS: n tai SYNC)
COPI ja CIPO ovat data-siirto linjat.
imp001 ja imp002 ei tarjota omistettu CS nastat: sen sijaan voit käyttää mitä tahansa näistä imp on muita GPIO nastat. Imp003 ja up tarjoavat omistettu CS nastat osana niiden SPI bussit, merkitty imp pin mux sivulla.
huomaa, että imp005: ssä on erillinen siruvalintanappi jokaisessa sen kahdessa SPI-bussissa. Spibcadille tämä on pin D; spi0: lle tämä on pin CS0., Imp API menetelmä chipselect() voidaan käyttää hallita väite ja de-väite näiden siru valitse nastat (katso menetelmä dokumentaatio lisätietoja).
SPI edelleen imp: jopa neljä riviä muodostaa yhden oheislaitteen
Tämä lähestymistapa seuraa Motorolan määritelmä SPI: että jokainen linja-kauppa — lähinnä erän tiedot tavua — pitäisi olla sidoksissa tietyn reuna., Texas Instruments muutti SPI-eritelmää, jotta jokainen tavu voidaan lähettää tietylle reuna-alueelle, vaikka tämä edellyttää erityistä CS-linjaa. Tämä tila ei tällä hetkellä tue yhdenkään imp.
Merkinanto
Olettaen, että meillä on yhteinen reuna kytketty ohjaimeen, viestintä aloitetaan, säädin vetää CS line alhainen. The käskee ääripäätä valmistautumaan keskusteluihin. Nyt säädin alkaa lähettää kellon pulsseja ulos pitkin SCLK line; tyypillisesti tiedonsiirron tunnistaa nouseva reuna kunkin pulssin, vaikka se ei ole aina tapaus.,
Kellotus tiedot sisään ja ulos: imp lähettää käskyn, reuna-palauttaa tietoja,
– rekisterinpitäjän tulee nyt välittää tietoa COPI-linjalla, aktiivisesti ajo-linjan korkea signaali 1 tai matala 0. Reuna lukee signaalin, joka saattaa olla komento anturin lukema lähetetään, esimerkiksi — ja se tulee palauttaa, että tiedot CIPO line, jälleen ajo line pysyä korkea signaali 1 tai ajo sen alhainen välittää 0., Tämä vaatimus, että linja on aktiivisesti ajanut korkea tai matala, vaan antaa sen asettua yksi valtio tai muut kytkemällä vastus, on syy SPI voi tukea suuremmilla nopeuksilla kuin I2C voi. I2C menettää lähetysaikaa, kun sen vetovastus palauttaa linjan korkealle.
se sanoi, se on kuitenkin hyvä käytäntö on myös pull-up on CS linja varmistaa, että se menee korkea, kun imp on käynnistystä tai nukkuminen, ja siksi ei voi ajaa linjan korkea manuaalisesti. Pitämällä linja korkea varmistaa reuna jättää huomiotta mitään virheitä tiedot ja kellon linjat.,
Kun controller on, mitä se haluaa, se ajaa CS line high kerran, ja reuna voi levätä.
imp SPI-Asetukset
Jokainen imp on useita riippumattomia SPI bussit, käyttää ominaisuuksia laitteen laitteisto-esine, joka on instantiated käynnistyksen. Jokainen imp pin-mux taulukko osoittaa, että on olemassa monia vaihtoehtoja, riippuen siitä, minkä tyyppinen imp käytät oman tuotteen. Tässä asiakirjassa oletetaan, että käytät imp001: tä, joten sinun pitäisi ottaa yhteyttä pin mux-taulukkoon, jos työskentelet eri imp: n kanssa., Se imp001 on kaksi SPI-bussit ovat molemmat kolme-wire-toteutukset linja, ja liittää nastat 1, 8 ja 9, ja 2, 5 ja 7, vastaavasti. Nastat 1 ja 5 ovat SCLK; 8 ja 7 COPI; ja 9 ja 2 CIPO. Kumpi kaksi bussia käyttää, se on hyvä käytäntö alias sen alussa:
spi1 <- hardware.spi257;spi2 <- hardware.spi189;
Määrittäminen joko käyttää on yksinkertaisesti kysymys kertoo imp kuinka nopeasti haluat bussi ajaa, ja antaa joukko vakioita, jotka yhdessä määrittävät, kuinka bussi toimivat:
spi1.configure(modeFlags, speed);
Ensimmäinen, nopeus., This is simply an integer value giving the throughput in kiloHertz (kHz):
The specific SPI data rates available (in kHz) are as follows:
imp001, imp002 | imp003 | imp004m | imp005 | imp006 | |
spi189 | spi257 | spiEBCA spiLGDK |
spiAHSR spiGJKL |
spiBCAD spi0 |
spiXTUVW |
15,000 | 30,000 | 18,000 | 24,000 | The SPI data rates available range from 5KHz to 22.,8MHz The SPI is clocked by dividing 160MHz by any integer from 7 to 32,000 inclusive |
Min. 187KHz, max. 750KHz |
7500 | 15,000 | 9000 | 12,000 | ||
3750 | 7500 | 4500 | 6000 | ||
1875 | 3750 | 2250 | 3000 | All others | |
937.50 | 1875 | 1125 | 1500 | Min. 187KHz, theoretical max. 24MHz |
|
468.75 | 937.50 | 562.50 | 750 | ||
234.,375 | 468.75 | 281.25 | 375 | ||
117.1875 | 234.375 | 140.,g) reuna | |||
MSB_FIRST | Lähetä eniten merkitsevä bitti ensin (oletus) | ||||
LSB_FIRST | Lähetä vähiten merkitsevä bitti ensin | ||||
NO_SCLK | SCLK pin-koodi ei ole käytössä | ||||
USE_CS_L | Ota käyttöön omistettu siru valitse pin (imp005 vain) |
Nämä voidaan yhdistää, jos tarvitset niitä, käyttäen loogista or-operaattoria, |
, vaikka jotkut ovat toisensa poissulkevia, joten ei pitäisi yhdistää: SIMPLEX_TX ja SIMPLEX_RX, esimerkiksi., Käyttää sekä CLOCK_IDLE_LOW ja CLOCK_2ND_EDGE, esimerkiksi, sen sijaan, että antaisit yhden vakio parametri määritä() menetelmä kattaa molemmat erotettuna |
tunnus:
spi1.configure(SIMPLEX_TX | MSB_FIRST | CLOCK_IDLE_LOW, 400);
Yhdistelmiä voi olla tarpeen, jos ne on määritelty reuna on datasheet, vaikka tämä ei välttämättä ole heti ilmeinen tulokas. Tietosivuilla voidaan puhua laitteen ”SPI-tilasta” tai sen CPOL (kellon napaisuus) ja Cpha (kellon vaihe) arvoista., CPOL ja CPHA määrittävät, mitä kellosignaalin reunoja käytetään ajamaan ja ottamaan näytteitä datasignaaleista. Kumpikin näistä kahdesta parametrit on kaksi mahdollista tilaa, neljä mahdollisia yhdistelmiä koko:
SPI-Tilaa
SPI-Tilaa yksinkertaisesti indeksi näiden yhdistelmiä, pikemminkin kuin erillinen CPOL ja CPHA arvoja. Ohjaimen ja oheislaitteiden täytyy kommunikoida käyttäen samaa CPOL ja CPHA arvoja, ja siten samassa Tilassa., Useita oheislaitteita voi hyvinkin tarkoittaa eri kokoonpanoissa, joten rekisterinpitäjän on määritettävä itsensä aina, kun se tarvitsee kommunikoida tietyn reuna.,seuraava taulukko:
Lukemisen Ja Kirjoittamisen Tietoja
Ottaa määritetty SPI-väylä, käytä write () – metodi lähettää merkkijono tavua reuna-laite:
spi1.write("This is an LCD display");
Käytä merkkijono on valinnainen: voit myös lähettää möykky raaka tavua tietoja:
local blob = blob(4); // Create a four-byte blob...blob.writen(0xDEADBEEF, 'i'); // ...and write a 32-bit value to itspi1.write(blob);
haluatko lukea merkkijono tai möykky, tarvitset yksi imp API on kaksi SPI-lue menetelmiä:
local bytes = spi1.readblob(8);local inputString = spi1.readstring(16);
integer-arvo välitetään parametrina on, vastaavasti, määrä tavuja voidaan lukea osaksi möykky ja merkkien määrä voidaan laittaa merkkijono., Tietenkin, koska yksi merkki vie yhden tavun, nämä kaksi menetelmää vastaavat. Jälkimmäinen yksinkertaisesti muuntaa blob merkkijono sinulle.
Koska ’kaksisuuntainen’ luonne SPI-väylä, kirjoittaa ja lukee aina tapahtua samanaikaisesti. Tähänastisilla luku-ja kirjoituskomennoilla ei huomioida tai nollataan tietoja, jotka liikkuvat vastakkaiseen suuntaan kuin ne, joista olemme kiinnostuneita. Joten, kun kirjoitat merkkijonon, vaikkapa, kaikki tiedot saapuvat imp periferiasta ohitetaan., Aikana joko kaksi lukuoperaatioiden, matching koko ”dummy” nolla-tavut on kirjoitettu reuna: jos olet lukenut kahdeksan tavua, sanovat, kahdeksan 0s kirjoitetaan automaattisesti.
hallita tämä samanaikainen kaksisuuntainen viestintä, imp API on neljäs menetelmä, joka yhdistää lukee ja kirjoittaa:
local inputString = spi1.writeread(outputString);
Joten, kuten string outputString lähetetään ulos pitkin COPI linja, muuttuja inputString on täytetty tiedot tavua tulossa on CIPO. Voit lähettää ja vastaanottaa merkkijonoja tai blobs, mutta sekä tulo ja lähtö on oltava samantyyppisiä., Kuitenkin suuri ulostulo blob, tulosi blob on samankokoinen. Samoin Tulo-ja Lähtö jouset ovat saman pituisia.
Full duplex toiminta voi myös käyttää laitetta, jotka eivät odota toimivat näin — ne, jotka vaativat lukea ja kirjoittaa ”dummy” tavua olevan erityinen, ei-nolla-arvo. Tämä vaatimus sulkee pois käyttämällä säännöllisesti write(), readblob() ja luemerkkijono (menetelmiä), mutta writeread() voidaan käyttää niiden paikka varmista, että laite on edullinen nuken arvoja käytetään.,
Esimerkki Koodi
seuraava koodi toimii Analog Devices ADXL345 digitaalinen kiihtyvyysanturi, a-osa, joka käyttää SPI kommunikoida sen isäntä mikro. Se tukee myös I2C: tä, ja tämän siruun perustuvan Adafruit breakout-laudan nastat merkitään vastaavasti. Sirun datalehden voi ladata analogisten laitteiden verkkosivuilta.
Kuinka Koodi Toimii
käytämme imp001 on spi257 linja, alias lähellä alussa listalle, kuten spi. Käytämme myös nimimerkkiä pin 8 CS-rivinä. Funktio spirwritereg() osoittaa, miten näitä käytetään., Kirjoitustapahtuma merkitään vaihtamalla CS-rivi matalaksi. Seuraava osoite rekisterin haluamme kirjoittaa muunnetaan Orava 32-bittinen allekirjoitettu kokonaisluku 8-bittinen arvo kirjoittamalla se möykky. Tämä möykky kirjoitetaan sitten SPI-bussiin. Teemme saman arvolla, jonka haluamme ADXL345: n laittavan tuohon rekisteriin, ja sitten asetamme CS-linjan korkealle jälleen viestiäksemme kaupan päättymisestä.,
Adafruit/Analog Devices ADXL345
– toiminto spiReadReg() toimii samalla tavalla, vain tällä kertaa me luemme arvon data-linja sen jälkeen, kun kirjallinen lähde rekisteriä osoite. Se ADXL345 edellyttää joitakin muutoksia rekisteriin osoite, tässä tapauksessa: bit 7 on asetettava, jotta, jos haluat merkitä tapahtuman kuin lukea toiminta, ja bit 6 on asetettava kertoa siru, että odotamme enemmän kuin yksi tavu lähetetään takaisin.,
missä ohjelma oikein alkaa, määrittelemme imp: n SPI-väylän vastaamaan ADXL345-sirun vaatimuksia. Se käyttää SPI-tilaa 3-eli. sekä CPOL että CPHA tulisi asettaa — joten käytämme ekvivalenttia imp-parametria: CLOCK_IDLE_HIGH | CLOCK_2ND_EDGE configure () – haussa. Asetimme myös nopeuden 100kHz: iin. Seuraava, imp n pin 8, joka toimii täällä CS pin, on määritetty digitaalilähtö ja asetettu korkealle.
Johdot ylös ADXL345
Muut toiminnot ohjelma alustaa ADXL345 itse sen sijaan SPI-väylään., Se ADXL345 on alustettu, ja koodi lukee arvon rekisteristä osoite 0x00
varmistaa, että laite on esitettävä bussissa. Sirulla on itsetestaustila, joka mahdollistaa sarjan kalibrointilukemia; näin teemme ja tallennamme tulokset. Myöhemmin funktiosilmukassa () näitä arvoja käytetään säätämään lopullisia lukemia kiihtyvyysmittarista.,
ADXL345 säästää sen x-, y – ja z-akselin näytteitä kuin 16-bittisiä arvoja, kukin kaksi 8-bittisiä rekistereitä; loop() käyttää spiReadReg () – funktio hankkia jokainen arvo on kaksi komponenttia, ja sitten muuntaa ne yhden arvot kertomalla eniten merkitsevä tavu 256 ja lisäämällä tulokseen arvo vähiten merkitsevä tavu.