- Kaj je SPI komunikacijski protokol?
- Kako deluje protokol SPI?
- Razlika med komunikacijo I2C in SPI
- SPI s PIC16F877A z uporabo prevajalnika XC8:
- Pojasnilo datoteke SPI glave:
- Pojasnilo glavnega programa:
- Simulacija PIC s programom za iskanje napak SPI:
Mikrokrmilniki PIC so zmogljiva platforma, ki jo zagotavlja mikročip za vdelane projekte; njegova vsestranska narava mu je omogočila, da je našel pot do številnih aplikacij in še ni veliko zrasel. Če bi sledili našim vadnicam PIC, bi opazili, da smo že zajeli široko paleto vadnic o mikrokrmilniku PIC, že od samih osnov. V istem toku nadaljujemo s spoznavanjem komunikacijskih protokolov, ki so na voljo s PIC, in kako jih uporabljati. I2C smo že pokrili z mikrokrmilnikom PIC.
V obsežnem sistemu vdelanih aplikacij noben mikrokrmilnik ne more sam izvajati vseh dejavnosti. V določeni fazi časa mora komunicirati z drugimi napravami za izmenjavo informacij, obstaja veliko različnih vrst komunikacijskih protokolov za izmenjavo teh informacij, najpogosteje pa se uporabljajo USART, IIC, SPI in CAN. Vsak komunikacijski protokol ima svojo prednost in slabost. Zaenkrat se osredotočimo na protokol SPI, saj se bomo tega naučili v tej vadnici.
Kaj je SPI komunikacijski protokol?
Izraz SPI pomeni " serijski periferni vmesnik ". To je pogost komunikacijski protokol, ki se uporablja za pošiljanje podatkov med dvema mikrokrmilnikoma ali za branje / zapisovanje podatkov s senzorja na mikrokrmilnik. Uporablja se tudi za komunikacijo s SD karticami, registri premikov, krmilniki zaslona in še veliko več.
Kako deluje protokol SPI?
Komunikacija SPI je sinhrona komunikacija, kar pomeni, da deluje s pomočjo urnega signala, ki si ga delita dve napravi, ki si izmenjujeta podatke. To je tudi dupleksna komunikacija, ker lahko pošilja in prejema podatke z ločenim vodilom. Sporočilo SPI zahteva 5 žic za delovanje. Preprosto komunikacijsko vezje SPI med glavno in pomožno enoto je prikazano spodaj
Pet komunikacijskih žic, potrebnih za komunikacijo, je SCK (serijska ura), MOSI (glavni izhod podrejenega vhoda), MISO (glavni vhod podrejenega izhoda) in SS (izbirni podrejeni element). Komunikacija SPI vedno poteka le med glavnim in pomožnim. Poveljnik ima lahko več sužnjev. Poveljnik je odgovoren za generiranje urnega impulza in je enak vsem podrejenim. Vse komunikacije lahko sproži samo poveljnik.
Zatič SCK (aka SCL-serijska ura) deli signal ure, ki ga ustvari poveljnik, s podrejenimi napravami. Zatič MOSI (aka SDA –Serial Data Out) se uporablja za pošiljanje podatkov iz glavne enote v salvo. MISO zatič (aka SDI - Serial Data In) se uporablja za pridobivanje podatkov od salve do glavne enote. Za razumevanje gibanja podatkov / signala lahko sledite tudi puščici na zgornji sliki. Nazadnje se SS-zatič (aka CS –Chip select) uporabi, kadar je na glavno enoto priključenih več podrejenih modulov. To lahko uporabite za izbiro zahtevanega pomožnega. V spodnjem vezju je prikazan vzorec vezja, kjer je z glavno enoto za komunikacijo SPI priključenih več pomožnih naprav.
Razlika med komunikacijo I2C in SPI
I2C komunikacije s PIC smo se že naučili, zato moramo biti seznanjeni s tem, kako I2C deluje in kje jih lahko uporabljamo, kot je I2C mogoče uporabiti za vmesnik RTC modula. Zdaj pa, zakaj potrebujemo protokol SPI, ko že imamo I2C. Razlog je v tem, da sta komunikacija I2C in SPI prednosti na svoj način in je zato odvisna od aplikacije.
Šteje se, da ima komunikacija I2C nekaj prednosti pred komunikacijo SPI, ker I2C uporablja manj števila pinov in je zelo priročen, ko je na vodilo priključeno veliko število podrejenih naprav. Toda pomanjkljivost I2C je, da ima isto vodilo za pošiljanje in sprejemanje podatkov, zato je razmeroma počasen. Torej zgolj na podlagi aplikacije se lahko odločite med protokolom SPI in I2C za svoj projekt.
SPI s PIC16F877A z uporabo prevajalnika XC8:
Dovolj osnov, zdaj se naučimo, kako lahko uporabimo komunikacijo SPI na mikrokrmilniku PIC16F877A s pomočjo prevajalnika MPLABX IDE in XC8. Preden začnemo jasno povedati, da ta vadnica govori samo o SPI v PIC16F877a z uporabo prevajalnika XC8, bo postopek enak za druge mikrokrmilnike, vendar bodo morda potrebne manjše spremembe. Ne pozabite tudi, da ima lahko za napredne mikrokrmilnike, kot je serija PIC18F, sam prevajalnik vgrajeno nekaj knjižnice za uporabo funkcij SPI, toda za PIC16F877A nič takega ne obstaja, zato ga zgradimo sami. Knjižnica, ki je tukaj razložena, bo na dnu dana kot datoteka z glavo, ki jo lahko PIC16F877A uporablja za komunikacijo z drugimi napravami SPI.
V tej vadnici bomo napisali majhen program, ki uporablja SPI komunikacijo za pisanje in branje podatkov iz vodila SPI. Nato bomo isto preverili s pomočjo Proteusove simulacije. Vsa koda, povezana z registri SPI, bo narejena znotraj glave datoteke, imenovane PIC16f877a_SPI.h. Tako lahko to datoteko glave uporabimo v vseh prihajajočih projektih, pri katerih je potrebna komunikacija SPI. In znotraj glavnega programa bomo uporabili samo funkcije iz glave datoteke. Celotno kodo skupaj z glavo lahko prenesete od tukaj.
Pojasnilo datoteke SPI glave:
Znotraj glave datoteke moramo inicializirati komunikacijo SPI za PIC16F877a. Kot vedno je najboljše mesto za začetek podatkovni list PIC16F877A. Registra, ki nadzorujeta komunikacijo SPI za PIC16F8777a, je SSPSTAT in SSPCON Register. O njih lahko preberete na straneh 74 in 75 v obrazcu.
Med inicializacijo komunikacije SPI je treba izbrati veliko možnosti parametrov. Najpogosteje uporabljena možnost je, da bo frekvenca ure nastavljena na Fosc / 4 in bo izvedena na sredini, ura pa bo v idealnem stanju nastavljena na nizko. Torej uporabljamo isto konfiguracijo za našo datoteko glave, tako da jih lahko enostavno spremenite s spreminjanjem ustreznih bitov.
SPI_Initialize_Master ()
Funkcija SPI inicializira glavno funkcijo se uporablja za zagon komunikacije SPI kot glavna. Znotraj te funkcije nastavimo ustrezna zatiča RC5 in RC3 kot izhodna zatiča. Nato konfiguriramo SSPTAT in register SSPCON, da vklopimo komunikacijo SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // str 74/234 SSPCON = 0b00100000; // str 75/234 TRISC3 = 0; // Komplet kot izhod pomožnem načinu }
SPI_Initialize_Slave ()
Ta funkcija se uporablja za nastavitev mikrokrmilnika v podrejenem načinu za komunikacijo SPI. V podrejenem načinu je treba pin RC5 nastaviti kot izhod, pin RC3 pa kot vhod. SSPSTAT in SSPCON sta nastavljena na enak način za podrejeno enoto in glavno enoto.
void SPI_Initialize_Slave () { TRISC5 = 0; // SDO pin je treba deklarirati kot izhod SSPSTAT = 0b00000000; // str 74/234 SSPCON = 0b00100000; // str 75/234 TRISC3 = 1; // Nastavi kot v načinu za glavni način }
SPI_Write (dohodni znak)
Funkcija SPI Write se uporablja za zapisovanje podatkov v vodilo SPI. Podatke od uporabnika dobi prek spremenljivke dohodni in jih nato uporabi za posredovanje v register medpomnilnika. SSPBUF bo izbrisan v zaporednem impulzu ure in podatki se bodo po bitu pošiljali v vodilo.
void SPI_Write (char dohodno) { SSPBUF = dohodno; // Zapiši uporabnikove podatke v medpomnilnik }
SPI_Ready2Read ()
Funkcija SPI ready to Read se uporablja za preverjanje, ali so podatki v vodilu SPI v celoti sprejeti in ali jih je mogoče prebrati. Register SSPSTAT ima bit, imenovan BF, ki se nastavi, ko so podatki prejeti v celoti, zato preverimo, ali je ta bit nastavljen, če ni nastavljen, potem moramo počakati, da se nastavi, da lahko prebere kar koli iz vodila SPI.
nepodpisan SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; sicer vrne 0; }
SPI_Read ()
SPI Read se uporablja za branje podatkov iz vodila SPI v mikrokrmilnik. Podatki v vodilu SPI bodo shranjeni v SSPBUF, počakati moramo, da se celotni podatki shranijo v medpomnilnik, nato pa jih lahko preberemo v spremenljivko. Pred branjem medpomnilnika preverimo bit BF registra SSPSTAT, da zagotovimo, da je sprejem podatkov zaključen.
char SPI_Read () // Preberite prejete podatke { while (! SSPSTATbits.BF); // Zadrži, dokler ni nastavljen bit BF, da se prepričate, da so celotni podatki prebrani, vrnitev (SSPBUF); // vrnemo prebrane podatke }
Pojasnilo glavnega programa:
Funkcije, razložene v zgornjem razdelku, bodo v glavi datoteke in jih lahko prikličete v glavno datoteko c. Napišimo torej majhen program, s katerim preverimo, ali komunikacija SPI deluje. V vodilo SPI bomo zapisali le nekaj podatkov in s simulacijo proteusa preverili, ali se isti podatki prejemajo v razhroščevalec SPI.
Kot vedno začnite program z nastavitvijo konfiguracijskih bitov, nato pa je zelo pomembno, da v glavo dodate datoteko glave, ki smo jo pravkar razložili, kot je prikazano spodaj
#include
Če ste program odprli iz zip datoteke, ki ste jo prenesli zgoraj, bo datoteka z glavo privzeto prisotna v imeniku datoteke glave v datoteki vašega projekta. V nasprotnem primeru morate datoteko glave dodati ročno v svoj projekt, ko bodo datoteke projekta dodane, bo to videti spodaj
Znotraj glavne datoteke moramo inicializirati PIC kot Master za komunikacijo SPI, nato pa bomo v neskončno zanko while v vodilo SPI zapisali naključne tri šestnajstiške vrednosti, da preverimo, ali jih med simulacijo dobimo.
void main () { SPI_Initialize_Master (); medtem ko (1) { SPI_Write (0X0A); __zakasnitev_ms (100); SPI_Write (0X0F); __zakasnitev_ms (100); SPI_Write (0X15); __zakasnitev_ms (100); } }
Upoštevajte, da so naključne vrednosti, uporabljene v programu, 0A, 0F in 15 in so šestnajstiške vrednosti, zato bi morali med simulacijo videti enako. To je to, da je koda vse narejena, to je le vzorec, vendar lahko isto metodo uporabimo za komunikacijo z drugim MCU ali z drugimi senzorskimi moduli, ki delujejo na protokolu SPI.
Simulacija PIC s programom za iskanje napak SPI:
Zdaj, ko je naš program pripravljen, ga lahko sestavimo in nato nadaljujemo s simulacijo. Proteus ima lepo priročno funkcijo, imenovano razhroščevalnik SPI , s katero lahko spremljate podatke prek vodila SPI. Torej uporabljamo isto in izdelamo vezje, kot je prikazano spodaj.
Ker je v simulaciji samo ena naprava SPI , ne uporabljamo SS-zatiča, kadar pa ne, bi moral biti ozemljen, kot je prikazano zgoraj. Preprosto naložite šestnajstiško datoteko v mikrokrmilnik PIC16F877A in kliknite gumb za predvajanje, da simulirate naš program. Ko se simulacija začne, se prikaže pojavno okno, ki prikazuje podatke v vodilu SPI, kot je prikazano spodaj
Oglejmo si podrobneje podatke, ki prihajajo, in preverimo, ali so enaki tistim, ki smo jih zapisali v naš program.
Podatki so prejeti v enakem vrstnem redu, kot smo ga zapisali v našem programu, in so za vas poudarjeni. Poskusite lahko tudi simulirati program za komunikacijo z dvema mikrokrmilnikoma PIC s protokolom SPI. En PIC morate programirati kot glavnega in drugega kot pomožnega. Vse potrebne glave v ta namen so že podane v datoteki glave.
To je le pogled na to, kaj lahko naredi SPI, lahko tudi bere in zapisuje podatke v več naprav. Več o SPI bomo obravnavali v naslednjih vajah s povezovanjem različnih modulov, ki delujejo s protokolom SPI.
Upam, da ste projekt razumeli in se iz njega naučili kaj koristnega. Če imate kakršne koli dvome, jih objavite v spodnjem oddelku za komentarje ali uporabite forum za tehnično pomoč.
Spodaj je navedena celotna glavna koda; Datoteke glave z vso kodo lahko prenesete od tukaj