Vi studerer SPI-grænsefladen og forbinder et skiftregister til Arduino, som vi får adgang til ved hjælp af denne protokol til at styre lysdioderne.
Nødvendig
- - Arduino;
- - skiftregister 74HC595;
- - 8 lysdioder;
- - 8 modstande på 220 Ohm.
Instruktioner
Trin 1
SPI - Serial Peripheral Interface eller "Serial Peripheral Interface" er en synkron dataoverførselsprotokol til grænseflade mellem en masterenhed og perifere enheder (slave). Mesteren er ofte en mikrocontroller. Kommunikation mellem enheder udføres over fire ledninger, hvorfor SPI undertiden kaldes en "firetrådsgrænseflade". Disse dæk er:
MOSI (Master Out Slave In) - datatransmissionslinje fra master til slaveenheder;
MISO (Master In Slave Out) - transmissionslinje fra slave til master;
SCLK (Serial Clock) - synkroniseringsurimpulser genereret af masteren;
SS (Slave Select) - linje til valg af slaveenhed; når på linjen "0", "forstår" slaven, at den bliver adgang.
Der er fire tilstande til dataoverførsel (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3) på grund af kombinationen af urpuls polaritet (vi arbejder på HIGH eller LOW niveau), Clock Polarity, CPOL og fasen af urimpulser (synkronisering på den stigende eller faldende kant af urimpulsen), Urfase, CPHA.
Figuren viser to muligheder for tilslutning af enheder ved hjælp af SPI-protokollen: uafhængig og cascading. Ved uafhængig forbindelse til SPI-bussen kommunikerer masteren individuelt med hver slave. Med en kaskade - slaveenheder udløses skiftevis i en kaskade.
Trin 2
I Arduino er SPI-busser i specifikke porte. Hver tavle har sin egen pin-tildeling. For nemheds skyld duplikeres stifterne og placeres på et separat ICSP-stik (In Circuit Serial Programming). Bemærk, at der ikke er nogen slave-valgstift på ICSP-stikket - SS, da det antages, at Arduino vil blive brugt som master på netværket. Men hvis det er nødvendigt, kan du tildele enhver digital pin fra Arduino som en SS.
Figuren viser standard tildelingen af stifterne til SPI-busser til Arduino UNO og Nano.
Trin 3
Der er skrevet et specielt bibliotek til Arduino, der implementerer SPI-protokollen. Det er forbundet således: I starten af programmet skal du tilføje #include SPI.h
For at begynde at arbejde med SPI-protokollen skal du indstille indstillingerne og derefter initialisere protokollen ved hjælp af SPI.beginTransaction () -proceduren. Du kan gøre dette med en instruktion: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
Dette betyder, at vi initialiserer SPI-protokollen med en frekvens på 14 MHz, dataoverførsel går, startende fra MSB (mest signifikant bit), i "0" -tilstand.
Efter initialisering vælger vi slaveenheden ved at sætte den tilsvarende SS-pin i LAV tilstand.
Derefter overfører vi dataene til slaveenheden med kommandoen SPI.transfer ().
Efter transmission returnerer vi SS til HIGH-tilstand.
Arbejde med protokollen slutter med kommandoen SPI.endTransaction (). Det er ønskeligt at minimere udførelsestiden for overførslen mellem SPI.beginTransaction () og SPI.endTransaction () instruktionerne, så der ikke er nogen overlapning, hvis en anden enhed forsøger at initialisere dataoverførsel ved hjælp af forskellige indstillinger.
Trin 4
Lad os overveje den praktiske anvendelse af SPI-grænsefladen. Vi tænder lysdioderne ved at styre 8-bit skifteregistret via SPI-bussen. Lad os forbinde 74HC595 skiftregisteret til Arduino. Vi forbinder til hver af de 8 udgange via en LED (gennem en begrænsende modstand). Diagrammet er vist i figuren.
Trin 5
Lad os skrive sådan en skitse.
Lad os først forbinde SPI-biblioteket og initialisere SPI-grænsefladen. Lad os definere pin 8 som slave-valg pin. Lad os rydde skiftregisteret ved at sende værdien "0" til det. Vi initialiserer den serielle port.
For at tænde en bestemt LED ved hjælp af et skiftregister skal du anvende et 8-bit nummer på dets input. For eksempel, for at den første LED skal lyse, fodrer vi det binære tal 00000001, for den anden - 00000010, for den tredje - 00000100 osv. Disse binære tal i decimalnotation danner følgende rækkefølge: 1, 2, 4, 8, 16, 32, 64, 128 og er kræfter på to fra 0 til 7.
Følgelig genberegner vi i sløjfen () med antallet af lysdioder fra 0 til 7. Pow (base, grad) -funktionen hæver 2 til cyklustællerens effekt. Microcontrollers fungerer ikke meget nøjagtigt med tal af "dobbelt" type, så for at konvertere resultatet til et heltal bruger vi funktionen round (). Og vi overfører det resulterende nummer til skiftregisteret. For at gøre klarheden viser den serielle portmonitor de værdier, der opnås under denne operation: man løber gennem cifrene - LED'erne lyser i en bølge.
Trin 6
Lysdioderne lyser op igen, og vi ser en vandrende "bølge" af lys. Lysdioderne styres ved hjælp af et skifteregister, som vi tilsluttede via SPI-grænsefladen. Som et resultat bruges kun 3 Arduino-ben til at drive 8 lysdioder.
Vi har studeret det enkleste eksempel på, hvordan en Arduino fungerer med en SPI-bus. Vi vil overveje forbindelsen af skiftregistre mere detaljeret i en separat artikel.