a Soros perifériás interfészt (SPI) a Motorola fejlesztette ki, hogy chipjei kommunikálhassanak egymással, ugyanúgy, mint a Philips az I2C soros buszt saját integrált áramköreihez. Míg ez a két busz nagyjából ugyanazt a munkát végzi, mindkettő szinte ugyanolyan általánossá vált, és sok perifériás eszköz az egyiket vagy a másikat használja a fogadó mikrokontrollerrel való kommunikációhoz. Ez a mindenütt jelen van, ezért az imps mindkettőt támogatja.

az SPI-nek van néhány előnye az I2C-vel szemben, különösen a magasabb adatátviteli sebesség támogatása., Az SPI duplex képességgel is rendelkezik, ami különösen alkalmas azoknak az alkalmazásoknak, amelyek egyidejű kétirányú kommunikációt igényelnek.

a másik kezét, SPI megköveteli, hogy legalább három vezetéket, közös az, hogy az eszközök, a buszon, több készülék kiválasztása vonalak, minden perifériás a vezérlőhöz csatlakoztatott eszköz. Az I2C ezzel szemben csak két vezetéket igényel; egyedi címeket használ a busz összes eszközének azonosítására., Ez segíti a munkát, több eszköz sokkal egyszerűbb, mint SPI címe-kevesebb megközelítés, bár egyes fejlesztők inkább a hardver, hogy válasszon ki egy eszközt, ahelyett, cím adatok.

vezérlők és perifériák

SPI elválasztja az eszközöket “vezérlők” és “perifériák”. Csak egy eszköz küldhet időzítőimpulzusokat az adatátvitel szinkronizálásához, és ez az, amelyet az adatkezelő választ. Minden más, amely szinkronizálja időzítését a vezérlővel, kiegészítő perifériáknak számít., Az adatkezelő — amelynek a termékében jelenleg az imp-nek kell lennie-és perifériái mind képesek adatokat továbbítani és fogadni, de csak az adatkezelő tudja megállapítani azt az időzítési mintát, amelyre mindannyian működnek. Ez a rögzített időzítési rendszer létrehozása teszi az SPI-t, mint az I2C, “szinkron” busz.

A fizikai busz

az imp SPI végrehajtása négy sorral rendelkezik:

  • SCLK, a vezérlő soros órajele.
  • COPI, rövidítve “Controller Out, Peripheral In” (néha a MOSI címkével ellátott régi adatlapokon).,
  • CIPO, rövidítve “Controller In, Peripheral Out” (néha Miso).
  • CS, rövidítve “Chip Select” (néha SS, nSS vagy SYNC)

COPI és CIPO az adatátviteli vonalak.

az imp001 és az imp002 nem biztosít külön CS pineket: ehelyett használhatja az imp többi GPIO pinjét. Az imp003 and up SPI buszaik részeként dedikált CS pineket biztosít, amelyeket az imp pin mux oldalon jelöltek meg.

Megjegyzés Az imp005 külön chipválasztó pin-kódot biztosít a két SPI busz mindegyikén. A spiBCAD esetében ez a D tű; a spi0 esetében ez a CS0 tű., Az imp API módszer chipselect () lehet használni, hogy átvegye az irányítást az állítás, de-állítás ezen chip select csapok(lásd a módszer dokumentációját további információ).


SPI az imp — n: legfeljebb négy vonal csatlakozik egyetlen perifériás eszközhöz

Ez a megközelítés követi a Motorola SPI definícióját: hogy minden busz tranzakciót — lényegében egy adat bájt-egy adott perifériához kell kapcsolni., A Texas Instruments módosította az SPI specifikációt, hogy minden bájt elküldhető legyen egy adott perifériára, bár ehhez külön CS vonal szükséges. Ezt a módot jelenleg egyetlen imp sem támogatja.

jelzés

feltételezve, hogy egyetlen periféria van csatlakoztatva a vezérlőhöz, a kommunikációt a CS vonalat alacsonyan húzó vezérlő kezdeményezi. Az azt mondja a perifériának, hogy készüljön fel a beszélgetésre. Most a vezérlő elkezdi az ÓRAIMPULZUSOK küldését az SCLK vonal mentén; általában az adatátvitelt az egyes impulzusok emelkedő széléhez rögzítik, bár ez nem mindig így van.,
Időmérő az adatok ki-be: az imp egy parancsot küld, a perifériás visszatér adatokat,

A vezérlő most továbbítja az adatokat a COPI sort, aktívan vezeti a sort magas jel 1, vagy alacsony 0. A periféria elolvassa a jelet — amely lehet például egy érzékelő olvasásának parancsa -, és visszaadja ezt az információt a CIPO vonalon, ismét vezetve a vonalat, hogy magas maradjon, hogy jelezze az 1-et, vagy alacsonyan vezesse a 0 továbbításához., Ez a követelmény, hogy a vonal aktívan hajtott magas vagy alacsony, inkább hagyta, hogy rendezze az egyik vagy a másik csatlakoztatásával ellenállás, az oka SPI támogathatja nagyobb sebességgel, mint I2C lehet. Az I2C elveszíti az átviteli időt, miközben felhúzó ellenállása magasra állítja a vonalat.

Ez azt jelenti, hogy ennek ellenére jó gyakorlat, hogy egy CS-vonalon is felhúzható annak biztosítása érdekében, hogy az imp indításakor vagy alvásakor magas legyen, ezért nem tudja manuálisan magasra vezetni a vonalat. A vonal magas tartása biztosítja, hogy a periféria figyelmen kívül hagyja az adat-és óravonalak hibáit.,

Ha a vezérlő rendelkezik azzal, amit akar, akkor a CS vonalat még egyszer magasra hajtja, a periféria pedig pihenhet.

imp SPI Options

minden imp-nek számos független SPI busza van, amelyek az eszköz hardverobjektumának tulajdonságaiként érhetők el, amelyet az indításkor instantálnak. Minden imp pin mux táblázata azt mutatja, hogy sok lehetőség van, attól függően, hogy milyen típusú imp-t használ a termékében. Ez a dokumentum feltételezi, hogy imp001-et használ, ezért konzultáljon a pin mux táblával, ha más imp-vel dolgozik., Az imp001 két SPI busza egyaránt háromvezetékes kivitelű, és az 1-es, 8-as és 9-es, illetve 2-es, 5-ös és 7-es villamosokhoz csatlakozik. Az 1-es és 5-ös csapok SCLK; 8-as és 7-es COPI; valamint 9-es és 2-es CIPO. Melyik az a két busz használata, jó gyakorlat, hogy az alias ez az elején:

spi1 <- hardware.spi257;spi2 <- hardware.spi189;

Beállítása vagy használata egyszerű elmondani az imp, hogy milyen gyorsan akarsz a busz fut, amelyek meghatározott állandók, amelyek együttesen határozza meg, hogy a busz fog működni:

spi1.configure(modeFlags, speed);

Először is, a sebesség., 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) edge
MSB_FIRST Küldés legjelentősebb kicsit (alapértelmezett)
LSB_FIRST Küldés a legkisebb helyiértékű bit első
NO_SCLK SCLK pin-kód nem használt
USE_CS_L Engedélyezze a használatát a dedikált chip válassza a pin-kód (imp005 csak)

Ezeket lehet kombinálni, ha kell lenni, használja a logikai VAGY operátor, |, bár néhány egymást kölcsönösen kizárják, így nem kell kombinálni: SIMPLEX_TX, valamint SIMPLEX_RX, például., Mind a CLOCK_IDLE_LOW, mind a CLOCK_2ND_EDGE használatához például, ahelyett, hogy egyetlen állandót adnánk meg paraméterként a configure() metódusban, mindkettőt a | szimbólummal elválasztjuk:

spi1.configure(SIMPLEX_TX | MSB_FIRST | CLOCK_IDLE_LOW, 400);

kombinációk szükségesek lehetnek, ha azokat a periféria adatlapja határozza meg, bár ez nem feltétlenül nyilvánvaló az újonc számára. Az adatlapok beszélhetnek az eszköz “SPI módjáról”, vagy CPOL (óra polaritása) és CPHA (Órafázis) értékeiről., A CPOL és a CPHA meghatározza, hogy az órajel mely széleit használják az adatjelek meghajtására és mintavételére. E két paraméter mindegyikének két lehetséges állapota van, négy lehetséges kombináció esetén:


SPI módok

SPI módok egyszerűen indexelik ezeket a kombinációkat, nem pedig a különálló CPOL és CPHA értékeket. A vezérlőnek és a perifériának ugyanazokkal a CPOL és CPHA értékekkel kell kommunikálnia, így ugyanaz a mód., A több periféria különböző konfigurációkat jelenthet, így a vezérlőnek minden alkalommal újra kell konfigurálnia magát, amikor kommunikálnia kell egy adott perifériával.,a következő táblázat:

Írás-Olvasás Adatok

beállítva, Hogy az SPI busz, használja a write() metódus, hogy küldjön egy string byte, hogy a perifériás eszköz:

spi1.write("This is an LCD display");

Használja a string szabadon választható: lehet is küldeni egy darab nyers adat byte:

local blob = blob(4); // Create a four-byte blob...blob.writen(0xDEADBEEF, 'i'); // ...and write a 32-bit value to itspi1.write(blob);

hogy szeretnénk-E olvasni egy karakterlánc, vagy egy paca, szüksége van az imp API két SPI olvassa el módszerek:

local bytes = spi1.readblob(8);local inputString = spi1.readstring(16);

Az egész értéket, mint egy paraméter, illetve a byte-ok száma, hogy olvasson bele a masszát, majd a karakterek száma, figyelembe kell madzag., Természetesen, mivel egy karakter egy bájtot vesz fel, ez a két módszer egyenértékű. Ez utóbbi egyszerűen átalakítja a blobot az Ön számára.

az SPI busz “full duplex” jellege miatt az írás és olvasás mindig egyszerre történik. Az eddig látott olvasási és írási parancsokkal figyelmen kívül hagyják vagy nullázzák azokat az adatokat, amelyek az érdeklődőnktől ellentétes irányba mozognak. Tehát, amikor egy karakterláncot ír, mondjuk, az imp-hez érkező adatokat a perifériáról figyelmen kívül hagyják., A két olvasási művelet egyikében a “dummy” nulla bájt megfelelő mérete van írva a perifériára: ha nyolc bájtot olvas, mondjuk, nyolc 0-at automatikusan írunk.

kezelni ezt egyidejű kétirányú kommunikáció, az imp API van egy negyedik módszer, amely egyesíti olvas, ír:

local inputString = spi1.writeread(outputString);

Olyan, mint a húr outputString küldik ki együtt a COPI vonal, a változó inputString az, hogy tele van a byte-nyi adat jön a CIPO. Küldhet vagy fogadhat karakterláncokat vagy blobokat, de mind a bemenetnek, mind a kimenetnek azonos típusúnak kell lennie., Azonban nagy a kimeneti blob, a bemeneti blob lesz az azonos méretű. Hasonlóképpen, a bemeneti és kimeneti húrok azonos hosszúságúak lesznek.

teljes duplex művelet is használható eszköz, amely nem várható, hogy működik, hogy így — azok, amelyek megkövetelik az olvasási és írási “dummy” bájtok, hogy egy adott, nem nulla értéket. Ez a követelmény kizárja a rendszeres írási(), readblob() és readstring() módszerek használatát, de a writeread() használható a helyükön, hogy megbizonyosodjon arról, hogy az eszköz előnyben részesített dummy értékeit használják-e.,

példa kód

a következő kód működik az analóg eszközök ADXL345 digitális gyorsulásmérő, egy része, amely SPI kommunikálni a fogadó mikrokontroller. Támogatja az I2C-t is, és a chipen alapuló Adafruit breakout táblán lévő csapokat ennek megfelelően címkézik. A chip adatlapja letölthető az analóg eszközök webhelyéről.

hogyan működik a kód

egy imp001 spi257 buszt használunk, amelyet a lista elején spi-ként említünk. Mi is alias pin 8 mint a CS vonal. A spiwritereg () funkció megmutatja, hogyan használják ezeket., Az írási tranzakciót a CS vonal alacsony kapcsolásával jelzi. Ezután a regiszter címét, amelyre írni akarunk, egy mókus 32 bites aláírt egész számról 8 bites értékre konvertáljuk, ha egy blobra írjuk. Ezt a foltot ezután az SPI buszra írják. Ugyanezt tesszük azzal az értékkel, amelyet az ADXL345-nek be kell helyeznie a nyilvántartásba, majd ismét magasra állítjuk a CS sort, hogy jelezzük a tranzakció végét.,


Az Adafruit/analóg eszközök ADXL345

a függvény spiReadReg() ugyanúgy működik, csak ezúttal a forrásregiszter címének írása után olvasunk értékadatokat a buszról. Ebben az esetben az ADXL345 megköveteli a regisztrációs cím néhány módosítását: a 7-es bitet be kell állítani annak érdekében, hogy a tranzakciót olvasási műveletként jelölje meg, a 6-os bitet pedig be kell állítani, hogy elmondja a chipnek, hogy egynél több byte-t várunk vissza.,

ahol a program megfelelő elindul, az imp SPI buszát úgy állítjuk be, hogy megfeleljen az ADXL345 chip követelményeinek. Ez használ SPI mód 3-azaz. mind a CPOL, mind a CPHA-t be kell állítani-tehát az egyenértékű imp paramétert használjuk: CLOCK_IDLE_HIGH / CLOCK_2ND_EDGE a configure () hívásban. A sebességet 100 kHz-re is állítottuk. Ezután az imp pin 8, amely itt CS pin-kódként működik, digitális kimenetként van konfigurálva, magasra állítva.


Az ADXL345

egyéb funkciók a programban inicializálják az ADXL345-et, nem pedig az SPI buszt., Az ADXL345 inicializálásra kerül, a kód pedig a 0x00 regisztercímből olvasható, hogy az eszköz jelen legyen a buszon. A chip egy önvizsgálati mód, amely lehetővé teszi, hogy egy sor kalibrációs leolvasott kell venni; ezt tesszük, és tárolja az eredményeket. Később a függvényhurokban () ezeket az értékeket a gyorsulásmérő végső leolvasásainak beállítására használják.,

az ADXL345 az x-, y – és z-tengely mintáit 16 bites értékként menti el, mindegyik két 8 bites regiszterben; a loop () a spiReadReg () függvényt használja az egyes értékek két összetevőjének megszerzésére, majd a legjelentősebb bájt 256-os szorzatával átalakítja őket egyetlen értékké, és az eredményhez hozzáadja a legkevésbé jelentős bájt értékét.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük