AVR tečaj usposabljanja. Delo z modulom SPI. Branje in pisanje podatkov. Ch2. Kako delati s SPI - Theory Spi input

Vmesniki za prenos.

Veliko vmesnikov za prenos podatkov je bilo razvitih za prenos podatkov iz ene naprave v drugo ali iz enega čipa v drugega. Vsak vmesnik ima tako pozitivne kot negativne strani, zato morate poznati vmesnike, njihove prednosti in slabosti ter uporabiti pravi vmesnik za prenos podatkov v dani situaciji.

Vmesniki imajo asinhroni in sinhroni prenos podatkov. Pri sinhronem prenosu podatkov se hkrati s podatki prenaša signal ure, kar omogoča sinhronizacijo sprejemnika in oddajnika. Primer takega protokola je vmesnik SPI.

Pri asinhronem prenosu podatkov ni signala ure. V takih linijah obstaja nevarnost neusklajenosti med sprejemnikom in oddajnikom, zaradi česar nadaljnji podatki ne bodo pravilno sprejeti. Da bi to preprečili, asinhroni vmesniki izvajajo občasno sinhronizacijo vzdolž podatkovnih linij. Prednost takih vmesnikov je manjše število vodnikov, potrebnih za prenos.

Oglejmo si podrobneje nekaj najbolj priljubljenih vmesnikov.

vmesnik USART.

Vmesnik USART je serijski univerzalni sinhrono-asinhroni oddajnik-sprejemnik. Podatki se v rednih intervalih prenašajo v USART. To časovno obdobje je določeno z določeno hitrostjo USART in je določeno v baudu (za znake, ki lahko sprejmejo samo vrednosti, enake nič ali ena, je baud enakovreden bitom na sekundo). Obstaja splošno sprejet razpon standardnih hitrosti: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 baudov.

Poleg podatkovnih bitov USART samodejno vstavi sinhronizacijske oznake v tok, tako imenovane začetne in končne bite. Po prejemu se ti dodatni deli odstranijo. Običajno začetni in končni bit ločita en bajt informacije (8 bitov), ​​vendar obstajajo izvedbe USART, ki omogočajo prenos 5, 6, 7, 8 ali 9 bitov. Biti, ločeni z začetnim in končnim signalom, so minimalno pošiljanje. USART vam omogoča, da med prenosom vstavite dva zaustavitvena bita, da zmanjšate verjetnost desinhronizacije sprejemnika in oddajnika v gostem prometu. Sprejemnik ignorira drugi stop bit in ga obravnava kot kratek premor na liniji.

Dogovor je, da je pasivno (če ni podatkov) stanje vhoda in izhoda USART logična "1". Začetni bit je vedno logična "0", zato sprejemnik USART čaka na prehod iz "1" v "0" in od tega odšteje časovni interval polovice trajanja bita (sredina prenosa začetnega bita) . Če je v tem trenutku vnos še vedno "0", se začne postopek prejema minimalne pošiljke. Da bi to naredil, sprejemnik prešteje 9-bitno trajanje v vrsti (za 8-bitne podatke) in zabeleži vhodno stanje v vsakem trenutku. Prvih 8 vrednosti so prejeti podatki, zadnja vrednost je testna vrednost (stop bit). Vrednost stop bita je vedno "1"; če je dejanska prejeta vrednost drugačna, USART zabeleži napako.

Za oblikovanje časovnih intervalov imata oddajni in sprejemni USART vir natančnega časa (takt). Natančnost tega vira mora biti tolikšna, da vsota napak (sprejemnika in oddajnika) pri nastavitvi časovnega intervala od začetka začetnega impulza do sredine končnega impulza ne presega polovice (ali še bolje, vsaj a četrtino) bitnega intervala. Za 8-bitno sporočilo 0,5/9,5 = 5 % (v resnici ne več kot 3 %). Ker je to vsota napak sprejemnika in oddajnika ter možnega popačenja signala na liniji, priporočena toleranca za natančnost takta USART ni večja od 1,5 %.

Ker urni biti zavzemajo del bitnega toka, posledična prepustnost UART ni enaka hitrosti povezave. Na primer, za 8-bitne prenose formata 8-N-1 zavzamejo urni biti 20 % toka, kar za fizično hitrost 115.200 baudov daje podatkovno bitno hitrost 92.160 bps ali 11.520 bajtov/s.

Preverjanje paritete

Protokol USART ima zmožnost samodejnega nadzora celovitosti podatkov z metodo bitne paritete. Ko je ta funkcija omogočena, je zadnji bit podatkov ("paritetni bit") vedno 1 ali 0, tako da je število enic v bajtu vedno sodo.

Nadzor toka

V starih časih so bile lahko naprave USART tako počasne, da niso mogle slediti dohodnemu toku podatkov. Za rešitev tega problema so bili moduli USART opremljeni z ločenimi izhodi in vhodi za nadzor pretoka. Ko je bil vhodni medpomnilnik poln, je logika sprejemnega USART nastavila stopnjo prepovedi na ustreznem izhodu, oddajni USART pa je prekinil prenos. Kasneje je bil nadzor pretoka dodeljen komunikacijskim protokolom in potreba po ločenih linijah za nadzor pretoka je postopoma izginila.

Fizična izvedba.

USART je protokol izmenjave, tj. določa način tvorbe bitov, parametre prenosa bajtov, hitrost prenosa itd.

Toda fizična izvedba USART je lahko drugačna. Na primer, za prenos podatkov znotraj ene plošče se signali prenašajo na nivojih +5V in 0V. Za prenos podatkov na velike razdalje in med napravami se uporabljajo drugi fizični napetostni nivoji in standardi, kot so: tokovna zanka (4-20 mA), RS-232 (COM port), RS-485 ipd.

Za pretvorbo ravni "krmilnika" 0-5 V v "standardne" ravni obstaja ogromno specializiranih mikrovezij, na primer ADM202 za RS-232.

Serijski vmesnik SPI

Ime SPI je okrajšava za "Serial Peripheral Bus", kar odraža njegov namen - vodilo za povezovanje zunanjih naprav. Vodilo SPI je organizirano po principu master-slave. Glavni vodilo je običajno mikrokrmilnik, lahko pa je tudi programabilna logika, krmilnik DSP ali ASIC. Naprave, povezane z glavnim, so podrejene. Njihovo vlogo igrajo različne vrste mikrovezij, vklj. pomnilniške naprave (EEPROM, Flash pomnilnik, SRAM), ura realnega časa (RTC), ADC/DAC, digitalni potenciometri, specializirani krmilniki itd.

Glavni gradnik vmesnika SPI je običajni premični register, katerega sinhronizacijski in bitni vhodni/izhodni signali tvorijo vmesniške signale. Zato je pravilneje, da protokol SPI imenujemo ne protokol za prenos podatkov, temveč protokol za izmenjavo podatkov med dvema registroma premika, od katerih vsak hkrati opravlja funkcijo sprejemnika in oddajnika. Predpogoj za prenos podatkov po vodilu SPI je generiranje signala za sinhronizacijo vodila. Samo vodja ima pravico ustvariti ta signal in delo sužnja je popolnoma odvisno od tega.

Povezava.

Obstajajo tri vrste povezav z vodilom SPI, od katerih vsaka vključuje štiri signale. Namen signalov SPI je opisan v tabeli 7.1.

Najenostavnejša povezava, ki vključuje samo dve mikrovezji, je prikazana na sliki 7.2. Tukaj glavni vodilo prenaša podatke po liniji MOSI sinhrono s signalom SCLK, ki ga generira, podrejeni pa zajema poslane podatkovne bite na določenih robovih prejetega sinhronizacijskega signala. Istočasno podrejeni pošlje svoj podatkovni paket. Predstavljeno vezje je mogoče poenostaviti z odpravo linije MISO, če uporabljeni podrejeni IC ne omogoča prenosa odzivnih podatkov ali ga ni potrebno. Enosmerni prenos podatkov lahko najdemo v čipih, kot so DAC-ji, digitalni potenciometri, programabilni ojačevalniki in gonilniki. Tako obravnavana možnost za povezavo podrejenega IC zahteva 3 ali 4 komunikacijske linije.

Da lahko podrejeni IC sprejema in oddaja podatke, mora biti poleg signala ure tudi linija SS nizka. V nasprotnem primeru bo podrejeni IC neaktiven. Ko se uporablja samo en zunanji IC, je morda skušnjava odstraniti linijo SS tako, da se izbirni vhod podrejenega IC močno zniža. Ta rešitev je skrajno nezaželena in lahko povzroči okvare ali celo nemožnost prenosa podatkov, ker Vhod za izbiro čipa služi za ponastavitev IC na začetno stanje in včasih sproži izhod prvega bita podatkov.

Če je treba na vodilo SPI priključiti več mikrovezij, se uporabi neodvisna (vzporedna) povezava (slika 7.3) ali kaskadna (serijska) povezava (slika 7.4). Neodvisna povezava je pogostejša, ker doseči pri uporabi katerega koli čipa, združljivega s SPI. Tukaj so vsi signali, razen za izbiro mikrovezja, povezani vzporedno, glavni vodilo pa s prenosom enega ali drugega signala SS v nizko stanje določi, s katerim podrejenim IC bo izmenjal podatke. Glavna pomanjkljivost te povezave je potreba po dodatnih linijah za naslavljanje podrejenih čipov (skupno število komunikacijskih linij je 3+n, kjer je n število podrejenih čipov).

Če ni dovolj nog mikrokrmilnika, lahko uporabite demultipleksni čip. Demultipleksor poveže en sam vhodni signal z enim od izhodnih signalov, odvisno od kode na krmilnih zatičih. Slika 7.4 prikazuje povezovalni diagram za demultiplekser. Na njegov vhod se dovaja signal SS, ki ima vrednost enako 0, če je potrebno izbrati eno od mikrovezij. Številka zahtevanega mikrovezja v binarni kodi je dobavljena na noge Am-A0. To vam omogoča zmanjšanje števila nog, uporabljenih v mikrokrmilniku, na m=log 2 n. Kjer je n število podrejenih čipov. Tisti. za povezavo 128 naprav je potrebnih 8 pinov mikrokrmilnika. Ena za nastavitev signala za omogočanje in 7 za nastavitev številke čipa, ki naj se vklopi. Upoštevati je treba, da mora biti na nepovezanih krakih demultiplekserja logična. V nasprotnem primeru se uporablja pretvornik signala, ki pretvori logično ničlo v logično enoto.

Kaskadno preklapljanje je brez te pomanjkljivosti, ker tukaj več čipov tvori en velik premični register. Da bi to naredili, je izhod podatkov za prenos enega IC povezan z vhodom za sprejem podatkov drugega, kot je prikazano na sliki 3. Vhodi za izbiro čipa so tukaj povezani vzporedno in tako je skupno število komunikacijskih linij enako do 4. Vendar je uporaba kaskadne povezave možna le, če je njena podpora navedena v dokumentaciji za uporabljene čipe. Da bi to ugotovili, je pomembno vedeti, da se takšna povezava v angleščini imenuje "daisy-chaining".

Prenosni protokol

Protokol prenosa prek vmesnika SPI je v bistvu identičen logiki premikalnega registra (slika 7.6), ki je sestavljen iz izvajanja premikanja in temu primerno bitnega vnosa in izhoda podatkov na določenih robovih sinhronizacijskega signala. Nastavitev podatkov med prenosom in vzorčenje med sprejemom se vedno izvajata na nasprotnih robovih ure. To je potrebno za zagotovitev vzorčenja podatkov, ko so zanesljivo ugotovljeni. Če upoštevamo, da je prvi rob v prenosnem ciklu lahko naraščajoči ali padajoči rob, potem so možne štiri logične možnosti za delovanje vmesnika SPI. Te možnosti se imenujejo načini SPI in so opisane z dvema parametroma:

· CPOL - začetni nivo sinhronizacijskega signala (če je CPOL=0, ima sinhronizacijski vod pred začetkom prenosnega cikla in po njegovem koncu nizek nivo (tj. prvi rob se dviga, zadnji pa pada), drugače, če je CPOL=1, - visoko (tj. prva fronta pada, zadnja pa narašča));

· CPHA - faza sinhronizacije; Ta parameter določa zaporedje, v katerem se podatki namestijo in pridobijo. Če je CPHA=0, bodo podatki vzorčeni na naraščajočem robu takta, nato pa bodo podatki nastavljeni na padajočem robu. Če je CPHA=1, bo namestitev podatkov izvedena na naraščajočem robu v sinhronizacijskem ciklu, vzorčenje pa na padajočem robu.

Informacije o načinih SPI so predstavljene na slikah 7.7 in 7.8.

Glavni in podrejeni čipi, ki delujejo v različnih načinih SPI, so nezdružljivi, zato je pred izbiro podrejenih čipov pomembno razjasniti, katere načine podpira glavno vodilo. Strojni moduli SPI, integrirani v mikrokrmilnike, v večini primerov podpirajo možnost izbire katerega koli načina, zato je nanje mogoče priključiti poljubne podrejene čipe SPI (velja samo za možnost neodvisne povezave). Poleg tega je protokol SPI v katerem koli od načinov enostavno implementiran v programsko opremo.

Vmesnik RS-485

Vmesnik RS-485 (drugo ime je EIA/TIA-485) je eden najpogostejših standardov fizične komunikacijske plasti. Fizična plast je komunikacijski kanal in način prenosa signala (1. plast modela povezovanja odprtih sistemov OSI).

Omrežje, zgrajeno na vmesniku RS-485, je sestavljeno iz sprejemno-sprejemnih enot, povezanih s sukanim parom - dvema zvitima žicama. Vmesnik RS-485 temelji na principu diferencialnega (uravnoteženega) prenosa podatkov. Njegovo bistvo je prenos enega signala po dveh žicah. Poleg tega ena žica (pogojno A) nosi originalni signal, druga (pogojno B) pa njegovo inverzno kopijo. Z drugimi besedami, če je na eni žici "1", potem na drugi "0" in obratno. Tako obstaja vedno potencialna razlika med dvema žicama sukanega para: pri "1" je pozitivna, pri "0" pa negativna (slika 7.9).

Ta potencialna razlika je tista, ki prenaša signal. Ta metoda prenosa zagotavlja visoko odpornost na skupne motnje. Skupna motnja je motnja, ki enako vpliva na obe žici linije. Na primer, elektromagnetno valovanje, ki gre skozi odsek komunikacijskega voda, povzroči potencial v obeh žicah. Če se signal prenaša s potencialom v eni žici glede na skupno, kot v RS-232, potem lahko motnje na tej žici popačijo signal glede na skupno (ozemljitev), ki dobro absorbira motnje. Poleg tega bo razlika potenciala tal padla čez upor dolge skupne žice - dodaten vir popačenja. In pri diferencialnem prenosu se popačenje ne pojavi. Pravzaprav, če dve žici ležita blizu druga drugi in sta celo prepleteni, potem je sprejem na obeh žicah enak. Potencial v obeh enako obremenjenih žicah se spreminja enako, informativna potencialna razlika pa ostane nespremenjena.

Strojna izvedba vmesnika RS485.

Strojna izvedba vmesnika - sprejemno-sprejemni čipi z diferencialnimi vhodi/izhodi (na linijo) in digitalnimi vrati (na UART vrata krmilnika). Za ta vmesnik sta na voljo dve možnosti: RS-422 in RS-485.

RS-422 je polni dupleksni vmesnik. Sprejem in prenos potekata preko dveh ločenih parov žic. Na vsakem paru žic je lahko le en oddajnik.

RS-485 je poldupleksni vmesnik. Sprejem in prenos potekata preko enega para žic s časovno ločitvijo. V omrežju je lahko veliko oddajnikov, saj jih je mogoče izklopiti v sprejemnem načinu (slika 7.10).

Razlaga simbolov na sliki 7.10

D (voznik) - oddajnik;
R (sprejemnik) - sprejemnik;
DI (driver input) - digitalni vhod oddajnika;
RO (izhod sprejemnika) - digitalni izhod sprejemnika;
DE (driver enable) - dovoljenje za upravljanje oddajnika;
RE (receiver enable) - dovoljenje za upravljanje sprejemnika;
A - neposredni diferencialni vhod/izhod;
B - inverzni diferencialni vhod/izhod;
Y - neposredni diferencialni izhod (RS-422);
Z - inverzni diferencialni izhod (RS-422).

Oglejmo si podrobneje oddajnik-sprejemnik RS-485. Digitalni izhod sprejemnika (RO) je priključen na vrata UART sprejemnika (RX). Digitalni vhod oddajnika (DI) v vrata oddajnika UART (TX). Ker sta sprejemnik in oddajnik povezana na diferencialni strani, mora biti oddajnik med sprejemom izklopljen, sprejemnik pa med oddajanjem. V ta namen se uporabljata krmilna vhoda - dovoljenje sprejemnika (RE) in dovoljenje oddajnika (DE). Ker je vhod RE inverzen, ga je mogoče povezati z DE in preklopiti sprejemnik in oddajnik z enim signalom iz katerega koli priključka krmilnika. Na ravni "0" - delo za sprejem, na "1" - za prenos (slika 7.11).

Sprejemnik, ki prejme potencialno razliko (UAB) na diferenčnih vhodih (AB), jih pretvori v digitalni signal na izhodu RO. Občutljivost sprejemnika je lahko drugačna, vendar proizvajalci sprejemno-sprejemnih čipov v dokumentacijo zapišejo zajamčeno mejno območje za prepoznavanje signala. Običajno so ti pragovi ±200 mV. To je, ko UAB > +200 mV - sprejemnik zazna "1", ko UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Vse naprave so povezane z enim dvožilnim kablom na enak način: direktni izhodi (A) na eno žico, inverzni izhodi (B) na drugo.

Vhodna impedanca sprejemnika na strani linije (RAB) je običajno 12 kΩ. Ker moč oddajnika ni neomejena, to ustvarja omejitev števila sprejemnikov, priključenih na linijo. Po specifikaciji RS-485 lahko oddajnik z upoštevanjem zaključnih uporov poganja do 32 sprejemnikov. Vendar pa obstaja več mikrovezij s povečano vhodno impedanco, ki vam omogoča, da na linijo povežete bistveno več kot 32 naprav.

Največja komunikacijska hitrost po specifikaciji RS-485 lahko doseže 10 Mbaud/s. Največja razdalja je 1200 metrov. Če je treba organizirati komunikacijo na razdalji več kot 1200 metrov ali priključiti več naprav, kot dovoljuje nosilnost oddajnika, se uporabljajo posebni repetitorji.

I2C vmesnik.

Ta vmesnik je predlagal Philips, ki ga je uporabil za organizacijo komunikacije med čipi v svojih televizorjih. I 2 C (okrajšava za Inter-Integrated Circuit) je dvosmerno asinhrono serijsko vodilo. Fizično je vodilo I 2 C sestavljeno iz dveh signalnih linij, od katerih je ena (SCL) namenjena prenosu taktnega signala, druga (SDA) pa izmenjavi podatkov. Za krmiljenje linij se uporabljajo izhodne stopnje z odprtim kolektorjem, zato morajo biti vodila vodila priključena na vir napajanja +5 V prek uporov z uporom 1 ... 10 kOhm, odvisno od fizične dolžine linij in hitrost prenosa podatkov. Dolžina povezovalnih linij v standardnem načinu lahko doseže 2 metra, hitrost prenosa podatkov je 100 kbit/s.

Vsi naročniki avtobusov so razdeljeni v dva razreda - "vodja" in "suženj". Glavna naprava generira signal ure (SCL). Samostojno lahko dostopa do vodila in naslavlja katero koli podrejeno napravo z namenom oddajanja ali sprejemanja informacij. Vse podrejene naprave »poslušajo« vodilo, da zaznajo svoj naslov in, ko ga prepoznajo, izvedejo predpisano operacijo. Poleg tega je možen tako imenovan način »MultiMaster«, ko je na vodilu nameščenih več nadrejenih naprav, ki si bodisi skupaj delijo skupne podrejene naprave, bodisi izmenično delujejo kot nadrejene, ko same sprožijo izmenjavo informacij, ali kot podrejene, ko čakajo na dostop iz druge glavne naprave. Način "MultiMaster" zahteva stalno spremljanje in prepoznavanje konfliktov. V tem pogledu je ta način težje implementirati (kar pomeni programsko implementacijo) in se posledično redkeje uporablja v realnih izdelkih.

V začetnem trenutku - v stanju pripravljenosti - sta obe liniji SCL in SDA v logičnem enotnem stanju (tranzistor izhodne stopnje odprtega kolektorja je zaprt). V oddajnem načinu (slika 7.12) se podatkovni bit SDA taktira z naraščajočim robom SCL. Informacije o liniji SDA se spremenijo, ko je linija SCL v ničelnem stanju. Podrejena naprava lahko "drži" linijo SCL v ničelnem stanju, na primer med obdelavo naslednjega prejetega bajta, medtem ko mora glavna naprava počakati, da se linija SCL sprosti, preden nadaljuje s prenosom informacij.

Za sinhronizacijo paketov vodila I 2 C se razlikujeta dva pogoja - "START" in "STOP", ki omejujeta začetek in konec informacijskega paketa (slika 7.13). Za kodiranje teh pogojev se uporablja sprememba stanja linije SDA z enim stanjem linije SCL, kar je pri prenosu podatkov nesprejemljivo. Pogoj "START" nastane, ko se na liniji SDA pojavi padajoči rob, ko je linija SCL v enem samem stanju, in obratno, pogoj "STOP" nastane, ko se na liniji SDA pojavi naraščajoči rob, ko je SCL linija je v enem samem stanju.

Prenos podatkov se začne na prvem naraščajočem robu na liniji SCL, ki meri najpomembnejši bit prvega informacijskega bajta. Vsak informacijski bajt (8 bitov) vsebuje 9 taktov linije SCL. V devetem ciklu sprejemna naprava izda potrditev (ACK) - padajoči rob, ki označuje sprejem podatkov. Upoštevati je treba, da je lahko vsak naročnik vodila, tako glavni kot podrejeni, ob različnih časih tako oddajnik kot sprejemnik in mora v skladu z načinom sprejeti ali izdati signal ACK, katerega odsotnost se razlaga kot napaka.

Za začetek operacije izmenjave podatkov glavna naprava na vodilu izda pogoj "START". Pogoju “START” sledi bajt z naslovom podrejene naprave (slika 7.14), sestavljen iz sedembitnega naslova naprave (biti 1...7) in enobitne zastavice operacije branja in pisanja - “ R/W” (bit 0). Bit R/W določa smer izmenjave, pri čemer 0 pomeni prenos podatkov od glavnega do podrejenega (slika 7.14a), 1 pa pomeni branje od podrejenega (slika 7.14b). Vsi biti na vodilu I 2 C se prenašajo po vrstnem redu od visokega do nizkega, to pomeni, da se 7. bit prenaša prvi, 0. zadnji. Naslovu lahko sledi en ali več informacijskih bajtov (v smeri, ki jo določa zastavica R/W), katerih biti uravnava glavni na vodilu SCL.

Ko izvaja operacijo branja, mora gostitelj ACK prebranega bajta, če želi prebrati naslednji bajt, in ne izdati ACK, če bo končal branje paketa (glejte sliko 7.14b).

Dovoljeno je nadaljevanje naslova podrejene naprave večkrat v enem prenosnem ciklu, to je oddajanje ponovljenega pogoja »START« brez predhodnega pogoja »STOP« (slika 7.14c).

Opozoriti je treba na nekatere značilnosti pomnilniških čipov, ki delujejo prek vmesnika I 2 C, in na postopke izmenjave podatkov z njimi. Prvič, obstojni podatkovni pomnilnik teh mikrovezij je razdeljen na pomnilniške strani, tako da se ob zapisu bajta celotna stran najprej prekopira v notranji RAM mikrovezja, kjer se spremeni želena celica. Po tem se stara stran izbriše in na njeno mesto napiše nova. Druga značilnost je, da morajo biti najpomembnejši štirje biti podrejenega naslova vedno enaki 1010. To zahtevo regulira sam Philips.

Vodilo 1-Wire uporablja samo en vodnik za komunikacijo in napajanje. Komunikacijski način je asinhroni in poldupleksni, ki strogo sledi vzorcu master-slave. Na isto vodilo je lahko hkrati priključena ena ali več pomožnih naprav. Na eno vodilo je lahko priključena samo ena glavna naprava.

Stanje nedejavnosti vodila ustreza visoki ravni, ki jo ustvari vlečni upor. Vrednost vlečnega upora je podana v dokumentaciji za podrejeni IC. Vsi čipi, povezani z vodilom, morajo biti sposobni proizvajati nizko raven. Če izhod mikrokontrolerja ne podpira treh stanj, je treba zagotoviti gonilnik, ki ima izhod z odprtim kolektorjem ali odprtim odtokom.

Prenos signala po vodilu 1-Wire je razdeljen na časovne reže po 60 µs. Na časovno režo se prenese le en bit podatkov. Podrejene naprave lahko imajo znatne razlike od nazivnih časovnih zakasnitev. Vendar pa to od vodje zahteva natančnejši čas, da zagotovi pravilno komunikacijo s podrejenimi, ki imajo različne časovne osnove.

Osnovni signali vodila.

Master sproži vsako komunikacijo na bitni ravni. To pomeni, da mora prenos vsakega bita, ne glede na smer, sprožiti glavni. To dosežemo z nizko nastavitvijo vodila, ki sinhronizira logiko vseh drugih naprav. Obstaja 5 glavnih ukazov za komunikacijo prek vodila 1-Wire: “Write log. 1«, »Pisanje dnevnika. 0”, “Preberi”, “Ponastavi” in “Prisotnost”.

Signal »Zapiši dnevnik. 1"

Signal »Zapiši dnevnik. 1" je prikazano na sl. 7.15. Glavna nastavi nizko raven za 1...15 µs. Po tem sprosti vodilo za preostanek časovne reže.

riž. 7.15 – Signal »Zapiši dnevnik. 1"

Signal »Zapiši dnevnik. 0"

Signal »Zapiši dnevnik. 0« je prikazano na sliki 7.16. Glavna enota ustvarja nizko raven za najmanj 60 µs, vendar ne dlje kot 120 µs.

Slika 7.16 – Signal »Zapiši dnevnik. 0"

Preberi signal

Signal "Read" je prikazan na sl. 7.17. Glavna nastavi nizko raven za 1...15 µs. Podrejena enota nato drži nizko vodilo, če želi oddati dnevnik. 0. Če je treba prenesti dnevnik. 1, potem preprosto sprosti linijo. Skeniranje vodila je treba izvesti znotraj 15 µ od nizke napetosti vodila. Gledano s strani nadrejenega, je signal "Read" v bistvu signal "Write log". 1". Dejansko notranje stanje podrejene naprave bo določeno s signalom "Record log". 1« ali »Branje«.

Slika 7.17 – Signal »Preberi«.

Signal za ponastavitev/prisotnost

Signala »Reset« in »Presence« sta prikazana na sliki 7.18. Upoštevajte, da so časovni intervali pulza različni. Glavna enota vleče nizko za 8 časovnih rež (480 µs) in nato sprosti vodilo. To dolgo obdobje nizkega stanja se imenuje signal "Reset".

Če je pomožna enota prisotna na vodilu, mora v 60 µs po tem, ko nadrejena sprosti vodilo, nastaviti nizko raven za najmanj 60 µs. Ta odziv se imenuje "prisotnost". Če takšen signal ni zaznan, mora glavni domnevati, da na vodilo ni priključenih nobenih naprav in da nadaljnja komunikacija ni mogoča.

USB (Universal Serial Bus) je bil razvit za hitro povezavo zunanjih naprav z osebnim računalnikom ter nato iskanje in namestitev potrebne programske opreme. Naprave z nizko porabo energije se napajajo neposredno prek vmesnika.

Standard USB pomeni prisotnost samo ene glavne (gostiteljske) naprave v omrežju. Poleg tega standard podpira do 127 podrejenih naprav v omrežju. Za razlikovanje med glavnimi in podrejenimi napravami so bili razviti različni tipi priključkov (slika 7.19): tip A za glavni in tip B za podrejeni. Sprejeto je, da je napetost 5 V prisotna samo na konektorju tipa A, ki je glavni konektor. Preostale naprave se napajajo neposredno iz njega.

Standard USB uporablja 4 oklopljene žice, od katerih dve prenašata moč (+5v & GND) (slika 7.19 in tabela 7.2). Druga dva predstavljata diferencialne podatkovne signale zvitega para. Uporabljena shema kodiranja NRZI(Non Return to Zero Invert) za prenos podatkov s sinhronizacijskim poljem za sinhronizacijo glavne in podrejene ure.

Standard USB 2.0 je uvedel standard On-The-Go (OTG), ki je uvedel Host Negotiation Protocol, ki omogoča, da se dve napravi USB dogovorita, kdo bo deloval kot glavni. To je namenjeno in omejeno na posamezne povezave od točke do točke, kot je mobilni telefon z osebnim računalnikom.

USB podpira "vročo" (plug'n'play) povezavo z dinamično naloženimi in nenaloženimi gonilniki. Uporabnik napravo preprosto priklopi in jo s tem poveže z vodilom. Gostitelj zazna povezavo, poizve novo vstavljeno napravo in naloži ustrezen gonilnik, pri čemer označi trenutek nalaganja s peščeno uro na zaslonu (če je gonilnik za USB napravo že nameščen v sistemu). Končnega uporabnika ne zanima prekinitev oz IRQ(prekinitve) in naslove vrat, niti o ponovnem zagonu računalnika (ponovni zagon ni potreben). Ko uporabnik konča z napravo USB, jo preprosto odstrani (ali odklopi kabel), gostitelj bo zaznal odsotnost naprave in samodejno odstranil gonilnik.

SB različica 1.1 podpira dve hitrosti - način polne hitrosti s hitrostjo 12 Mbit/s in način nizke hitrosti s hitrostjo 1,5 Mbit/s. Način 1,5 Mbit/s je počasnejši in manj občutljiv na EMI (motnje), kar zmanjša stroške feritnih kroglic in zmanjša zahteve glede kakovosti komponent.

Kabel vodila s polno hitrostjo je kabel s sukanim parom, zaščiten z oklopom in se lahko uporablja tudi za delovanje pri nizki hitrosti. Kabel za delovanje samo pri minimalni hitrosti (na primer za povezavo miške) je lahko poljuben in neoklopljen.

Standard USB 2.0 uvaja način visoke hitrosti s hitrostjo prenosa podatkov 480 Mbit/s.

Prenos podatkov.

Vse prenose podatkov prek vmesnika sproži gostitelj. Podatki se prenašajo v obliki paketov. Vmesnik USB uporablja več vrst paketov:

A) podpišite paket (paket žetonov) opisuje vrsto in smer prenosa podatkov, naslov naprave in serijsko številko končne točke (CT je naslovljivi del USB naprave); Paketi funkcij so na voljo v več vrstah: IN, VEN, SOF, NASTAVITI;

B) podatkovni paket (podatkovni paket) vsebuje posredovane podatke;

B) paket odobritev (rokovalni paket) je namenjen poročanju rezultatov prenosa podatkov; Obstaja več vrst koordinacijskih paketov: POTRDI, N.A.K., STOJNICA.

Prenos podatkov prek USB poteka na naslednji način:

Prvi paket, tako imenovani žeton, ustvari glavna naprava, da opiše vrsto podatkov, ki se prenašajo, operacijo prenosa (branje ali pisanje), naslov naprave in končno točko. Naslednji običajno preneseni je podatkovni paket, ki nosi uporabne informacije, ki mu sledi paket rokovanja, ki označuje, da so bili podatki ali žeton uspešno prejeti ali da je končna točka zastala ali ni na voljo za sprejem podatkov.

Končne točke v standardu USB so viri in ponori podatkov. Vse naprave morajo podpirati končno točko 0. To je končna točka, ki sprejema vse zahteve za nadzor in status med oštevilčenjem (zahteva za ročaj za določitev vrste priključene naprave) in dokler naprava deluje na vodilu.

Končne točke, oštevilčene od 1, se uporabljajo za prenos uporabniških informacij. Poglejmo si nekaj primerov.

Gonilnik naprave prenaša na končno točko glavne naprave EP1. Ker Ta naprava je glavna, potem gredo podatki v OUT medpomnilnik EP1. V tem primeru se pošlje žeton OUT, ki označuje, da so podatki pripravljeni za pošiljanje. Po prejemu tega žetona lahko podrejena naprava bere podatke iz medpomnilnika OUT.

Če mora pomožna naprava prenesti podatke na glavno, jih postavi v medpomnilnik IN. Ta vmesni pomnilnik bo hranil podatke, dokler nadrejeni ne pošlje žetona IN, ki zahteva podatke od končne točke. Vsi medpomnilniki končne točke so poimenovani glede na glavni, tj. Izhodni medpomnilnik podrejene naprave se imenuje IN, ker je vhodni medpomnilnik za glavno napravo.

Prenos podatkov iz ene končne točke v drugo poteka prek tokov. Tok – logična povezava med gostiteljem in končno točko(-ami).

Tokovi imajo tudi nabor parametrov, kot so vrsta prenosa (nadzor, masovni, iso ali prekinitev), smer pretoka podatkov in največja velikost paketa/medpomnilnika.

Na primer, privzeti tok je dvosmerni tok, sestavljen iz končne točke IN 0 in končne točke OUT 0 z nadzorom vrste prenosa.

USB definira dve vrsti cevi

A) Potočne cevi nimajo vnaprej določenega formata USB, tako da lahko pošljete katero koli vrsto podatkov skozi pretočno cev in obnovite podatke na drugem koncu. Podatkovni tokovi so zaporedni in imajo vnaprej določeno smer - IN ali OUT. Pretočne cevi podpirajo množične, izokrone in prekinitvene vrste prenosa. Pretočne cevi je mogoče nadzorovati iz gostitelja ali naprave.

B) Cevi za sporočila imajo vnaprej določen format USB. Nadzira jih gostitelj, sproži jih zahteva, ki jo pošlje gostitelj. Podatki se pošljejo v želeno smer, navedeno v zahtevku. Tako cevi za sporočila omogočajo prenos podatkov v obe smeri, podpirajo pa le prenose nadzora.

Standard USB opisuje štiri vrste prenosa podatkov:

A) Posredovanje nadzora (nadzorni prenos) se uporablja za konfiguracijo naprave in druge namene, specifične za napravo.

B) Pretakanje (prenos v razsutem stanju) se uporablja za prenos relativno velike količine informacij.

B) Prekinitev posredovanja (prekiniti prenos) se uporablja za prenos relativno majhne količine informacij, za katere je pomemben njihov pravočasen prenos. Ima omejeno trajanje in višjo prednost v primerjavi z drugimi vrstami prenosov.

D) Izohrono posredovanje (izohroni prenos) se imenuje tudi pretakanje v realnem času. Informacije, posredovane pri takem prenosu, zahtevajo realno časovno lestvico med njihovim ustvarjanjem, prenosom in sprejemom.

Pretočni prenosi značilen po zajamčenem prenosu podatkov brez napak med gostiteljem in funkcijo z zaznavanjem napak med prenosom in ponovnim zahtevanjem informacij. Ko je gostitelj pripravljen na sprejem podatkov iz funkcije, pošlje funkciji paket zastavice IN-plastična vrečka. Kot odgovor na to funkcija v fazi prenosa podatkov posreduje podatkovni paket gostitelju oz

SPI v Arduinu je to eden glavnih protokolov za izmenjavo podatkov med ploščo Arduino in povezanimi napravami. Skupaj z I2C in UART se ta protokol pogosto uporablja za številne vrste perifernih naprav, zato je poznavanje principov delovanja SPI nujno za vsakega inženirja Arduino. V tem članku si bomo na kratko ogledali osnovne principe, interakcijsko shemo in način povezovanja SPI senzorjev in zaslonov z Arduinom.

SPI je široko uporabljen protokol za prenos podatkov med mikrokrmilnikom (Master) in perifernimi napravami (Slave). V naših projektih se kot Master najpogosteje uporablja plošča Arduino. Vmesnik SPI je izumila in uporabljala Motorola, vendar je sčasoma postal industrijski standard. Glavna prednost dela s tem vmesnikom je njegova visoka hitrost in možnost povezovanja več naprav na eno podatkovno vodilo.

SPI zatiči in zatiči

Komunikacija prek vmesnika SPI arduino poteka med več napravami, ki se nahajajo blizu druga druge. Arduino plošče so opremljene z ločenimi zatiči za SPI. Seznanjanje poteka z uporabo štirih kontaktov:

  • MOSI – informacije se preko te linije prenašajo na podrejeno enoto od nadrejene enote.
  • MISO – uporablja se za prenos informacij na glavno enoto iz podrejene enote.
  • SCLK – ustvarjanje taktnih impulzov za sinhroni prenos podatkov.
  • SS – izbira podrejene naprave.

Interakcija naprav SPI

Interakcija naprave se začne, ko je izhod SS nizek.

Pred začetkom dela morate določiti:

  • Od katerega bita naj se začne premik - visokega ali nizkega? Vrstni red se prilagodi s funkcijo PI.setBitOrder().
  • Določite raven, na kateri naj bo črta SCK, če taktnega impulza ni. Nastavljivo s funkcijo SPI.setDataMode().
  • Izberite hitrost prenosa podatkov. Določeno s funkcijo SPI.setClockDivider().

Naslednji korak je določitev načina prenosa informacij. Izbira načina je določena s kazalniki, kot sta polarnost in faza taktnega impulza. Če je raven nizka, se zabeleži 0, visoka - 1. Skupaj so 4 načini:

  • Način 0 – SPI_MODE0: polarnost (CPOL) 0, faza (CPHA) 0.
  • Način 1: polarnost 0, faza 1.
  • Način 2: polarnost 1, faza 0.
  • Način 3: polarnost 1, faza 1.

Sprva je bil Arduino zasnovan tako, da najprej prenaša podatke z najpomembnejšim bitom, a preden začnete, morate to razjasniti v dokumentaciji. Načine lahko demonstrirate na sliki.

V vmesniku SPI sta možni dve vrsti povezav: neodvisna in kaskadna. V prvem primeru pri povezovanju nadrejeni naslovi vsakega podrejenega posebej, v drugem primeru pa pride do povezave enega za drugim, tj. kaskada.

Povezovanje SPI z Arduinom

Vsak model Arduino ima svoje SPI zatiče. Ti sklepi:

  • Uno: MOSI ustreza pinu 11 ali ICSP-4, MISO – 12 ali ICSP-1, SCK – 13 ali ICSP-3, SS (slave) – 10.
  • Mega1280 ali Mega2560: MOSI – 51 ali ICSP-4, MISO – 50 ali ICSP-1, SCK – 52 ali ICSP-3, SS (podrejeni) – 53.
  • Leonardo: MOSI – ICSP-4, MISO – ICSP-1, SCK – ICSP-3.
  • Dolg: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS (master) – 4, 10, 52.

Najnovejši krmilnik Arduino Due razširja uporabniške zmogljivosti in vam omogoča izvajanje več nalog kot drugi mikrokontrolerji. Na primer, mogoče je samodejno krmiliti podrejeno napravo in samodejno izbrati različne konfiguracije (hitrost ure, način itd.).

Knjižnica Arduino SPI

Za delo na Arduinu je bila ustvarjena ločena knjižnica, ki implementira SPI. Pred začetkom kode morate dodati #include omogočiti knjižnico.

Glavne funkcije:

  • begin() in end() – vklop in izklop dela. Med inicializacijo so na izhodu konfigurirane linije SCLK, MOSI in SS, ki pošiljajo nizko raven na SCLK, MOSI in visoko na SS. Funkcija end() ne spremeni nivojev vrstic; potrebna je za izklop bloka, povezanega z vmesnikom na plošči Arduino.
  • setBitOrder(order) – nastavitev vrstnega reda pošiljanja informacijskih bitov (MSBFIRST – prioriteta najpomembnejšega bita, LSBFIRST – prioriteta najmanj pomembnega bita).
  • setClockDivider(divider) – nastavitev glavnih frekvencnih delilnikov ure. Nastavite lahko delilnike 2, 4, 8, 16, 32, 64 in 128. Zapiše se takole - SPI_CLOCK_DIVn, kjer je n izbrani delitelj.
  • setDataMode(mode) – izberite enega od štirih načinov delovanja.
  • prenos(vrednost) – prenese bajt iz glavne naprave in vrne bajt, ki je prejet od podrejene naprave.
  • shiftIn(miso_pin, sclk_pin, bit_order) in shiftOut(mosi_pin, sclk_pin, order, value) – sprejemanje in pošiljanje podatkov, lahko povežete s poljubnimi digitalnimi pini, vendar jih morate pred tem sami konfigurirati.

Prednosti in slabosti SPI

Prednosti vmesnika SPI:

  • Sposobnost prenosa velikih podatkov, ki niso omejeni na 8 bitov.
  • Enostavna implementacija programske opreme.
  • Enostavnost izvedbe strojne opreme.
  • Potrebujemo manj pinov kot za vzporedne vmesnike.
  • Samo hitrost naprav omejuje največjo taktno frekvenco.

Napake:

  • Veliko število pinov v primerjavi z I2C.
  • Suženj ne more nadzorovati pretoka informacij.
  • Pomanjkanje standardnega protokola za odkrivanje napak.
  • Veliko število načinov za implementacijo vmesnika.
  • Pomanjkanje potrdila o prejemu informacij.

Primer uporabe Arduino SPI v projektu s tlačnim senzorjem

Za izvedbo projekta potrebujemo Arduino, senzor tlaka, maketo in žice. Primer povezave senzorja je prikazan na sliki.

Z uporabo senzorja SCP1000 je mogoče prepoznati parametre, kot sta tlak in temperatura, ter te vrednosti posredovati prek SPI.

Osnovni elementi programske skice

Najprej so registri senzorjev registrirani v kodi z uporabo nastavitve (setup(). Naprava vrne več vrednosti - eno v 19 bitih za prejeti tlak, drugo v 16 bitih za temperaturo. Po tem se prebereta dva bajta temperature in tlak v dveh stopnjah. Najprej program vzame tri najpomembnejše bite, nato naslednjih 16 bitov, nato pa z bitnim premikom ti dve vrednosti združita v eno. Realni tlak je 19-mestna vrednost, deljena s 4.

const int TLAK = 0x1F; // prva stopnja določanja tlaka (zaznani so trije najpomembnejši biti)

const int PRESSURE_LSB = 0x20; // druga stopnja, ki definira 16 bitov za pritisk

const int TEMPERATURA = 0x21; //16 bitov za temperaturo

Za branje podatkov o temperaturi in njihovo pretvorbo v stopinje Celzija se uporabi naslednji element kode:

int tempData = readRegister(0x21, 2);

float realTemp = (float)tempData / 20.0; // Če želite določiti dejansko vrednost temperature v Celziju, morate dobljeno število deliti z 20

Serial.print(“Temp

Serial.print(realTemp);

Branje tlačnih bitov in njihovo kombiniranje:

bajt pritisk_podatkov_visok = readRegister(0x1F, 1);

tlak_podatki_visok &= 0b00000111;

unsigned int pressure_data_low = readRegister(0x20, 2);

dolg tlak = ((podatki o_tlaku_visok<< 16) | pressure_data_low) / 4; //определение давления в Паскалях.

Kratki zaključki o SPI

SPI ščite in senzorje pogosto najdemo v projektih Arduino, zato morate vedeti, kako deluje ta protokol. Načeloma pri povezovanju naprav SPI ni nič zapletenega. Glavna stvar je pravilno povezati žice in uporabiti standardne metode knjižnice v pravem zaporedju. Za nekatere naprave, na primer kartice SD ali zaslone OLED, načeloma ni druge možnosti.

Dober dan! Današnji članek je majhna teoretična digresija, ki nam bo pomagala pri obvladovanju tečaja programiranja Arduino. Govorili bomo o vmesniku SPI. Kaj je in s čim se jedo, bomo poskušali ugotoviti v tem članku.

Za začetek definicija. SPI(Serial Peripheral Interface - serijski periferni vmesnik) je serijski standard za sinhroni prenos podatkov, ki je zasnovan za komunikacijo krmilnika z različnimi zunanjimi napravami. Ta vmesnik je preprost in priročen. Za Arduino je bila napisana posebna knjižnica za delo s SPI.

Komunikacija temelji na principu "master-slave". Krmilnik je običajno glavna naprava. Vse druge naprave, ki so povezane s sistemom, so podrejene. Podatki iz glavne naprave se prenašajo preko podatkovnega vodila do enega od izbranih podrejenih ali obratno od podrejene naprave do glavne sinhrono z uporabo signala glavne ure.

SPI podatkovno vodilo pinout je sestavljen iz 4 vrstic: MOSI, MISO, CS in SCLK:

  • MOSI(Master Out Slave In - glavni izhod, podrejeni vhod) ali preprosto S.I.– prenos podatkov poteka od glavne naprave do podrejene naprave.
  • MISO(Master In Slave Out - Glavni vhod, Slave izhod) ali preprosto SO– poteka prenos podatkov s podrejene naprave na glavno napravo.
  • C.S.(Chip Select - izbira čipa) oz SS(Izbira podrejenega — Izbira podrejenega) – izbira podrejene naprave.
  • SCLK(Serijska URA) ali preprosto SCK– prenos signala ure od nadrejenega do podrejenega.

Za prenos podatkov iz masterja v slave mora master nastaviti nizek nivo signala na CS liniji pomožnega, s katerim bo vzpostavil komunikacijo. Biti se nato prenesejo po liniji MOSI. Za zaustavitev prenosa podatkov vodja tako rekoč "sprosti" linijo CS in na njej nastavi visoko raven signala.

Za povezavo več podrejenih naprav na podatkovno vodilo SPI mora vsaka od njih imeti svojo lastno linijo CS. Ko je to storjeno, lahko glavna naprava izmenično "vleče" linije in preklaplja med podrejenimi napravami. Več podrejenih je mogoče povezati na različne načine: vzporedno ali zaporedno.

Vzporedna povezava podrejenih naprav preko podatkovnega vodila SPI

Posebnost vzporedne povezave več podrejenih naprav je, da se za ustvarjanje komunikacije uporabljajo skupne linije SCLK, MOSI in MISO. V tem primeru ima vsaka podrejena naprava svojo linijo SS(CS). Glavna naprava določi, s katerim »trenutnim podrejenim« vzpostaviti izmenjavo podatkov, tako da ustvari nizek nivo signala na ustrezni liniji SSn (kjer je n – 1,2 ...).

Če želite povezati n-število podrejenih naprav na krmilnik prek vmesnika SPI, jih morate dodeliti za ta namen n+3 zatiči mikrokrmilnika.

Serijska povezava podrejenih naprav na vodilo SPI

Kar zadeva serijsko povezavo podrejenih naprav, uporabljajo skupne linije SCLK in SS, izhod ene pa je povezan z vhodom druge. Linija MOSI glavnega je povezana s prvim podrejenim, linija MISO pa z zadnjim. Če gledate na to povezavo z vidika glavne naprave, potem je ena podrejena naprava povezana preko podatkovnega vodila SPI.

Treba je opozoriti na prednost te vrste povezave: lahko povežete n-to število naprav z uporabo samo 4 pinov mikrokontrolerja za ta namen.

Toliko zaenkrat, nadaljevanje...

Danes se začnemo seznanjati s pnevmatiko SPI (serijski periferni vmesnik).

To vodilo se zelo pogosto uporablja v elektroniki. Je zelo priročen, ker je sinhron in polni dupleks, zato se uporablja v številnih vezjih za komunikacijo med različnimi digitalnimi napravami - senzorji, krmilniki, gonilniki in drugimi napravami.

Drug pomemben dejavnik pri potrebi po našem seznanjanju z njim je, da je to vodilo strojno organizirano v krmilnikih AVR.

Poleg tega, če hočemo ali nočemo, že dolgo komuniciramo z vmesnikom SPI, takoj ko smo prvič začeli flashati naš krmilnik, saj se flasha preko tega vmesnika.

Zato bi rad to pnevmatiko bolje spoznal.

Odprimo tehnično dokumentacijo za krmilnik Atmega8, odprimo stran, kjer je prikazan pinout tega krmilnika in vidimo, da so od pinov 16 do 19 pini vodila SPI

Zdaj pa še nekaj o teh ugotovitvah

SS (izbira čipa)— to je krak za izbiro naprave. Če je podrejena naprava na tem pinu nastavljena na nizko raven, se bo ta naprava odzvala in izmenjala informacije prek vodila SPI; če je nastavljena na visoko, ne bo.

MOSI (glavni izhod podrejeni vhod)- To je izhodni pin glavne naprave in vhod pomožne naprave.

MISO (glavni vhod, podrejeni izhod)- nasprotno, izhod podrejenega, vhod nadrejenega.

SCK— sinhronizacijska noga. Vse naprave, ki sodelujejo pri izmenjavi informacij na tem vodilu, se napajajo z urnimi impulzi določene frekvence.

Tukaj je diagram izvedbe vodila SPI v krmilniku Atmega8

Kot vsak avtobus obstaja več registrov, ki hranijo določene informacije.

Zanima nas IZMENSKI REGISTAR, prek njega se izmenjujejo informacije. Takoj, ko pride do določenega roba na sinhronizacijskem zatiču, padajočega ali naraščajočega, odvisno od nastavitev, ti registri podrejene in glavne naprave izmenjajo informacije, in ne vse informacije, ampak samo en bit. Ti registri se bodo premaknili v levo in najpomembnejši biti iz vsakega registra bodo šli v najmanj pomembne bite istega registra povezane naprave. To pomeni, da bo podrejena enota posredovala svoj najpomembnejši bit preko zatiča MOSI do vodilnega, ki ga bo zaradi levega premika zapisal v izpraznjeni bit nižjega reda, podrejena enota pa bo svoj premaknjeni bit visokega reda prenesla skozi MISO. pripni na nižji bit vodilnega. Tako poteka izmenjava, to pomeni, da bodo v 8 polnih taktih v celoti zamenjali bajte

Takoj, ko je posredovanih vseh 8 bitov enega bajta informacije, nam določen register signalizira, da je ta proces zaključen. Oziroma določen košček nekega registra.

Tudi v blokovnem diagramu vidimo delilnik, katerega vhod sprejema taktne impulze, nato pa se, deljeni z določeno vrednostjo, pošljejo skozi verigo do zatiča SCK in od tam dovajajo pomožni napravi na zatiču isto ime. To zagotavlja sinhronizacijo naprav. Urna frekvenca je izbrana med najnižjo, ki jo podpirajo vse naprave, ki sodelujejo v izmenjavi.

Pravim množina, ker sta lahko na danem vezju več kot le dve napravi. Kako je to zagotovljeno, če naprave nimajo naslovov, vam bom zdaj povedal.

Obstaja več načinov izmenjave informacij med več napravami, to je, ko je na eno glavno napravo več podrejenih. Ogledali si bomo dva najpogostejša med njimi.

Prvi način je radialni (kliknite na sliko za povečavo)

Tu master usmerja podatke na določeno napravo, pri čemer na pinu SS vklopi logično 0. Pri tem načinu je možno izbrati samo eno napravo, potrebovali pa boste tudi več prostih pinov vrat krmilnika.

Obstaja še ena zanimiva metoda - obroč ali kaskada (kliknite na sliko za povečavo slike)

Tukaj vidimo, da so izbirne noge vse vzporedne in menjava poteka v krogu. Tako se hitrost zmanjša zaradi dejstva, da se krog prenosa poveča, vendar so pristaniške noge shranjene.

Vse to bomo podrobneje preučili v naslednjih lekcijah, ko bomo določene naprave uporabili v naših projektih.

No, zdi se, da z vezjem prenosa podatkov prek vodila SPI smo ugotovili.

Zdaj pa ugotovimo, kako nadzorovati ta proces na ravni strojnih registrov krmilnika AVR.

Te registre vidimo v blokovnem diagramu zgoraj na strani.

Atmega8 ima naslednje registre za servisiranje vodila SPI.

SPDR (register podatkov SPI)- podatkovni register, v blokovnem diagramu je DATA BUFFER. V ta register bomo vnesli bajt za njegov kasnejši prenos v podrejeno napravo, iz njega pa bomo prebrali bajt informacij, ki so prišle iz podrejene naprave. Prav tako ni nujno, da bo naš krmilnik glavna naprava. Nato bomo sestavili vezje dveh krmilnikov, od katerih bo eden podrejeni. V tem registru se torej nahaja bajt za pošiljanje in prejemanje.

SPCR (kontrolni register SPI)- kontrolni register

Ta register vključuje naslednje bite:

SPIE (omogočanje prekinitve SPI)- bit, ki omogoča prekinitve.

SPE (omogoči SPI)— bit, ki omogoča vodilo SPI.

DORD (vrstni red podatkov)— bit, ki nastavi vrstni red pošiljanja bitov Če je nastavljen na 1, se najprej pošlje najmanj pomemben bit, če je nastavljen na 0, se pošlje najpomembnejši bit.

MSTR (izbira glavnega/podrejenega)— bit, ki označuje napravo kot glavno ali podrejeno. Ko je ta bit nastavljen na 1, bo naprava glavna.

CPOL (Polariteta ure)— polarnost sinhronizacije, določa, na katerem robu sinhronizacijskega impulza se sproži stanje pripravljenosti

Če je ta bit 1, potem bomo imeli stanje pripravljenosti z naraščajočim robom, če je 0, pa z padajočim robom.

CPHA (faza ure)— bit, ki je odgovoren za fazo ure, to je, na katerem robu bo bit prenesen.

Poglejmo si diagrame prenosa podatkov glede na namestitev CPOL in CPHA

To je tako zanimiva odvisnost. Včasih v tehničnih lastnostih naprave včasih vidimo, da lahko na primer deluje v načinu SPI 0:0 in SPI 1:1, in ravno to se nanaša na nastavitev teh bitov.

SPR1, SPR0 (izbira takta SPI)- to so biti, odgovorni za vrednost sinhronizacijskega frekvenčnega delilnika; delujejo skupaj z bitom SPI2X ki se nahaja v statusnem registru. Je tudi krmilni, saj osem bitov v krmilnem registru ni zadostovalo za vse nastavitve, prostih v statusnem registru pa je veliko.

SPSR (register statusa SPI)- register stanja

SPI2X (dvojni SPI Speed ​​​​Bit)- bit, ki podvoji hitrost, deluje v povezavi z bitoma SPR1 in SPR0 kontrolnega registra.

Poglejmo odvisnost frekvence od teh treh bitov

SPIF (zastavica prekinitve SPI)— Prekinitvena zastavica. Čakamo, da se ta bit nastavi na ena. ko prejmemo bajt. Takoj, ko se bajt iz druge naprave popolnoma pojavi v našem medpomnilniku, bo ta zastavica nastavljena. Ta zastavica deluje samo, če je nastavljen bit, ki omogoča prekinitve, in če so omogočene globalne prekinitve.

WCOL (zapisovanje zastavice trka)— zastavica konflikta ali kolizije bo nastavljena, če med prenosom podatkov pride do konflikta bitov, če se med prenosom podatkov poskusi pisati v podatkovni register.

No, zdaj lahko rečemo, da smo se malo spoznali z vmesnikom SPI.

Oglejte si VIDEO vadnico(kliknite na sliko)

Ogledi objave: 6.294

Z ocenami od 10 Ohm do 1 MOhm);

  • povezovalne žice (na primer, to je dober komplet);
  • osebni računalnik z razvojnim okoljem Arduino IDE.
  • 1 Opis serije SPI vmesnik

    SPI - serijski periferni vmesnik ali "serijski periferni vmesnik" je sinhroni protokol za prenos podatkov za združevanje glavna naprava z periferne naprave (podrejene). Glavna naprava je pogosto mikrokrmilnik. Komunikacija med napravami poteka prek štirih žic, zato se SPI včasih imenuje "štirižični vmesnik". To so pnevmatike:

    Obstajajo štirje načini prenosa podatkov ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), ki jih povzroča kombinacija polarnosti taktnih impulzov (delujemo na VISOKI ali NIZKI ravni), Polariteta ure, CPOL in faza taktnih impulzov (sinhronizacija na naraščajočem ali padajočem robu taktnega impulza), Faza ure, CPHA.

    Slika pojasnjuje to tabelo.

    Vmesnik SPI ponuja več možnosti za povezovanje podrejenih naprav: neodvisen in kaskada. Ko je neodvisno priključena na vodilo SPI, glavna naprava dostopa do vsake podrejene naprave posebej. Pri kaskadni povezavi podrejene naprave delujejo ena za drugo, kot v kaskadi.


    Vrste povezav naprav za delovanje preko vmesnika SPI: neodvisna in kaskadna

    2 Implementacija vmesnika SPI na družinskih ploščah Arduino

    V Arduinu so vmesniška vodila SPI nameščena na določenih vratih. Vsaka plošča ima svojo dodelitev pinov. Za udobje so sklepi podvojeni in tudi ločeno ICSP priključek(V serijskem programiranju vezja programiranje naprave, vključene v vezje, z uporabo serijskega protokola). Upoštevajte, da priključek ICSP nima podrejenega izbirnega zatiča - SS, ker predpostavlja se, da bo Arduino uporabljen kot glavna naprava v omrežju. Če pa je potrebno, lahko dodelite kateri koli digitalni pin Arduino kot SS.

    Slika prikazuje standardno ujemanje zatičev z vodili SPI za Arduino UNO in Nano.


    3 Knjižnica za delo z vmesnikom SPI

    Za Arduino je bila napisana posebna knjižnica, ki implementira protokol SPI. Povezuje se takole: na začetku programa dodamo #vključi SPI.h.

    Če želite začeti uporabljati protokol SPI, morate nastaviti nastavitve in nato inicializirati protokol po postopku SPI.beginTransaction(). To lahko storite z enim navodilom: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    To pomeni, da inicializiramo protokol SPI na frekvenci 14 MHz, prenos podatkov poteka od MSB (najpomembnejši bit), v načinu SPI_MODE0.

    Po inicializaciji izberite podrejeno napravo tako, da premaknete ustrezen SS pin v stanje NIZKA.

    Nato podatke z ukazom prenesemo na podrejeno napravo SPI.transfer().

    Po prenosu vrnemo SS državi VISOKA.


    Delo s protokolom se zaključi z ukazom SPI.endTransaction().

    Priporočljivo je, da zmanjšate čas prenosa med navodili SPI.beginTransaction() in SPI.endTransaction(), da se izognete težavam, če druga naprava poskuša začeti prenos podatkov z drugačnimi nastavitvami.

    4 Priključitev premičnega registra na Arduino

    Oglejmo si praktično uporabo vmesnika SPI. LED diode bomo prižgali s krmiljenjem 8-bitnega premikalnega registra preko vodila SPI. Povežimo se z Arduinom premikalni register 74HC595. Na vsakega od 8 izhodov registra bomo prek omejevalnega upora priključili LED z nazivno vrednostjo 220 Ohmov. Diagram je prikazan na sliki.


    5 Skica za krmiljenje premičnega registra prek vmesnika SPI

    Napišimo takšno skico.

    #vključi const int pinSelect = 8; // registracija izberite pin void setup() ( SPI.begin(); // inicializacija vmesnika SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // izberite podrejene naprave (register) SPI.transfer(0); // počisti vsebino registra digitalWrite(pinSelect, HIGH); // konec prenosa Serial.begin(9600); } void loop() ( za (int i=0; i )

    Najprej povežimo knjižnico SPI in inicializirajmo vmesnik SPI. Opredelimo pin 8 kot podrejeni izbirni pin SS. Počistimo premikalni register tako, da mu pošljemo vrednost "0". Inicializirajte serijska vrata.

    Če želite osvetliti določeno LED s pomočjo premikalnega registra, morate na njen vhod uporabiti 8-bitno številko. Na primer, da bi prva LED zasvetila, dodamo binarno številko 00000001, za drugo - 00000010, za tretjo - 00000100 itd. Ta binarna števila, ko jih pretvorimo v decimalni številski sistem, tvorijo naslednje zaporedje: 1, 2, 4, 8, 16, 32, 64, 128 in so potence dvojke od 0 do 7.

    V skladu s tem v ciklu zanka() Glede na število LED diod preračunamo od 0 do 7. Funkcija pow (osnova, stopnja) Poveča 2 na potenco števca zanke. Mikrokontrolerji ne delujejo zelo natančno s številkami tipa "double", zato uporabljamo funkcijo zaokroževanja za pretvorbo rezultata v celo število krog(). In dobljeno številko prenesemo v register premika. Zaradi jasnosti monitor serijskih vrat prikazuje vrednosti, pridobljene med to operacijo: Enota "teče" skozi razelektritve - LED diode zasvetijo v valu.

    6 "Teče val" iz LED diod

    LED diode se prižgejo ena za drugo in opazujemo tekoči »val« luči. LED diode se krmilijo s pomočjo premičnega registra, na katerega smo se povezali preko vmesnika SPI. Posledično se za krmiljenje 8 LED diod uporabljajo samo 3 zatiči Arduino.Če bi LED diode priključili neposredno na digitalna vrata Arduino, bi morali za vsako LED uporabiti ločena vrata.

    Preučili smo najenostavnejši primer delovanja Arduina z vodilom SPI. V ločenem članku bomo podrobneje obravnavali delovanje več registrov premikov z neodvisnimi in kaskadnimi povezavami.