Sériové Periferní Rozhraní (SPI) byl vyvinut společností Motorola, aby jeho čipy komunikovat s ostatními, stejně jako Philips vymyslel I2C sériové sběrnice pro své vlastní integrované obvody. Zatímco tyto dva autobusy dělají do značné míry stejnou práci, oba se staly téměř stejně běžnými a mnoho periferních zařízení používá jeden nebo druhý ke komunikaci s hostitelským mikrokontrolérem. Tato všudypřítomnost je důvod, proč imps podporují oba.

SPI má oproti I2C určité výhody, zejména podporu vyšší rychlosti přenosu dat., SPI má také duplexní schopnost, která je zvláště vhodná pro ty aplikace, které vyžadují současnou obousměrnou komunikaci.

na druhé straně vyžaduje SPI alespoň tři vodiče sdílené všemi zařízeními na sběrnici a řadu linek pro výběr zařízení, jeden pro každé periferní zařízení připojené k zařízení řadiče. I2C naproti tomu vyžaduje pouze dva vodiče; používá jedinečné adresy k identifikaci všech zařízení na sběrnici., To umožňuje pracovat s více zařízeními jednodušší než SPI adresu-méně přístup, i když někteří vývojáři raději pomocí hardware vyberte zařízení, spíše než data adresy.

řadiče a periferie

SPI odděluje zařízení do „řadičů“ a „periferií“. Pouze jedno zařízení může vyslat časovací impulsy pro synchronizaci datových přenosů, a to je ten, který byl vybrán jako řadič. Všechny ostatní, které synchronizují jejich časování s ovladačem, jsou považovány za dceřiné periferie., Regulátor-který ve vašem produktu musí být v současné době jeho imp — a jeho periferie mohou přenášet a přijímat data, ale pouze regulátor může stanovit vzor časování, na který všichni pracují. Toto vytvoření pevného časového schématu je to, co dělá SPI, jako I2C, „synchronní“ sběrnici.

fyzická sběrnice

implementace SPI imp má čtyři řádky:

  • SCLK, sériový hodinový signál z regulátoru.
  • COPI, zkratka pro „Controller Out, Peripheral In“ (někdy označený MOSI ve starých listech).,
  • CIPO, zkratka pro „Controller In, Peripheral Out“ (někdy označená jako MISO).
  • CS, zkratka pro „Chip Select“ (někdy označené SS, nSS nebo SYNC)

COPI a CIPO jsou linky pro přenos dat.

imp001 a imp002 neposkytují vyhrazené CS piny: místo toho můžete použít některý z dalších pinů imp GPIO. Imp003 a up poskytují vyhrazené CS piny jako součást jejich SPI autobusů, označené na stránce imp pin mux.

Poznámka imp005 poskytuje vyhrazený pin pro výběr čipů na každé ze dvou sběrnic SPI. Pro spiBCAD je to pin D; pro spi0 je to pin CS0., Metoda imp API chipselect () může být použita k převzetí kontroly nad tvrzením a de-tvrzení těchto pinů pro výběr čipů (další informace naleznete v dokumentaci k metodě).


SPI na imp: až čtyři řádky spojit do jednoho periferní zařízení

Tento přístup následuje Motorola definice SPI: že každý autobus transakce — v podstatě várka datových bytů — by měla být vázána na konkrétní periferní., Texas Instruments upravil specifikaci SPI, aby umožnil odeslání každého bajtu na konkrétní periferní zařízení, i když to vyžaduje vyhrazenou linku CS. Tento režim není v současné době podporován žádným imp.

Zabezpečení

za Předpokladu, že máme jeden periferní připojeny k regulátoru, komunikace jsou iniciovány správcem tahání CS linku nízká. Periferie se připravuje na konverzaci. Nyní regulátor začne vysílat hodinové impulsy podél linie SCLK; typicky jsou datové přenosy připojeny ke stoupajícímu okraji každého impulsu, i když tomu tak není vždy.,


Stopování data dovnitř a ven: imp odešle příkaz, periferní vrací data

regulátor bude nyní přenášet data na úbytek biodiverzity line, aktivně řídit line vysoký signál 1 nebo nízké na 0. Periferní bude číst signál, který by mohl být příkaz pro čtení senzoru, který chcete odeslat, například — a to se vrátí, že informace o CIPO line, opět jízdy na trati zůstat vysoké, aby signál 1 nebo jízdě nízká, aby přenesli 0., Tento požadavek, aby linka byla aktivně poháněna vysoko nebo nízko, spíše nechat ji usadit se do jednoho nebo druhého stavu připojením rezistoru, je důvodem, proč SPI může podporovat vyšší rychlosti než I2C. I2C ztrácí čas přenosu, zatímco jeho pull-up odpor vrací linku na vysokou.

to, Že řekl, že je to však dobré praxe také pull-up na CS linku, aby zajistily, že to přejde, když imp je zavedení nebo spí, a proto není schopen řídit vedení vysokého ručně. Udržování linky vysoko zajišťuje, že periferní zařízení ignoruje všechny závady na datových a hodinových linkách.,

když má regulátor to, co chce, pohání linku CS ještě jednou a periferní zařízení může odpočívat.

imp SPI Možnosti

Každý imp má řadu nezávislých SPI autobusy, přístupné jako vlastnosti zařízení je hardware objektu, která je vytvořena na start-up. Tabulka pin mux každého imp ukazuje, že existuje mnoho možností, v závislosti na typu imp, který používáte ve svém produktu. Tento dokument předpokládá, že používáte imp001, takže byste měli konzultovat tabulku pin mux, pokud pracujete s jiným imp., Dva SPI autobusy imp001 jsou jak třívodičové implementace sběrnice, tak připojené k kolíkům 1, 8 a 9 a 2, 5 a 7. Kolíky 1 a 5 jsou SCLK; 8 a 7 COPI; a 9 a 2 CIPO. Podle toho, která ze dvou autobusů, které používáte, je to dobré praxe, aby alias to na začátku:

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

Konfigurace buď pro použití je pouze otázkou říkám, imp, jak rychle chcete, aby autobus ke spuštění, a poskytnout sadu konstant, které společně určují, jak ten autobus bude fungovat:

spi1.configure(modeFlags, speed);

za Prvé, rychlost., 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) hrana
MSB_FIRST Odeslat nejvýznamnější bit první (výchozí)
LSB_FIRST Odeslat nejméně významný bit
NO_SCLK pin SCLK se nepoužívá
USE_CS_L Povolit použití dedikovaný čip zvolte pin (imp005 pouze)

Tyto mohou být kombinovány, pokud je potřebujete, pomocí logické OR operátor, |, i když některé se vzájemně vylučují, takže by neměly být kombinovány: SIMPLEX_TX a SIMPLEX_RX, například., Používat oba CLOCK_IDLE_LOW a CLOCK_2ND_EDGE, například, namísto zadání jedné konstanty jako parametr v konfiguraci() metodu, kterou by zahrnovat jak, oddělených | symbol:

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

Kombinace mohou být nezbytné, pokud jsou uvedeny v okrajových to datasheet, i když to nemusí být okamžitě zřejmé nováček. Datové listy mohou hovořit o „režimu SPI“ zařízení nebo o jeho hodnotách CPOL (polarita hodin) a CPHA (Fáze hodin)., CPOL a CPHA určují, které okraje hodinového signálu se používají k pohonu a vzorkování datových signálů. Každý z těchto dvou parametrů má dva možné stavy, pro čtyři možné kombinace ve všech:


SPI Režimy

SPI Módy jednoduše index ty kombinace, spíše než samostatné CPOL a CPHA hodnoty. Regulátor a periferní zařízení musí komunikovat pomocí stejných hodnot CPOL a CPHA, a tedy stejného režimu., Více periferií může znamenat různé konfigurace, takže regulátor bude muset překonfigurovat sám pokaždé, když potřebuje komunikovat s konkrétní periferní.,následující tabulce:

Čtení A zápisu Dat

S konfiguraci SPI sběrnice, pomocí write() metoda, chcete-li poslat řetězec bajtů periferních zařízení:

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

Použít řetězec je volitelné: můžete také poslat blob surového bajtů dat:

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

Ať už si chcete přečíst řetězec nebo blob, budete potřebovat jeden z imp API je dva SPI číst metody:

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

integer hodnota předaná jako parametr je, respektive, počet bajtů ke čtení do blob, a počet znaků, které mají být dát do řetězce., Samozřejmě, protože jeden znak zabírá jeden bajt, jsou tyto dvě metody rovnocenné. Ten jednoduše převede blob na řetězec pro vás.

vzhledem k „plné duplexní“ povaze sběrnice SPI se zápisy a čtení vždy vyskytují současně. Pomocí příkazů pro čtení a zápis, které jsme dosud viděli, jsou data pohybující se v opačném směru než ta, která nás zajímá, ignorována nebo vynulována. Takže když napíšete řetězec, řekněme, všechna data přicházející na imp z periferie jsou ignorována., Během obou operací čtení, odpovídající velikost „dummy“ nula bajtů je napsáno periferních: pokud budete číst osm bajtů, řekněme, osm 0s jsou zapsány automaticky.

spravovat simultánní obousměrná komunikace, imp API má čtvrtá metoda, která kombinuje čte a píše:

local inputString = spi1.writeread(outputString);

Tak, jako řetězec outputString je odesílán spolu, úbytek biodiverzity line, variabilní inputString je vyplněna data bytes přichází na CIPO. Můžete odesílat a přijímat řetězce nebo kuličky, ale vstup i výstup musí být stejného typu., Ať už je váš výstupní blob velký, vstupní blob bude mít stejnou velikost. Stejně tak budou vstupní a výstupní řetězce stejné délky.

Full duplex operace může být také použit s přístroji, které nemají očekávat, že pracovat tímto způsobem — těch, které vyžadují číst a psát „dummy“ bajtů být konkrétní, nenulovou hodnotu. Tento požadavek vylučuje použití běžných metod zápisu(), readblob() a readstring (), ale writeread() lze použít na jejich místě, aby se ujistil, že jsou použity preferované fiktivní hodnoty zařízení.,

Příklad Kódu

následující kód funguje s Analog Devices ADXL345 digitální akcelerometr, součástí které používá SPI pro komunikaci s hostitelským mikrokontrolérem. Podporuje také I2C a kolíky na této desce Adafruit breakout, která je založena na čipu, jsou odpovídajícím způsobem označeny. Datový list čipu lze stáhnout z webových stránek analogových zařízení.

jak kód funguje

používáme sběrnici imp001 spi257, aliasovanou poblíž začátku výpisu jako spi. Také alias pin 8 jako řádek CS. Funkce spiWriteReg () ukazuje, jak se používají., Transakce zápisu je signalizována přepnutím řádku CS low. Dále adresa registru, do kterého chceme napsat, je převedena z veverky 32bitové podepsané celé číslo na 8bitovou hodnotu napsáním na blob. Tento blob je pak zapsán do SPI autobusu. Děláme to samé s hodnotou, kterou chceme, aby ADXL345 vložil do tohoto registru, a pak znovu nastavíme řádek CS tak, aby signalizoval konec transakce.,


Adafruit/Analog Devices ADXL345

funkce spiReadReg() pracuje stejným způsobem, jen tentokrát budeme číst hodnotu dat z autobusu po napsání zdroj rejstříku adresa. Na ADXL345 vyžaduje některé úpravy mají být provedeny do rejstříku adresa v tomto případě: bit 7 musí být nastaven tak, aby bylo označit transakce jako operace čtení, a bit 6 musí být nastavena říct čip, který očekáváme, že více než jeden byte, který bude odeslán zpět.,

při správném spuštění programu nakonfigurujeme sběrnici SPI IMP tak, aby odpovídala požadavkům čipu ADXL345. Používá režim SPI 3-tj. oba CPOL a CPHA by měly být nastaveny-takže používáme ekvivalentní parametr imp: CLOCK_IDLE_HIGH | CLOCK_2ND_EDGE v configure() volání. Také jsme nastavili rychlost na 100kHz. Dále je pin imp 8, který zde pracuje jako pin CS, nakonfigurován jako digitální výstup a nastaven vysoko.


Zapojení do ADXL345

Další funkce v programu inicializovat ADXL345 sám, spíše než SPI sběrnice., Adxl345 je inicializován a kód čte v hodnotě z registrační adresy 0x00, aby se zajistilo, že zařízení je přítomno na sběrnici. Čip má vlastní testovací režim, který umožňuje provést řadu kalibračních odečtů; to děláme a ukládáme výsledky. Později se ve funkční smyčce () tyto hodnoty používají k úpravě konečných hodnot z akcelerometru.,

ADXL345 ukládá jeho x-, y – a z-osy vzorky jako 16-bitové hodnoty, každý ve dvou 8-bitových registrů; loop() používá spiReadReg() funkce nabývat každé hodnoty dvou složek, a pak převádí je do jediné hodnoty, vynásobením nejvíce významný byte 256 a přidání výsledku hodnotu nejméně významný byte.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *