- Ce este protocolul de comunicare SPI?
- Cum funcționează protocolul SPI?
- Diferența dintre comunicarea I2C și SPI
- SPI cu PIC16F877A folosind XC8 Compiler:
- Fișier antet SPI Explicație:
- Programul principal Explicație:
- Simularea PIC cu depanatorul SPI:
Microcontrolerele PIC sunt o platformă puternică oferită de microcip pentru proiecte încorporate; natura sa versatilă i-a permis să găsească căi în multe aplicații și este încă să crească mult. Dacă ați urmărit tutorialele noastre PIC, atunci ați fi observat că am acoperit deja o gamă largă de tutoriale pe microcontrolerul PIC începând de la elementele de bază. În același flux continuăm să învățăm protocoalele de comunicație disponibile cu PIC și cum să le folosim. Am acoperit deja I2C cu microcontroler PIC.
În vastul sistem de aplicații încorporate, niciun microcontroler nu poate efectua toate activitățile singur. La un moment dat, trebuie să comunice cu alte dispozitive pentru a partaja informații, există multe tipuri diferite de protocoale de comunicații pentru a partaja aceste informații, dar cele mai utilizate sunt USART, IIC, SPI și CAN. Fiecare protocol de comunicare are propriul avantaj și dezavantaj. Să ne concentrăm asupra Protocolului SPI pentru moment, deoarece asta vom învăța în acest tutorial.
Ce este protocolul de comunicare SPI?
Termenul SPI înseamnă „ Serial Peripheral Interface ”. Este un protocol comun de comunicare care este utilizat pentru a trimite date între două microcontrolere sau pentru a citi / scrie date de la un senzor la un microcontroler. Este, de asemenea, utilizat pentru a comunica cu carduri SD, registre de schimbare, controlere de afișare și multe altele.
Cum funcționează protocolul SPI?
Comunicarea SPI este o comunicare sincronă, adică funcționează cu ajutorul unui semnal de ceas care este partajat între cele două dispozitive care fac schimb de date. De asemenea, este o comunicare full-duplex, deoarece poate trimite și primi date folosind o magistrală separată. Comunicarea SPI necesită 5 fire pentru a funcționa. Un circuit simplu de comunicare SPI între un master și un slave este prezentat mai jos
Cele cinci fire necesare pentru comunicare sunt SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) și SS (Slave Select). Comunicarea SPI are loc întotdeauna numai între un maestru și un sclav. Un maestru poate avea mai mulți sclavi conectați la acesta. Maestrul este responsabil pentru generarea pulsului ceasului și același lucru este împărțit tuturor sclavilor. De asemenea, toate comunicările pot fi inițiate numai de către comandant.
Pinul SCK (cunoscut și ca ceas serial SCL) împarte semnalele de ceas generate de master cu sclavii. Pinul MOSI (alias SDA –Serial Data Out) este utilizat pentru a trimite datele de la master către salve. Pinul MISO (aka SDI - Serial Data In) este utilizat pentru a obține datele de la salvare la master. De asemenea, puteți urmări semnul săgeții din figura de mai sus pentru a înțelege mișcarea datelor / semnalului. În cele din urmă, pinul SS (alias CS –Chip select) este utilizat atunci când există mai multe module slave conectate la master. Aceasta poate fi utilizată pentru a selecta sclavul dorit. Un circuit de probă în care sunt conectați mai mulți sclavi cu masterul pentru comunicarea SPI este prezentat în circuitul de mai jos.
Diferența dintre comunicarea I2C și SPI
Am învățat deja comunicarea I2C cu PIC și, prin urmare, trebuie să fim familiarizați cu modul în care funcționează I2C și unde le putem folosi, cum ar fi I2C care poate fi utilizat pentru interfața modulului RTC. Dar acum, de ce avem nevoie de protocolul SPI când avem deja I2C. Motivul este că atât comunicațiile I2C, cât și cele SPI sunt avantaje în modurile sale și, prin urmare, sunt specifice aplicației.
Într-o măsură, comunicația I2C poate fi considerată a avea unele avantaje față de comunicarea SPI, deoarece I2C folosește un număr mai mic de pini și devine foarte la îndemână atunci când există un număr mare de sclavi conectați la magistrală. Dar dezavantajul I2C este că are aceeași magistrală pentru trimiterea și primirea de date și, prin urmare, este relativ lent. Deci, se bazează pur pe aplicație pentru a decide între protocolul SPI și protocolul I2C pentru proiectul dvs.
SPI cu PIC16F877A folosind XC8 Compiler:
Destul de elemente de bază, acum să învățăm cum putem folosi comunicarea SPI pe microcontrolerul PIC16F877A folosind compilatorul MPLABX IDE și XC8. Înainte de a începe clarificați că acest tutorial vorbește doar despre SPI în PIC16F877a folosind compilatorul XC8, procesul va fi același pentru alte microcontrolere, dar ar putea fi necesare modificări ușoare. De asemenea, amintiți-vă că pentru microcontrolerele avansate precum seria PIC18F, compilatorul în sine ar putea avea o bibliotecă încorporată pentru a utiliza caracteristicile SPI, dar pentru PIC16F877A nu există așa ceva, așa că haideți să construim unul singur. Biblioteca explicată aici va fi dată ca fișier antet pentru descărcare în partea de jos, care poate fi utilizată pentru PIC16F877A pentru a comunica cu alte dispozitive SPI.
În acest tutorial vom scrie un mic program care utilizează comunicația SPI pentru a scrie și citi date din magistrala SPI. Vom verifica apoi același lucru folosind simularea Proteus. Toate codurile legate de registrele SPI vor fi făcute în interiorul fișierului antet numit PIC16f877a_SPI.h. Astfel putem folosi acest fișier antet în toate proiectele noastre viitoare în care este necesară comunicarea SPI. Și în interiorul programului principal vom folosi doar funcțiile din fișierul antet. Codul complet împreună cu fișierul antet pot fi descărcate de aici.
Fișier antet SPI Explicație:
În interiorul fișierului antet trebuie să inițializăm comunicarea SPI pentru PIC16F877a. Ca întotdeauna cel mai bun loc pentru a începe este fișa tehnică PIC16F877A. Registrele care controlează comunicația SPI pentru PIC16F8777a sunt SSPSTAT și registrul SSPCON. Puteți afla despre acestea la pagina 74 și 75 a fișei tehnice.
Există multe opțiuni de parametri care trebuie alese în timpul inițializării comunicării SPI. Cea mai frecvent utilizată opțiune este frecvența ceasului setată la Fosc / 4 și se va face în mijloc, iar ceasul va fi setat ca scăzut la starea ideală. Deci, folosim aceeași configurație pentru fișierul nostru de antet, le puteți schimba cu ușurință schimbând biții respectivi.
SPI_Initialize_Master ()
Funcția SPI initialize Master este utilizată pentru a porni comunicarea SPI ca master. În interiorul acestei funcții setăm pinii respectivi RC5 și RC3 ca pini de ieșire. Apoi configurăm SSPTAT și registrul SSPCON pentru a activa comunicațiile SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Setare ca ieșire pentru modul slave }
SPI_Initialize_Slave ()
Această funcție este utilizată pentru a seta microcontrolerul să funcționeze în modul slave pentru comunicarea SPI. În modul slave, pinul RC5 trebuie setat ca ieșire, iar pinul RC3 trebuie setat ca intrare. SSPSTAT și SSPCON sunt setate în același mod atât pentru sclav, cât și pentru stăpân.
void SPI_Initialize_Slave () { TRISC5 = 0; // PIN-ul SDO trebuie declarat ca ieșire SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 1; // Setați ca în afară pentru modul master }
SPI_Write (caractere primite)
Funcția SPI Write este utilizată pentru a scrie date în magistrala SPI. Obține informațiile de la utilizator prin variabila de intrare și apoi le folosește pentru a trece la registrul tampon. SSPBUF va fi șters în impulsul de ceas consecutiv și datele vor fi trimise în autobuz bit cu bit.
void SPI_Write (char incoming) { SSPBUF = incoming; // Scrieți datele date de utilizator în buffer }
SPI_Ready2Read ()
Funcția SPI ready to Read este utilizată pentru a verifica dacă datele din magistrala SPI sunt recepționate complet și dacă pot fi citite. Registrul SSPSTAT are un bit numit BF care va fi setat odată ce datele au fost primite complet, așa că verificăm dacă acest bit este setat dacă nu este setat, atunci trebuie să așteptăm până când este setat să citească ceva din magistrala SPI.
nesemnat SPI_Ready2Read () { if (SSPSTAT & 0b00000001) returnează 1; altfel returnează 0; }
SPI_Read ()
Citirea SPI este utilizată pentru a citi datele din magistrala SPI în microcontroler. Datele prezente în magistrala SPI vor fi stocate în SSPBUF, trebuie să așteptăm până când datele complete sunt stocate în buffer și apoi le putem citi într-o variabilă. Verificăm bitul BF al registrului SSPSTAT înainte de a citi bufferul pentru a ne asigura că recepția datelor este completă.
char SPI_Read () // Citiți datele primite { while (! SSPSTATbits.BF); // Țineți până când bitul BF este setat, pentru a vă asigura că datele complete sunt citite return (SSPBUF); // returnează datele citite }
Programul principal Explicație:
Funcțiile explicate în secțiunea de mai sus vor fi în fișierul antet și pot fi apelate în fișierul principal c. Deci, să scriem un mic program pentru a verifica dacă comunicarea SPI funcționează. Vom scrie doar puține date în magistrala SPI și vom folosi simularea proteus pentru a verifica dacă aceleași date sunt primite în depanatorul SPI.
Ca întotdeauna începeți programul setând biții de configurare și apoi este foarte important să adăugați fișierul antet pe care tocmai l-am explicat în program așa cum se arată mai jos
#include
Dacă ați deschis programul din fișierul zip descărcat mai sus, în mod implicit fișierul antet va fi prezent în directorul fișierului antet al fișierului dvs. de proiect. Altfel, trebuie să adăugați fișierul antet manual în interiorul proiectului dvs., odată ce fișierele proiectului adăugate vor arăta așa mai jos
În fișierul principal trebuie să inițializăm PIC ca Master pentru comunicarea SPI și apoi într-o buclă infinită while vom scrie trei valori aleatoare hex în magistrala SPI pentru a verifica dacă primim aceleași în timpul simulării.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Observați că valorile aleatoare utilizate în program sunt 0A, 0F și 15 și sunt valori hex, așa că ar trebui să vedem aceleași în timpul simulării. Asta este, codul este gata, acesta este doar un eșantion, dar putem folosi aceeași metodologie pentru a comunica cu alte MCU sau cu alte module de senzori care funcționează pe protocolul SPI.
Simularea PIC cu depanatorul SPI:
Acum că programul nostru este gata îl putem compila și apoi putem continua cu simularea. Proteus are o caracteristică utilă, numită SPI debugger , care poate fi utilizată pentru a monitoriza datele printr-o magistrală SPI. Deci, folosim același lucru și construim un circuit așa cum se arată mai jos.
Deoarece există un singur dispozitiv SPI în simulare , nu folosim pinul SS și, atunci când nu este utilizat, ar trebui să fie împământat așa cum se arată mai sus. Încărcați fișierul hexagonal în microcontrolerul PIC16F877A și faceți clic pe butonul de redare pentru a simula programul nostru. Odată ce începe simularea, veți obține o fereastră pop-up care afișează datele în magistrala SPI așa cum se arată mai jos
Să aruncăm o privire mai atentă asupra datelor care vin și să verificăm dacă sunt aceleași cu cele pe care le-am scris în programul nostru.
Datele sunt primite în aceeași ordine pe care am scris-o în programul nostru și același lucru este evidențiat pentru dvs. De asemenea, puteți încerca să simulați un program pentru a comunica cu două microcontrolere PIC utilizând protocolul SPI. Trebuie să programați un PIC ca maestru și celălalt ca sclav. Toate fișierele antet necesare în acest scop sunt deja date în fișierul antet.
Aceasta este doar o privire asupra a ceea ce SPI poate face, poate citi și scrie date pe mai multe dispozitive. Vom acoperi mai multe despre SPI în tutorialele noastre viitoare prin interfațarea diferitelor module care funcționează cu protocolul SPI.
Sper că ați înțeles proiectul și ați învățat ceva util din acesta. Dacă aveți nelămuriri, postați-le în secțiunea de comentarii de mai jos sau folosiți forumurile pentru ajutor tehnic.
Codul principal complet a fost dat mai jos; puteți descărca fișiere antet cu tot codul de aici