Studiem interfața SPI și conectăm un registru de schimbare la Arduino, pe care îl vom accesa folosind acest protocol pentru a controla LED-urile.
Necesar
- - Arduino;
- - registru schimbare 74HC595;
- - 8 LED-uri;
- - 8 rezistențe de 220 Ohm.
Instrucțiuni
Pasul 1
SPI - Serial Peripheral Interface sau "Serial Peripheral Interface" este un protocol de transfer de date sincron pentru interfațarea unui dispozitiv master cu dispozitive periferice (slave). Maestrul este adesea un microcontroler. Comunicarea între dispozitive se realizează pe patru fire, motiv pentru care SPI este uneori denumită „interfață cu patru fire”. Aceste anvelope sunt:
MOSI (Master Out Slave In) - linie de transmisie a datelor de la master la dispozitivele slave;
MISO (Master In Slave Out) - linie de transmisie de la slave la master;
SCLK (Serial Clock) - impulsuri de sincronizare a ceasului generate de master;
SS (Slave Select) - linia de selecție a dispozitivului slave; când este pe linia „0”, sclavul „înțelege” că este accesat.
Există patru moduri de transfer de date (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), datorită combinației de polaritate a impulsului de ceas (lucrăm la nivelul HIGH sau LOW), Polarity Clock, CPOL și faza impulsurilor de ceas (sincronizare pe marginea crescătoare sau descendentă a pulsului ceasului), Faza ceasului, CPHA.
Figura prezintă două opțiuni pentru conectarea dispozitivelor utilizând protocolul SPI: independent și în cascadă. Când este conectat independent la magistrala SPI, comandantul comunică individual cu fiecare sclav. Cu o cascadă - dispozitivele slave sunt declanșate alternativ, în cascadă.
Pasul 2
În Arduino, autobuzele SPI sunt pe porturi specifice. Fiecare placă are propriile atribuții de pin. Pentru comoditate, pinii sunt duplicați și așezați pe un conector ICSP (In Circuit Serial Programming) separat. Vă rugăm să rețineți că nu există un pin de selectare a sclavului pe conectorul ICSP - SS, deoarece se presupune că Arduino va fi folosit ca master în rețea. Dar, dacă este necesar, puteți atribui orice pin digital al Arduino ca SS.
Figura prezintă atribuirea standard a pinilor la autobuzele SPI pentru Arduino UNO și Nano.
Pasul 3
A fost scrisă o bibliotecă specială pentru Arduino care implementează protocolul SPI. Este conectat astfel: la începutul programului, adăugați #include SPI.h
Pentru a începe să lucrați cu protocolul SPI, trebuie să setați setările și apoi să inițializați protocolul utilizând procedura SPI.beginTransaction (). Puteți face acest lucru cu o singură instrucțiune: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
Aceasta înseamnă că inițializăm protocolul SPI la o frecvență de 14 MHz, transferul de date merge, începând de la MSB (cel mai semnificativ bit), în modul „0”.
După inițializare, selectăm dispozitivul slave punând pinul SS corespunzător în starea LOW.
Apoi transferăm datele pe dispozitivul slave cu comanda SPI.transfer ().
După transmisie, revenim SS la starea HIGH.
Lucrul cu protocolul se termină cu comanda SPI.endTransaction (). Este de dorit să minimizați timpul de execuție al transferului între instrucțiunile SPI.beginTransaction () și SPI.endTransaction (), astfel încât să nu existe suprapunere dacă un alt dispozitiv încearcă să inițializeze transferul de date folosind diferite setări.
Pasul 4
Să luăm în considerare aplicația practică a interfeței SPI. Vom aprinde LED-urile prin controlul registrului de schimbare pe 8 biți prin magistrala SPI. Să conectăm registrul de schimbare 74HC595 la Arduino. Ne conectăm la fiecare dintre cele 8 ieșiri printr-un LED (printr-un rezistor de limitare). Diagrama este prezentată în figură.
Pasul 5
Să scriem o astfel de schiță.
Mai întâi, să conectăm biblioteca SPI și să inițializăm interfața SPI. Să definim pinul 8 ca pinul de selecție a sclavilor. Să ștergem registrul de schimbare trimițându-i valoarea „0”. Inițializăm portul serial.
Pentru a aprinde un LED specific utilizând un registru de schimbare, trebuie să aplicați un număr de 8 biți la intrarea sa. De exemplu, pentru ca primul LED să se aprindă, alimentăm numărul binar 00000001, pentru al doilea - 00000010, pentru al treilea - 00000100 etc. Aceste numere binare în notație zecimală formează următoarea secvență: 1, 2, 4, 8, 16, 32, 64, 128 și sunt puteri de două de la 0 la 7.
În consecință, în bucla () după numărul de LED-uri, recalculăm de la 0 la 7. Funcția pow (bază, grad) crește 2 la puterea contorului de cicluri. Microcontrolerele nu funcționează foarte precis cu numere de tip „dublu”, așa că pentru a converti rezultatul într-un număr întreg, folosim funcția round (). Și transferăm numărul rezultat în registrul de schimbare. Pentru claritate, monitorul portului serial afișează valorile care sunt obținute în timpul acestei operații: unul trece prin cifre - LED-urile se aprind într-o undă.
Pasul 6
LED-urile se aprind la rândul lor și observăm o „undă” de lumini călătoare. LED-urile sunt controlate folosind un registru de schimbare, la care ne-am conectat prin interfața SPI. Ca urmare, doar 3 pini Arduino sunt folosiți pentru a conduce 8 LED-uri.
Am studiat cel mai simplu exemplu despre cum funcționează un Arduino cu un autobuz SPI. Vom lua în considerare conexiunea registrelor de schimbare mai detaliat într-un articol separat.