- Što je SPI komunikacijski protokol?
- Kako SPI protokol djeluje?
- Razlika između I2C i SPI komunikacije
- SPI s PIC16F877A pomoću XC8 kompajlera:
- Objašnjenje datoteke SPI zaglavlja:
- Objašnjenje glavnog programa:
- Simulacija PIC-a s SPI programom za uklanjanje pogrešaka:
PIC mikrokontroleri su moćna platforma koju pruža mikročip za ugrađene projekte; njegova svestrana priroda omogućila mu je pronalazak načina za mnoge primjene, a tek treba puno porasti. Ako ste slijedili naše PIC vodiče, tada biste primijetili da smo već pokrivali širok raspon vodiča o PIC mikrokontroleru, počevši od samih osnova. U istom tijeku nastavljamo s učenjem komunikacijskih protokola dostupnih s PIC-om i kako ih koristiti. I2C smo već pokrili PIC mikrokontrolerom.
U velikom sustavu ugrađenih aplikacija niti jedan mikrokontroler ne može sam obavljati sve aktivnosti. U nekoj fazi vremena mora komunicirati s drugim uređajima za razmjenu informacija, postoji mnogo različitih vrsta komunikacijskih protokola za dijeljenje tih podataka, ali najčešće korišteni su USART, IIC, SPI i CAN. Svaki komunikacijski protokol ima svoju prednost i nedostatak. Usredotočimo se zasad na SPI protokol jer ćemo to naučiti u ovom vodiču.
Što je SPI komunikacijski protokol?
Izraz SPI označava " serijsko periferno sučelje ". Uobičajeni je komunikacijski protokol koji se koristi za slanje podataka između dva mikrokontrolera ili za čitanje / pisanje podataka sa senzora na mikrokontroler. Također se koristi za komunikaciju sa SD karticama, registrima pomaka, kontrolerima zaslona i mnogim drugim.
Kako SPI protokol djeluje?
SPI komunikacija sinhrona je komunikacija, što znači da djeluje uz pomoć takta koji se dijeli između dva uređaja koji razmjenjuju podatke. To je i full-duplex komunikacija jer može slati i primati podatke pomoću zasebne sabirnice. Za rad SPI komunikacije potrebno je 5 žica. Jednostavni SPI komunikacijski krug između glavnog i pomoćnog uređaja prikazan je u nastavku

Pet žica potrebnih za komunikaciju su SCK (serijski sat), MOSI (glavni izlaz za podređeni ulaz), MISO (glavni ulaz za podređeni izlaz) i SS (odabir za podređeni uređaj). SPI komunikacija uvijek se odvija samo između gospodara i roba. Gospodar može s njim povezati više robova. Master je odgovoran za generiranje takta i isti se dijeli sa svim robovima. Također sve komunikacije može pokrenuti samo master.
SCK pin (aka SCL-serijski sat) dijeli signal sata koji generira master sa podređenim uređajima. MOSI pin (aka SDA –Serial Data Out) koristi se za slanje podataka s glavnog računala na salve. MISO pin (aka SDI - Serial Data In) koristi se za dobivanje podataka od salve do glavnog. Također možete slijediti oznaku strelice na gornjoj slici da biste razumjeli kretanje podataka / signala. Napokon, SS pin (aka CS –Chip select) koristi se kada je na master povezan više od jednog pomoćnog modula. Ovo se može koristiti za odabir potrebnog slave. Uzorak kruga u kojem je više od jednog pomoćnog uređaja povezano s glavnim vodičem za SPI komunikaciju prikazano je u donjem krugu.

Razlika između I2C i SPI komunikacije
Već smo naučili I2C komunikaciju s PIC-om, pa moramo biti upoznati s tim kako I2C funkcionira i gdje ih možemo koristiti kao što se I2C može koristiti za povezivanje RTC modula. Ali sada, zašto nam treba SPI protokol kad već imamo I2C. Razlog su i komunikacije I2C i SPI prednosti na svoj način i stoga su specifične za primjenu.
U određenoj se mjeri može smatrati da I2C komunikacija ima neke prednosti u odnosu na SPI komunikaciju, jer I2C koristi manji broj pinova i postaje vrlo zgodan kada je na sabirnicu povezan veliki broj podređenih. No , nedostatak I2C je što ima istu magistralu za slanje i primanje podataka, a samim time je i usporen. Dakle, to je isključivo na temelju aplikacije za odlučivanje između SPI i I2C protokola za vaš projekt.
SPI s PIC16F877A pomoću XC8 kompajlera:
Dosta osnova, naučimo sada kako možemo koristiti SPI komunikaciju na mikrokontroleru PIC16F877A pomoću MPLABX IDE i XC8 kompajlera. Prije nego što počnemo jasno staviti do znanja da ovaj vodič govori samo o SPI u PIC16F877a pomoću XC8 kompajlera, postupak će biti isti i za druge mikrokontrolere, ali možda će biti potrebne male promjene. Također imajte na umu da za napredne mikrokontrolere poput serije PIC18F sam kompajler može imati ugrađenu biblioteku koja koristi SPI značajke, ali za PIC16F877A ništa slično ne postoji, pa napravimo ga sami. Ovdje objašnjena knjižnica bit će dana kao datoteka zaglavlja za preuzimanje na dnu koja se može koristiti za PIC16F877A za komunikaciju s drugim SPI uređajima.
U ovom uputstvu napisat ćemo mali program koji koristi SPI komunikaciju za pisanje i čitanje podataka sa SPI sabirnice. Zatim ćemo isto provjeriti pomoću Proteusove simulacije. Sav kod povezan s SPI registrima bit će napravljen unutar datoteke zaglavlja pod nazivom PIC16f877a_SPI.h. Na ovaj način ovu zaglavnu datoteku možemo koristiti u svim nadolazećim projektima u kojima je potrebna SPI komunikacija. A unutar glavnog programa koristit ćemo funkcije iz zaglavne datoteke. Kompletni kod zajedno sa zaglavnom datotekom možete preuzeti ovdje.
Objašnjenje datoteke SPI zaglavlja:
Unutar datoteke zaglavlja moramo inicijalizirati SPI komunikaciju za PIC16F877a. Kao i uvijek najbolje mjesto za početak je lista podataka PIC16F877A. Registri koji kontroliraju SPI komunikaciju za PIC16F8777a su SSPSTAT i SSPCON registar. O njima možete na stranicama 74 i 75 tablice.
Mnogo je opcija parametara koje treba odabrati tijekom inicijalizacije SPI komunikacije. Najčešće korištena opcija je da frekvencija takta bude postavljena na Fosc / 4, a radit će se u sredini, a sat će biti postavljen kao nizak u idealnom stanju. Dakle, mi također koristimo istu konfiguraciju za našu datoteku zaglavlja, možete ih lako promijeniti mijenjanjem odgovarajućih bitova.
SPI_Initialize_Master ()
SPI inicijalizira glavnu funkciju koristi se za pokretanje SPI komunikacije kao master. Unutar ove funkcije postavili smo odgovarajuće pinove RC5 i RC3 kao izlazne pinove. Zatim konfiguriramo SSPTAT i SSPCON registar za uključivanje SPI komunikacije
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // str 74/234 SSPCON = 0b00100000; // str 75/234 TRISC3 = 0; // Postavi kao izlaz za rob način }
SPI_Initialize_Slave ()
Ova se funkcija koristi za postavljanje mikrokontrolera na rad u slave načinu za SPI komunikaciju. Tijekom slave načina pin RC5 treba postaviti kao izlaz, a pin RC3 kao ulaz. SSPSTAT i SSPCON postavljeni su na isti način i za slave i za master.
void SPI_Initialize_Slave () { TRISC5 = 0; // SDO pin treba deklarirati kao izlaz SSPSTAT = 0b00000000; // str 74/234 SSPCON = 0b00100000; // str. 75/234 TRISC3 = 1; // Postavi kao van za glavni način rada }
SPI_Write (dolazni znak)
Funkcija SPI Write koristi se za upisivanje podataka u SPI sabirnicu. Informacije dobiva od korisnika putem ulazne varijable, a zatim ih koristi za prosljeđivanje u registar međuspremnika. SSPBUF će se izbrisati u uzastopnom impulsu sata, a podaci će se bit po bit slati u sabirnicu.
void SPI_Write (char dolazno) { SSPBUF = dolazno; // Zapiši podatke dane od korisnika u međuspremnik }
SPI_Ready2Read ()
Funkcija SPI spreman za čitanje koristi se za provjeru primaju li se podaci u SPI sabirnici u potpunosti i mogu li se pročitati. SSPSTAT registar ima bit koji se zove BF i koji će se postaviti nakon što podaci u potpunosti budu primljeni, pa provjeravamo je li postavljen taj bit ako nije postavljen, a zatim moramo pričekati dok se ne postavi za čitanje bilo čega iz SPI sabirnice.
nepotpisani SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; else return 0; }
SPI_Read ()
SPI Read koristi se za očitavanje podataka sa SPI sabirnice u mikrokontroler. Podaci prisutni u SPI sabirnici bit će pohranjeni u SSPBUF, moramo pričekati dok se kompletni podaci ne spreme u međuspremnik, a zatim ih možemo pročitati u varijablu. Provjeravamo BF bit SSPSTAT registra prije čitanja međuspremnika kako bismo bili sigurni da je prijem podataka dovršen.
char SPI_Read () // Pročitajte primljene podatke { while (! SSPSTATbits.BF); // Zadrži dok se ne postavi BF bit, kako bi bili sigurni da su čitani podaci vraćeni (SSPBUF); // povratak pročitanih podataka }
Objašnjenje glavnog programa:
Funkcije objašnjene u gornjem odjeljku bit će u zaglavnoj datoteci i mogu se pozvati u glavnu c datoteku. Pa napišimo mali program da provjerimo radi li SPI komunikacija. Jednostavno ćemo upisati malo podataka u SPI sabirnicu i pomoću simulacije proteusa provjeriti primaju li se isti podaci u SPI debuggeru.
Kao i uvijek započnite program postavljanjem konfiguracijskih bitova, a zatim je vrlo važno dodati datoteku zaglavlja koje smo upravo objasnili u program kao što je prikazano dolje
#include
Ako ste program otvorili iz zip datoteke preuzete gore, tada će datoteka zaglavlja biti zadana u direktoriju datoteke zaglavlja vaše datoteke projekta. Inače morate datoteku zaglavlja dodati ručno u svoj projekt, a nakon dodavanja datoteka projekta izgledat će ovako u nastavku

Unutar glavne datoteke moramo inicijalizirati PIC kao Master za SPI komunikaciju, a zatim ćemo u beskonačnu while petlju upisati slučajne tri heksadecimalne vrijednosti u SPI sabirnicu kako bismo provjerili primamo li iste tijekom simulacije.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __zakašnjenje_ms (100); SPI_Write (0X0F); __zakašnjenje_ms (100); SPI_Write (0X15); __zakašnjenje_ms (100); } }
Primijetite da su slučajne vrijednosti korištene u programu 0A, 0F i 15 i to su heksadecimalne vrijednosti pa bismo to trebali vidjeti tijekom simulacije. To je to što je kod završen, ovo je samo uzorak, ali možemo koristiti istu metodologiju za komunikaciju s drugim MCU-om ili s drugim senzorskim modulom koji radi na SPI protokolu.
Simulacija PIC-a s SPI programom za uklanjanje pogrešaka:
Sad kad je naš program spreman, možemo ga kompajlirati i nastaviti s simulacijom. Proteus ima lijepu praktičnu značajku nazvanu SPI program za otklanjanje pogrešaka , koji se može koristiti za nadgledanje podataka preko SPI sabirnice. Dakle, koristimo isto i gradimo sklop kao što je prikazano dolje.

Budući da u simulaciji postoji samo jedan SPI uređaj , ne koristimo SS pin, a kada se ne koristi, on bi trebao biti uzemljen kao što je gore prikazano. Samo učitajte hex datoteku u mikrokontroler PIC16F877A i kliknite gumb za reprodukciju da simulirate naš program. Jednom kada simulacija započne, dobit ćete skočni prozor koji prikazuje podatke u SPI sabirnici kao što je prikazano dolje

Pogledajmo bliže podatke koji dolaze i provjerimo jesu li isti kao oni koje smo napisali u našem programu.

Podaci se primaju istim redoslijedom koji smo napisali u našem programu i isti su istaknuti za vas. Također možete pokušati simulirati program za komunikaciju s dva PIC mikrokontrolera pomoću SPI protokola. Morate programirati jedan PIC kao master, a drugi kao slave. Sve potrebne datoteke zaglavlja za ovu svrhu već su dane u datoteci zaglavlja.
Ovo je samo uvid u ono što SPI može učiniti, također može čitati i pisati podatke na više uređaja. Više o SPI-u pokrivat ćemo u našim nadolazećim vodičima povezivanjem različitih modula koji rade s SPI protokolom.
Nadam se da ste razumjeli projekt i naučili nešto korisno iz njega. Ako sumnjate, objavite ih u odjeljku za komentare u nastavku ili koristite forume za tehničku pomoć.
Kompletni glavni kod naveden je u nastavku; datoteke zaglavlja sa svim kodovima možete preuzeti odavde
