- Čo je komunikačný protokol SPI?
- Ako funguje protokol SPI?
- Rozdiel medzi komunikáciou I2C a SPI
- SPI s PIC16F877A pomocou kompilátora XC8:
- Vysvetlenie súboru hlavičky SPI:
- Hlavný program Vysvetlenie:
- Simulácia PIC s debuggerom SPI:
Mikrokontroléry PIC sú výkonnou platformou poskytovanou mikročipom pre vložené projekty; jeho univerzálna povaha mu umožnila nájsť cestu do mnohých aplikácií a ešte stále musí veľa rásť. Ak ste sledovali naše výukové programy PIC, určite by ste si všimli, že sme už prebrali širokú škálu výučbových programov pre mikrokontrolér PIC, počnúc od úplných základov. V rovnakom postupe sa učíme komunikačné protokoly dostupné v PIC a ako ich používať. I2C sme už pokryli mikrokontrolérom PIC.
V rozsiahlom systéme zabudovaných aplikácií nemôže žiadny mikrokontrolér vykonávať všetky činnosti sám. V určitej fáze času musí komunikovať s ostatnými zariadeniami na zdieľanie informácií, existuje mnoho rôznych typov komunikačných protokolov na zdieľanie týchto informácií, ale najpoužívanejšie sú USART, IIC, SPI a CAN. Každý komunikačný protokol má svoje vlastné výhody a nevýhody. Teraz sa zamerajme na protokol SPI, pretože to sa v tomto návode naučíme.
Čo je komunikačný protokol SPI?
Pojem SPI znamená „ sériové periférne rozhranie “. Je to bežný komunikačný protokol, ktorý sa používa na odosielanie údajov medzi dvoma mikrokontrolérmi alebo na čítanie / zápis údajov zo senzora do mikrokontroléra. Používa sa tiež na komunikáciu s SD kartami, posuvnými registrami, radičmi displeja a oveľa viac.
Ako funguje protokol SPI?
Komunikácia SPI je synchrónna komunikácia, čo znamená, že funguje pomocou hodinového signálu, ktorý je zdieľaný medzi dvoma zariadeniami, ktoré si vymieňajú údaje. Ide tiež o plne duplexnú komunikáciu, pretože dokáže odosielať a prijímať údaje pomocou samostatnej zbernice. Komunikácia SPI vyžaduje 5 drôty fungujú. Ďalej je uvedený jednoduchý komunikačný obvod SPI medzi nadradeným a podradeným zariadením
Na komunikáciu je potrebných päť vodičov: SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) a SS (Slave Select). Komunikácia SPI prebieha vždy iba medzi pánom a otrokom. Master môže mať pripojených viac otrokov. Master je zodpovedný za generovanie hodinového impulzu a rovnaký je zdieľaný so všetkými podriadenými. Tiež všetka komunikácia môže byť iniciovaná iba nadradeným zariadením.
Pin SCK (alias SCL-sériové hodiny) zdieľa hodinový signál generovaný masterom so slave. Pin MOSI (alias SDA –Serial Data Out) sa používa na zasielanie údajov z hlavnej jednotky do mastnoty. Kolík MISO (alias SDI - Serial Data In) sa používa na získanie údajov z mastného mastera do mastera. Môžete tiež sledovať značku šípky na vyššie uvedenom obrázku, aby ste pochopili pohyb údajov / signálu. Nakoniec sa použije pin SS (aka CS –Chip select), keď je k masteru pripojených viac ako jeden podriadený modul. Touto voľbou je možné zvoliť požadovanú podriadenú jednotku. Vzorový obvod, kde je viac ako jeden slave pripojený k nadradenej jednotke pre komunikáciu SPI, je zobrazený v obvode nižšie.
Rozdiel medzi komunikáciou I2C a SPI
Už sme sa naučili komunikáciu I2C s PIC, a preto musíme byť oboznámení s tým, ako I2C funguje a kde ich môžeme použiť, ako napríklad I2C možno použiť na prepojenie RTC modulu. Ale teraz, prečo potrebujeme protokol SPI, keď už máme I2C. Dôvodom je, že komunikácia I2C aj SPI sú vlastnými výhodami výhody, a preto je špecifická pre konkrétnu aplikáciu.
Do istej miery možno považovať komunikáciu I2C za výhodu oproti komunikácii SPI, pretože I2C využíva menší počet pinov a je veľmi praktický, keď je na zbernicu pripojených veľké množstvo slave. Ale nevýhodou I2C je to, že má rovnaký autobus pre odosielanie a prijímanie dát a preto je pomerne pomalý. Je to teda čisto založené na aplikácii, ktorá rozhoduje medzi protokolom SPI a I2C pre váš projekt.
SPI s PIC16F877A pomocou kompilátora XC8:
Dosť bolo základov, teraz sa naučme, ako môžeme použiť komunikáciu SPI na mikrokontroléri PIC16F877A pomocou kompilátora MPLABX IDE a XC8. Predtým, ako začneme objasňovať, že tento tutoriál hovorí iba o SPI v PIC16F877a pomocou kompilátora XC8, bude proces rovnaký pre ostatné mikrokontroléry, môžu však byť potrebné mierne zmeny. Pamätajte tiež, že pre pokročilé mikrokontroléry, ako je séria PIC18F, môže mať kompilátor zabudovanú vlastnú knižnicu na použitie funkcií SPI, ale pre PIC16F877A nič také neexistuje, tak si ju poďme vytvoriť sami. Tu vysvetlená knižnica bude uvedená ako hlavičkový súbor na stiahnutie v spodnej časti, ktorý je možné použiť pre PIC16F877A na komunikáciu s inými zariadeniami SPI.
V tomto tutoriále napíšeme malý program, ktorý využíva komunikáciu SPI na zápis a čítanie údajov zo zbernice SPI. To isté potom overíme pomocou simulácie Proteus. Celý kód súvisiaci s registrami SPI sa vytvorí vo vnútri súboru hlavičky s názvom PIC16f877a_SPI.h. Týmto spôsobom môžeme tento hlavičkový súbor použiť vo všetkých našich pripravovaných projektoch, v ktorých sa vyžaduje komunikácia SPI. A vo vnútri hlavného programu budeme používať iba funkcie z hlavičkového súboru. Celý kód spolu so súborom hlavičky si môžete stiahnuť tu.
Vysvetlenie súboru hlavičky SPI:
Vo vnútri hlavičkového súboru musíme inicializovať komunikáciu SPI pre PIC16F877a. Najlepšie je začať vždy s údajovým listom PIC16F877A. Registre, ktoré riadia komunikáciu SPI pre PIC16F8777a, sú SSPSTAT a SSPCON register. Môžete ich nájsť na stranách 74 a 75 údajového listu.
Pri inicializácii SPI komunikácie je potrebné zvoliť veľa možností parametrov. Najbežnejšie používanou možnosťou je, že frekvencia hodín bude nastavená na Fosc / 4 a bude prebiehať v strede a hodiny budú v ideálnom stave nastavené na nízke. Rovnakú konfiguráciu teda používame aj pre náš hlavičkový súbor, ktorý môžete ľahko zmeniť zmenou príslušných bitov.
SPI_Initialize_Master ()
Funkcia SPI initialize Master sa používa na spustenie komunikácie SPI ako master. Vo vnútri tejto funkcie sme nastavili príslušné piny RC5 a RC3 ako výstupné piny. Potom nakonfigurujeme SSPTAT a SSPCON register tak, aby zapínali komunikáciu SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // str. 74/234 SSPCON = 0b00100000; // str. 75/234 TRISC3 = 0; // Nastaviť ako výstup pre režimu slave }
SPI_Initialize_Slave ()
Táto funkcia sa používa na nastavenie mikrokontroléra na prácu v režime slave pre komunikáciu SPI. V režime slave by mal byť pin RC5 nastavený ako výstup a pin RC3 ako vstup. SSPSTAT a SSPCON sú nastavené rovnako pre podriadeného aj nadriadeného.
void SPI_Initialize_Slave () { TRISC5 = 0; // PIN SDO by mal byť deklarovaný ako výstup SSPSTAT = 0b00000000; // str. 74/234 SSPCON = 0b00100000; // str. 75/234 TRISC3 = 1; // Nastaviť ako vstupné pre hlavný režim }
SPI_Write (prichádzajúce znaky)
Funkcia SPI Write slúži na zápis dát do zbernice SPI. Získava informácie od používateľa prostredníctvom prichádzajúcej premennej a potom ich používa na prenos do registra vyrovnávacej pamäte. SSPBUF sa vymaže za sebou idúcim hodinovým impulzom a dáta sa budú do zbernice posielať po bitoch.
void SPI_Write (char incoming) { SSPBUF = incoming; // Zapíše údaje zadané používateľom do vyrovnávacej pamäte }
SPI_Ready2Read ()
Funkcia SPI pripravená na čítanie slúži na kontrolu, či sú dáta na zbernici SPI prijímané úplne a či je možné ich načítať. Register SSPSTAT má bit nazývaný BF, ktorý sa nastaví po úplnom prijatí dát, takže skontrolujeme, či je tento bit nastavený, ak nie je nastavený, a potom musíme počkať, kým sa nastaví na čítanie čohokoľvek zo zbernice SPI.
nepodpísaný SPI_Ready2Read () { if (SSPSTAT & 0b00000001) návrat 1; inak vráti 0; }
SPI_Read ()
SPI Read sa používa na načítanie údajov zo zbernice SPI do mikrokontroléra. Dáta prítomné na zbernici SPI sa uložia do SSPBUF, musíme počkať, kým sa kompletné údaje uložia do medzipamäte, a potom ich môžeme načítať do premennej. Pred načítaním vyrovnávacej pamäte skontrolujeme BF bit registra SSPSTAT, aby sme sa ubezpečili, že je príjem dát úplný.
char SPI_Read () // Čítanie prijatých údajov { while (! SSPSTATbits.BF); // Podržte, kým nie je nastavený bit BF, aby ste sa ubezpečili, že sú načítané kompletné údaje, return (SSPBUF); // vráti načítané údaje }
Hlavný program Vysvetlenie:
Funkcie vysvetlené v predchádzajúcej časti budú v hlavičkovom súbore a je možné ich vyvolať do hlavného súboru c. Poďme teda napísať malý program, ktorý skontroluje, či komunikácia SPI funguje. Iba napíšeme niekoľko údajov na zbernicu SPI a pomocou simulácie proteus skontrolujeme, či sú rovnaké dáta prijímané v debuggeri SPI.
Ako vždy začnite program nastavením konfiguračných bitov a potom je veľmi dôležité pridať hlavičkový súbor, ktorý sme práve vysvetlili do programu, ako je uvedené nižšie
#include
Ak ste program otvorili zo súboru zip stiahnutého vyššie, predvolene bude súbor hlavičky v adresári súboru hlavičky vášho projektu. V opačnom prípade musíte do projektu pridať súbor hlavičky ručne. Po pridaní budú súbory projektu vyzerať takto
Vo vnútri hlavného súboru musíme inicializovať PIC ako Master pre komunikáciu SPI a potom do nekonečnej while slučky napíšeme náhodné tri hexadecimálne hodnoty do zbernice SPI, aby sme skontrolovali, či ich počas simulácie dostaneme.
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); } }
Všimnite si, že náhodné hodnoty použité v programe sú 0A, 0F a 15 a sú to hexadecimálne hodnoty, takže by sme ich počas simulácie mali vidieť rovnako. To znamená, že kód je hotový, jedná sa iba o ukážku, ale môžeme použiť rovnakú metodiku na komunikáciu s inými MCU alebo s inými modulmi senzorov pracujúcich na protokole SPI.
Simulácia PIC s debuggerom SPI:
Teraz, keď je náš program pripravený, môžeme ho zostaviť a potom pokračovať v simulácii. Proteus má príjemnú praktickú funkciu s názvom SPI debugger , ktorou je možné monitorovať údaje po zbernici SPI. Používame teda to isté a zostrojíme obvod, ako je znázornené nižšie.
Pretože v simulácii je iba jedno zariadenie SPI, nepoužívame pin SS a ak sa nepoužíva, malo by byť uzemnené, ako je uvedené vyššie. Stačí načítať hexadecimálny súbor do mikrokontroléra PIC16F877A a kliknutím na tlačidlo prehrávania simulovať náš program. Po spustení simulácie sa zobrazí vyskakovacie okno, ktoré zobrazuje údaje v zbernici SPI, ako je uvedené nižšie
Poďme sa bližšie pozrieť na prichádzajúce údaje a skontrolujte, či sú rovnaké ako tie, ktoré sme napísali v našom programe.
Údaje sa prijímajú v rovnakom poradí, aké sme napísali v našom programe, a to isté je pre vás zvýraznené. Môžete tiež vyskúšať simuláciu programu na komunikáciu s dvoma mikrokontrolérmi PIC pomocou protokolu SPI. Musíte naprogramovať jeden PIC ako hlavný a druhý ako podriadený. Všetky požadované hlavičkové súbory sú na tento účel už uvedené v hlavičkovom súbore.
Toto je iba letmý pohľad na to, čo SPI dokáže, dokáže tiež čítať a zapisovať údaje do viacerých zariadení. Viac o SPI sa budeme venovať v našich pripravovaných tutoriáloch prepojením rôznych modulov, ktoré pracujú s protokolom SPI.
Dúfam, že ste projektu porozumeli a dozvedeli ste sa z neho niečo užitočné. Ak máte pochybnosti, pošlite ich do sekcie komentárov nižšie alebo použite technickú pomoc na fórach.
Kompletný hlavný kód je uvedený nižšie; odtiaľto si môžete stiahnuť hlavičkové súbory so všetkým kódom