Proučavamo SPI sučelje i na Arduino povezujemo registar pomaka kojem ćemo pristupiti pomoću ovog protokola za kontrolu LED dioda.
Potrebno
- - Arduino;
- - registar smjene 74HC595;
- - 8 LED;
- - 8 otpornika od 220 Ohm.
Instrukcije
Korak 1
SPI - serijsko periferno sučelje ili "serijsko periferno sučelje" je sinkroni protokol za prijenos podataka za povezivanje glavnog uređaja s perifernim uređajima (slave). Master je često mikrokontroler. Komunikacija između uređaja vrši se preko četiri žice, zbog čega se SPI ponekad naziva i "četverožičnim sučeljem". Ove gume su:
MOSI (Master Out Slave In) - linija za prenos podataka od glavnog do pomoćnih uređaja;
MISO (Master In Slave Out) - dalekovod od slave do mastera;
SCLK (serijski sat) - sinhronizacijski impulsi takta koje generira master;
SS (Slave Select) - linija za odabir slave uređaja; kada je na liniji "0", slave "razumije" da mu se pristupa.
Postoje četiri načina prijenosa podataka (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), zbog kombinacije polariteta impulsa takta (radimo na VISOKOM ili NISKOM nivou), Polariteta sata, CPOL i faze impulsa takta (sinhronizacija) na rastućem ili padajućem rubu impulsa sata), Clock Phase, CPHA.
Na slici su prikazane dvije opcije za povezivanje uređaja koji koriste SPI protokol: neovisna i kaskadna. Kada se neovisno poveže na SPI magistralu, master komunicira sa svakim slave uređajem pojedinačno. S kaskadom - pomoćni uređaji se aktiviraju naizmjenično, u kaskadi.
Korak 2
U Arduinu, SPI sabirnice nalaze se na određenim lukama. Svaka ploča ima svoj vlastiti raspored pinova. Radi praktičnosti, pinovi se dupliciraju i postavljaju na zasebni ICSP (In Circuit Serial Programming) konektor. Imajte na umu da na ICSP konektoru - SS ne postoji pin za odabir slave pretpostavlja se da će se Arduino koristiti kao glavni na mreži. Ali ako je potrebno, bilo koji digitalni pin Arduina možete dodijeliti kao SS.
Slika prikazuje standardni raspored pinova na SPI magistrale za Arduino UNO i Nano.
Korak 3
Za Arduino je napisana posebna biblioteka koja implementira SPI protokol. Povezan je ovako: na početku programa dodajte #include SPI.h
Da biste započeli rad sa SPI protokolom, morate postaviti postavke, a zatim inicijalizirati protokol pomoću procedure SPI.beginTransaction (). To možete učiniti s jednom uputom: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
To znači da SPI protokol inicijaliziramo na frekvenciji od 14 MHz, prenos podataka ide, počevši od MSB-a (najznačajniji bit), u režimu "0".
Nakon inicijalizacije, odabiremo slave uređaj stavljajući odgovarajući SS pin u LOW stanje.
Zatim prenosimo podatke na slave uređaj pomoću naredbe SPI.transfer ().
Nakon prenosa vraćamo SS u VISOKO stanje.
Rad s protokolom završava naredbom SPI.endTransaction (). Poželjno je minimizirati vrijeme izvršenja prijenosa između instrukcija SPI.beginTransaction () i SPI.endTransaction (), tako da nema preklapanja ako drugi uređaj pokušava pokrenuti prijenos podataka koristeći različite postavke.
Korak 4
Razmotrimo praktičnu primjenu SPI sučelja. LED lampice ćemo upaliti upravljanjem 8-bitnog registra pomaka preko SPI sabirnice. Spojimo registar pomaka 74HC595 na Arduino. Na svaki od 8 izlaza povezujemo se preko LED diode (kroz ograničavajući otpor). Dijagram je prikazan na slici.
Korak 5
Napišimo takvu skicu.
Prvo, spojimo SPI biblioteku i inicijalizirajmo SPI sučelje. Definirajmo pin 8 kao slave odabir pin-a. Očistimo registar pomaka tako što ćemo mu poslati vrijednost "0". Inicijaliziramo serijski port.
Da biste osvijetlili određenu LED diodu pomoću registra pomaka, na njezin ulaz morate primijeniti 8-bitni broj. Na primjer, da bi se prva LED upalila, unosimo binarni broj 00000001, za drugu - 00000010, za treću - 00000100 itd. Ovi binarni brojevi u decimalnom zapisu tvore sljedeću sekvencu: 1, 2, 4, 8, 16, 32, 64, 128 i imaju potencijale dvoje od 0 do 7.
U skladu s tim, u petlji () prema broju LED-a preračunavamo od 0 do 7. Funkcija napona (baza, stepen) podiže 2 na snagu brojača ciklusa. Mikrokontroleri ne rade vrlo precizno s brojevima tipa "double", pa za pretvaranje rezultata u cijeli broj koristimo funkciju round (). I rezultirajući broj prenosimo u registar smjena. Radi preglednosti, monitor serijskog porta prikazuje vrijednosti koje se dobivaju tijekom ove operacije: jedna prolazi kroz znamenke - LED diode svijetle u valu.
Korak 6
LED diode se redom pale, a mi promatramo putujući "val" svjetla. LED diode kontroliraju se pomoću pomičnog registra, na koji smo se povezali preko SPI sučelja. Kao rezultat, samo 3 Arduino pina se koriste za pogon 8 LED dioda.
Proučili smo najjednostavniji primjer kako Arduino radi sa SPI sabirnicom. Povezanost registara smjena detaljnije ćemo razmotriti u posebnom članku.