Kasutaja:Z3n/SPI
SPI (ingl serial peripheral interface) on jada välisliidese ja välisseadmete vaheline andmevahetuse standard, mille töötas välja Motorola ettevõte. SPI töötab täisdupleksi režiimis (saatmise ajal toimub ka vastuvõtt). Seda tüüpi andmevahetust kasutatakse mikroprotsessorite vahel, et „suhelda“ sensorite, mälu (nt SD mälukaardiga), LCD kontrolleritega. Seadmed vahetavad omavahel andmeid ülem-alluv (ingl master/slave) režiimis, kus ülemseade (ingl master) lähtestab andmekaadri (ehk alustab suhtlemist). Korraga on lubatud kasutada mitut alluvseadet, mis on juhtmete abil ülemseadmega seotud. Mõnikord nimetatakse SPI-d ka neljajuhtmeliseks jadasiiniks, eristamaks seda kolmejuhtmelisest jadasiinist ning kahe- ja ühejuhtmelist siinist. SPI-d kutsutakse tihti sünkrooniliseks jadaliideseks.
Liides
[muuda | muuda lähteteksti]SPI määrab nelja loogikasignaali:
- SCLK (serial clock): jada taktsagedus (ülema väljund);
- MOSI (master output slave input); SIMO (slave input master output): ülema väljund, alluva sisend;
- MISO (master input slave output); SOMI (slave output master input): ülema sisend, alluva väljund;
- SS (slave select): alluva valik, ülema väljund.
Alternatiivsed nimed, mis on laialdaselt kasutusel:
- SCK; CLK: jada taktsagedus (ülema väljund);
- SDI; DI, DIN, SI: jada andmete sisend; andmete sisend, jada sisend;
- SDO; DO, DOUT, SO: jada andmete väljund, andmete väljund, jada väljund;
- nCS, CS, CSB, CSN, nSS, STE: kiibi valik, alluva saatmise sisse lülitamine, ülema väljund.
Kokkulepe nõuab, et ülemseadme jada andmete väljund oleks ühendatud alluvseadme jada andmete sisendi külge ja vastupidi. Kiibi valiku polaarsus on harva valitud loogiliselt kõrgeks, kuigi mõned tähistused eeldavad vastupidist.
Operatsioon
[muuda | muuda lähteteksti]SPI siin võib opereerida üksiku ülemseadmega ja ühe või rohkema alluvseadmega. Kui kasutusel on üks alluvseade, võib alluva valiku (SS) viik olla fikseeritud loogiliselt madalaks, kui alluvseade seda lubab. Mõned alluvseadmed alustavad andmete saatmist kiibi valiku väljundsignaali langeva frondi jooksul ehk signaali muutumisel kõrgest madalaks (nt Maxim MAX1242 ADC). Mitme alluvseade kasutamisel peab ülemseade saatma alluva valiku signaali (SS) igale alluvseadmele eraldi.
Suurem osa alluvseadmetest omavad kolmeolekulist signaaliväljundit, nii et nende ülema väljund, alluva sisend (MOSI) signaali impedants muutub kõrgeks (ühendamatu olek), kui seade pole valitud. Ilma kolmeolekulise signaaliväljundita ei saa seadmed jagada SPI siini teiste seadmetega; ainult üks selline alluv võib vahetada andmeid ülemaga ning ainult selle kiibi valik (CS) võib olla aktiveeritud.
Andmete ülekanne
[muuda | muuda lähteteksti]Et alustada andmevahetust, peab ülemseadme taktsagedus olema seadistatud nii, et see oleks väiksem või võrdne sellega, mida alluvseade toetab. Selliste sageduste intervall on tavaliselt vahemikus 1–100 MHz. Seejärel valib ülem alluva, saates vastava biti (loogiline null) kiibi valiku (CS) viigule. Loogiline null tähendab kiibi valiku jaoks "on" (sisse lülitatud) ning loogiline üks oleks "off" (välja lülitatud). Vajaliku ootamisperioodi korral (nt ADC konverteerimise jaoks) peab ülem enne taktsageduse väljaandmist ootama vähemalt selle aja, mis on vajalik ootamisperioodi jaoks.
SPI puhul iga protsessori töötakti aja jooksul toimub täisdupleksi andmevahetus:
- ülem saadab biti „ülema väljund, alluva sisend (MOSI)“ juhile; alluv loeb selle biti samast juhtmest,
- alluv saadab biti „ülema sisend, alluva väljund (MISO)“ juhile; ülem loeb selle biti samast juhtmest.
Mitte kõik andmevahetused ei nõua kõiki nelja operatsiooni, aga enamasti on neid vaja. Andmeedastus koosneb tavaliselt kahest nihkeregistrist antud sõnest suurusega näiteks kaheksa bitti, üks on ülemseadmes, teine alluvas; ühendus moodustab ringi. Andmed on alati nihutatud välja nii, et esimene väljuv bitt on suurima kaaluga bitt (MSB) ning iga biti saatmise jooksul saabub samasse registrisse teistest seadmetest saadetud bitt, alustades vähima kaaluga bitist (LSB). Pärast terve registri nihutamist saavad ülem ja alluv endale vahetatavad registrid ning iga seade opereerib saadud väärtusega ja protsessi korratakse.
Andmeedastus võib taktide jooksul kesta ükskõik kui kaua. Kui edastatavad andmed on otsa saanud, peatab ülem takti genereerimise. Tavaliselt tühistatakse seejärel selle alluva valik. Andmevahetus koosneb tavaliselt 8-bitistest sõnedest ja ülem võib määrata, mitu sellist edastust vaja on. Kasutusel on ka teised sõnede suurused, näiteks 16-bitised sõned puutepaneelide kontrollerite või audiokoodekite jaoks (nt TSC2101 Texas Instruments poolt) või 12-bitised sõned paljude digitaal-analoog- või analoog-digitaalmuundurite jaoks.
Iga siini peal olev alluv, mis ei olnud aktiveeritud, peab loobuma saadetavatest taktidest ning „ülema väljund, alluva sisend (MOSI)“ signaalidest ega saada midagi „ülema sisend, alluva väljund (MISO)“ väljundisse, ehk teisiti öeldes ignoreerib ülemseadet. Ülem peab valima ainult ühe alluva korraga.
Taktgeneraatori polaarsus ja faas
[muuda | muuda lähteteksti]Lisaks taktsageduse määramisele peab ülem seadistama kella polaarsuse ja faasi, arvestades andmeid. Freescale's SPI plokkjuhend[1] nimetab neid kaht suvandit kella polaarsuseks (CPOL) ja kella faasiks (CPHA) ning suurem osa tootjatest kasutab samu mõisteid.
Paremal on näidatud digitaalne ajadiagramm. Järgnevalt on kirjeldatud ajajaotus ülema ja alluvate kohta.
- kella polaarsus =0 (CPOL=0):
- kella faas =0 (CPHA=0) jaoks võetakse andmeid kellatakti tõusva frondi jooksul ning levitatakse langeva frondi ajal
- kella faas =1 (CPHA=1) jaoks võetakse andmeid kellatakti langeva frondi jooksul ning levitatakse tõusva frondi ajal
- kella polaarsus =1 (CPOL=1):
- kella faas =0 (CPHA=0) jaoks võetakse andmeid kellatakti langeva frondi jooksul ning levitatakse tõusva frondi ajal
- kella faas =1 (CPHA=1) jaoks võetakse andmeid kellatakti tõusva frondi jooksul ning levitatakse langeva frondi ajal.
Kella faas =0 (CPHA=0) tähendab katset esimese muutuva frondi puhul, kella faas =1 (CPHA=1) aga katset teise muutuva frondi puhul, vaatamata sellele, kas front on tõusev või langev. Märkus: kella faas =0 puhul peavad andmed olema muutmata poole esimese tsükli jooksul. Mõlema režiimi jaoks peab algne taktgeneraatori väärtus olema stabiilne, enne kui kiibi valik (CS) aktiveerub. MOSI ja MISO on tavaliselt stabiilsed pool tsüklit enne takti muutmist. SPI ülem- ja alluvseadmed võivad selle poole takti jooksul erinevates kohtades andmetega opereerida. See annab andmevahetusele ülema ja alluva vahel suurema paindlikkuse.
Mõned tooted kasutavad teisi kokkuleppelisi nimetusi. Näiteks TI MSP430 kasutab kella polaarsuse (CPOL) nimetuse asemel lühendit UCCKPL ja UCCKPH lühend tähendab inverteeritud kella faasi. Enne kahe kiibi ühendamist peab alati veenduma, et kella faasi algsed väärtused on õigesti seadistatud.
Režiimi numbrid
[muuda | muuda lähteteksti]Polaarsuse ja faasi kombinatsioon (režiim) on tavaliselt nummerdatud järgmise reegli järgi, kus kella polaarsus on suurima kaaluga bitt ja kella faas väiksema kaaluga bitt:
Režiim | CPOL | CPHA |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
Teine tihti kasutatav notatsioon kujutab endast režiimi kella polaarsuse ja kella faasi väärtuste korteeži (ingl tuple), nt. väärtus (0,1) tähendaks kella polaarsus =0 ja kella faas =1
Iseseisva alluva SPI konfigureerimine
[muuda | muuda lähteteksti]Iseseisva alluva konfiguratsioonis on iga alluva jaoks eraldi kiibi valiku juhe. See on SPI tavakasutamine. Kuna ülema sisend, alluva väljund (MISO) viigid on ühendatud kokku, peavad nad esinema kolmeolekuliste viikidena.
SPI pärgühenduse konfiguratsioon
[muuda | muuda lähteteksti]Mõned SPI siiniga tooted on disainitud nii, et neid oleks võimalik ühendada pärgvõrku (ingl daisy chain), kus esimese alluva väljund on ühendatud teise alluva sisendiga jne. SPI iga alluva port on disainitud ära saatma taktgeneraatori teiste taktide jooksul sama koopiat, mis saadakse esimeste taktide jooksul. Kogu kett töötab nagu SPI ühenduse nihkeregister. Selline funktsioon nõuab ülemalt ainult üht SS juhet, aga mitte iga alluva jaoks eraldi juhet.[2]
Õiged SPI sidemed
[muuda | muuda lähteteksti]Mõned alluvseadmed on tehtud nii, et välditakse mistahes SPI sidet, kus protsessori taktide arv on suurem kui nõutud. Teised aga lihtsalt ignoreerivad üleliigseid sisendsignaale ja jätkavad sama väljundbiti edastamist. Tavaliselt toimub erinevate seadmete vahel erineva suurustega sõnede andmevahetus, näiteks kasutatakse SPI-d, et saada juurdepääs mikroprotsessori scan chain testile, mille jooksul toimub käsksõna (nt 32 bitti) edastamine ja erineva suurusega vastuse vastuvõtmine (nt 153 bitti, üks bitt ühe viigi kohta selles testis).
Katkestused
[muuda | muuda lähteteksti]Mõnikord kasutavad SPI seadmed teist juhet, et saata katkestuse signaal host (ülem) CPU-le. Näiteks puuteekraanide puhul on tegemist ekraani vajutamisel tekkivate katkestustega, temperatuurisensorite puhul on need limiidi ületamise häired või katkestused genereeritud reaalajasüsteemidega, SDIO katkestused ja kõrvaklappide pistiku lülitamisel helikoodeki takistus mobiiltelefonis. Katkestused ei ole kaetud SPI standardiga, nende kasutamine ei ole keelatud ega standardiga kirjeldatud.
Näide SPI ülema protokollist bit-bang kasutamisel
[muuda | muuda lähteteksti]Järgmine näide demonstreerib SPI protokolli bit-bang jadaühenduse tehnika kasutamisel, kus SPI ülem (CPOL=0, CPHA=0) kannab üle kaheksa bitti ühe saatmise jooksul. See näide on kirjutatud C keeles. Selleks, et kella polaarsus oleks null (CPOL=0), peab kell olema loogiline null, et aktiveerida kiibi valikut. Kiibi valiku juhe peab olema aktiveeritud, tavaliselt välisseadme jaoks enne saatmist madalaks lülitatud ja pärast deaktiveeritud. Paljud välisseadmed pakuvad või nõuavad mitu saatmist, kui kiibi valiku väärtus on madal.
/* return: 0 on OK, */
unsigned char SPIWriteData(unsigned char byte)
{
unsigned char bit;
/* Negatiivne kella polaarsus */
SETGPHA(0);
/* Andmeid edastatakse langeva frondi jooksul (kõrge->madal muutumine) */
SETGPOL(0);
for (bit = 0; bit < 8; bit++) {
/* viivitus takti suurendamisel */
SPIDELAY(SPISPEED/2);
SETCLK();
/* viivitus takti langemisel */
/* annab riistvarale aega, et sättida MISO juhet */
SPIDELAY(SPISPEED - (SPISPEED/2));
CLRCLK();
/* kirjutada MOSI eelmise takti langeva frondi jooksul */
if (byte & 0x80)
SETMOSI();
else
CLRMOSI();
byte <<= 1;
}
return byte;
}
Plussid ja miinused
[muuda | muuda lähteteksti]Plussid
[muuda | muuda lähteteksti]- Täisdupleks kommunikatsioon
- Kõrgem kanali läbilaskevõime kui I²C või SMBus puhul
- Täielik protokolli paindlikkus saadetavate bittide jaoks
- Ei ole 8-bitilist limiidi
- Omavoliline sõne suurus, sisu ja eesmärk
- Tohutu lihtne riistvaraline liidestamine
- Tüüpiliselt väiksem vooluvõime tarbimine, kui I²C või SMBus puhul, elektroonikakomponente vähema koguse kasutamise tõttu (k.a. pull-up takistid)
- Pole vahekohustatuid või riketega seotuid režiime
- Alluvad kasutavad ülema taktsagedust ja ei nõua täpsemaid ostsilaatoreid
- Alluvad ei nõua unikaalset aadressi — erinevalt I²C või GPIB või SCSI korral
- Transiivereid pole vaja
- Kasutab ainult neli viiki protsessorilt ja kasutab skeemi varustust veel vähem, kui paralleelne liides
- Maksimaalselt üks unikaalne siini signaal seadme kohta (kiibi valik); kõik teised on jagatud
- Signaalid on ühesuunalised, mis lubab kerget galvaanilist isolatsiooni
- Ei ole taktsageduse piirangut, mis suurendab potentsiaalse läbilaskevõimet
Miinused
[muuda | muuda lähteteksti]- Nõuab protsessorilt rohkem viike, kui I²C ja isegi kolmejuhtmelise jadasiini variant
- Pole ribas-signalisatsiooni; vajalikud on ribavälised signalisatsiooni kiibi valiku signaalid jagatud siinidel
- Alluv ei saa kontrollida voo reguleerimist (aga ülem saab viivitada järgmise takti faasi, et langetada edastamise kiirust)
- Ülem ei tea oma alluvatest (ülem saab edastada andmeid teadmata kuhu)
- Toetab ainult ülemseadet
- Veakontrolli pole protokolli määratud
- Kaldub üldiselt mürapiikide tekkimisele, mis tekitab vigase kommunikatsiooni
- Ilma formaalse standardita, vastavuse kontroll on võimatu
- Tegeleb ainult lühikeste maadega, võrreldes RS-232, RS-485, või CAN-bus standardidega