- Mi az SPI kommunikációs protokoll?
- Hogyan működik az SPI protokoll?
- Különbség az I2C és az SPI kommunikáció között
- SPI PIC16F877A-val az XC8 fordító segítségével:
- SPI fejlécfájl magyarázat:
- Fő program Magyarázat:
- PIC szimulálása SPI hibakeresővel:
A PIC mikrokontrollerek a mikrochip által biztosított hatékony platformok a beágyazott projektekhez; sokoldalú jellege lehetővé tette, hogy számos alkalmazásban megtalálhassa a módját, és még mindig sokat fog növekedni. Ha követte a PIC oktatóprogramjainkat, akkor észrevette volna, hogy a PIC mikrokontroller oktatóprogramjainak széles skáláját már lefedtük az alapoktól kezdve. Ugyanebben a folyamatban megtanuljuk a PIC-sel elérhető kommunikációs protokollokat és azok használatát. Az I2C-t már lefedtük PIC mikrokontrollerrel.
A beágyazott alkalmazások hatalmas rendszerében egyetlen mikrokontroller sem képes az összes tevékenységet egyedül végrehajtani. Bizonyos időszakokban kommunikálnia kell más eszközökkel az információk megosztása érdekében, sokféle kommunikációs protokoll létezik ezeknek az információknak a megosztására, de a leggyakrabban használtak az USART, IIC, SPI és CAN. Minden kommunikációs protokollnak megvan a maga előnye és hátránya. Koncentráljunk most az SPI protokollra, mivel ezt fogjuk megtanulni ebben az oktatóanyagban.
Mi az SPI kommunikációs protokoll?
Az SPI kifejezés a „ soros perifériás interfész ” kifejezés. Ez egy általános kommunikációs protokoll, amelyet két mikrovezérlő közötti adatküldésre, vagy adatok érzékelőből mikrovezérlőre történő olvasására / írására használnak. SD kártyákkal, műszakregiszterekkel, kijelzővezérlőkkel és még sok mással való kommunikációra is használják.
Hogyan működik az SPI protokoll?
Az SPI kommunikáció szinkron kommunikáció, vagyis egy órajel segítségével működik, amelyet megosztanak az adatokat cserélő két eszköz között. Ez egy full-duplex kommunikáció is, mivel külön buszon keresztül tud adatokat küldeni és fogadni. Az SPI kommunikáció működéséhez 5 vezeték szükséges. Az alábbiakban egy egyszerű SPI kommunikációs áramkör látható a master és a slave között
A kommunikációhoz szükséges öt vezeték: SCK (soros óra), MOSI (Master Out Slave In), MISO (Master In Slave Out) és SS (Slave Select). Az SPI kommunikáció mindig csak master és slave között zajlik. A mesterhez több rabszolga is kapcsolódhat. A master felelős az óraimpulzus létrehozásáért, és ugyanez megosztva van minden rabszolgával. Az összes kommunikációt csak a mester kezdeményezheti.
Az SCK tű (más néven SCL-soros óra) megosztja a master által generált órajelet a rabszolgákkal. A MOSI tű (más néven SDA –Serial Data Out) arra szolgál, hogy az adatokat elküldje a masterről a salve-be. A MISO csap (más néven SDI - Serial Data In) arra szolgál, hogy az adatokat a salve-ból a masterhez juttassa. Az adatok / jel mozgásának megértéséhez kövesse a fenti ábra nyíljelét is. Végül az SS-tűt (más néven CS-chip kiválasztása) akkor használják, ha egynél több slave modul van csatlakoztatva a masterhez. Ez a kívánt slave kiválasztására használható. Az alábbi áramkörben látható egy minta áramkör, ahol egynél több szolga van csatlakoztatva a masterhez az SPI kommunikációhoz.
Különbség az I2C és az SPI kommunikáció között
Már megtanultuk az I2C kommunikációt a PIC-kel, és ezért ismernünk kell az I2C működését, és azt, hogy hol használhatjuk őket, mint az I2C használható az RTC modul interfészére. De most miért van szükségünk SPI protokollra, amikor már van I2C. Ennek oka az, hogy az I2C és az SPI kommunikáció a maga módján előny, ezért alkalmazás-specifikus.
Bizonyos mértékben az I2C kommunikáció bizonyos előnyöknek tekinthető az SPI kommunikációval szemben, mivel az I2C kevesebb tűt használ, és nagyon hasznos lesz, ha nagy számú rabszolga van csatlakoztatva a buszhoz. De az I2C hátránya, hogy ugyanazon busszal rendelkezik az adatok küldéséhez és fogadásához, ezért viszonylag lassú. Tehát pusztán az alkalmazáson alapul, hogy a projekt SPI és I2C protokollja között döntsön.
SPI PIC16F877A-val az XC8 fordító segítségével:
Elég az alapokból, most tanuljuk meg, hogyan használhatjuk az SPI kommunikációt a PIC16F877A mikrokontrolleren az MPLABX IDE és az XC8 fordító segítségével. Mielőtt elkezdenénk tisztázni, hogy ez az oktatóanyag csak az SPI- ről beszél a PIC16F877a-ban az XC8 fordító segítségével, a folyamat ugyanaz lesz a többi mikrovezérlő esetében is, de szükség lehet némi változtatásokra. Ne feledje, hogy a fejlett mikrovezérlőkhöz, például a PIC18F sorozathoz, maga a fordító is beépíthet valamilyen könyvtárat az SPI funkcióinak használatához, de a PIC16F877A esetében semmi ilyesmi nem létezik, ezért készítsünk egyet magunkról. Az itt ismertetett könyvtár fejlécfájlként lesz letöltve alul, amelyet a PIC16F877A más SPI eszközökkel való kommunikációjára használhat fel.
Ebben az oktatóanyagban egy kis programot írunk, amely SPI kommunikációt használ az adatok írására és olvasására az SPI buszról. Ezután a Proteus szimulációval ellenőrizzük ugyanezt. Az SPI regiszterekhez kapcsolódó összes kód a PIC16f877a_SPI.h nevű fejlécfájlba kerül. Így használhatjuk ezt a fejlécfájlt minden közelgő projektünkben, amelyekben SPI kommunikációra van szükség. A fő program belsejében pedig csak a fejlécfájl függvényeit fogjuk használni. A teljes kód és a fejlécfájl innen letölthető.
SPI fejlécfájl magyarázat:
A fejlécfájlon belül inicializálnunk kell a PIC16F877a SPI kommunikációját. Mint mindig a legjobb hely a kezdésnek a PIC16F877A adatlap. A PIC16F8777a SPI kommunikációját vezérlő regiszterek az SSPSTAT és az SSPCON regiszterek. Ezekről az adatlap 74. és 75. oldalán olvashat.
Az SPI kommunikáció inicializálása során számos paraméteropciót kell választani. A leggyakrabban használt opció az, hogy az órajel frekvenciája Fosc / 4-re lesz állítva, középen történik, és az óra ideális állapotban alacsony lesz. Tehát ugyanazt a konfigurációt használjuk a fejlécfájlunkhoz is, ezeket könnyedén megváltoztathatja a megfelelő bitek megváltoztatásával.
SPI_Initialize_Master ()
Az SPI inicializáló mester funkcióval az SPI kommunikációt mesterként lehet elindítani. Ebben a funkcióban a megfelelő RC5 és RC3 érintkezőket állítjuk be kimeneti csapokként. Ezután konfiguráljuk az SSPTAT és az SSPCON regisztert az SPI kommunikáció bekapcsolásához
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pp 74/234 SSPCON = 0b00100000; pg 75/234 TRISC3 = 0; // Set kimeneti slave mód }
SPI_Initialize_Slave ()
Ezt a funkciót arra használjuk, hogy a mikrovezérlő szolga módban működjön az SPI kommunikációhoz. Slave üzemmódban az RC5 tűt kell kimenetnek, az RC3 csapot pedig bemenetnek beállítani. Az SSPSTAT és az SSPCON ugyanúgy van beállítva a szolga és a master számára is.
void SPI_Initialize_Slave () { TRISC5 = 0; // Az SDO pin-t kimenetként kell deklarálni SSPSTAT = 0b00000000; // pp 74/234 SSPCON = 0b00100000; 75/234. o. TRISC3 = 1; // Beállítás kimenetként a master módhoz }
SPI_Write (karakter bejövő)
Az SPI Write funkcióval adatokat írhatunk az SPI buszra. A bejövő változón keresztül megkapja az információt a felhasználótól, majd továbbítja a Buffer regiszterhez. Az SSPBUF törlődik az egymást követő Óra impulzusban, és az adatokat apránként küldik a buszra.
void SPI_Write (char bejövő) { SSPBUF = bejövő; // Írja be a felhasználó által megadott adatokat pufferbe }
SPI_Ready2Read ()
Az SPI olvasásra kész funkcióval ellenőrizhető, hogy az SPI-buszban lévő adatok teljesen meg vannak-e fogadva és olvashatók-e. Az SSPSTAT regiszternek van egy BF nevű bitje, amely az adatok teljes beérkezését követően beáll, tehát ellenőrizzük, hogy ez a bit be van-e állítva, ha nincs beállítva, akkor várnunk kell, amíg be van állítva, hogy bármit is olvashasson az SPI buszról.
aláíratlan SPI_Ready2Read () { if (SSPSTAT & 0b00000001) return 1; else visszatér 0; }
SPI_Read ()
Az SPI Read segítségével az adatokat leolvassák az SPI buszról a mikrovezérlőbe. Az SPI-buszon lévő adatokat az SSPBUF tárolja, meg kell várnunk, amíg a teljes adat el lesz tárolva a pufferben, majd egy változóba olvashatjuk. A puffer elolvasása előtt ellenőrizzük az SSPSTAT regisztráció BF bitjét, hogy megbizonyosodjunk arról, hogy az adatok vétele teljes-e.
char SPI_Read () // Olvassa el a kapott adatokat { while (! SSPSTATbits.BF); // Tartsa lenyomva, amíg a BF bit be van állítva, hogy megbizonyosodjon arról, hogy a teljes adat visszaolvasásra kerül (SSPBUF); // visszaadja az olvasott adatokat }
Fő program Magyarázat:
A fenti részben ismertetett funkciók a fejlécfájlban lesznek, és meghívhatók a fő c fájlba. Tehát írjunk egy kis programot annak ellenőrzésére, hogy működik-e az SPI kommunikáció. Csak néhány adatot írunk az SPI buszra, és a proteus szimulációval ellenőrizzük, hogy ugyanazokat az adatokat kapja-e az SPI hibakereső.
Mint mindig, a programot a konfigurációs bitek beállításával kezdjük, majd nagyon fontos, hogy az imént ismertetett fejlécfájlt hozzáadjuk a programhoz az alábbiak szerint
#include
Ha a programot a fent letöltött zip fájlból nyitotta meg, akkor a fejlécfájl alapértelmezés szerint a projektfájl fejlécfájl könyvtárában lesz. Egyébként manuálisan kell hozzáadnia a fejlécfájlt a projektjéhez, miután hozzáadta a projektfájlokat, az alábbiak szerint fog kinézni
A fő fájl belsejében inicializálnunk kell a PIC-t Master-ként az SPI kommunikációhoz, majd egy végtelen while ciklus belsejében véletlenszerűen három hex értéket írunk az SPI buszba, hogy ellenőrizzük, vajon ugyanazt kapjuk-e a szimuláció során.
void main () { SPI_Initialize_Master (); míg (1) { SPI_Write (0X0A); __késleltetési_ms (100); SPI_Write (0X0F); __késleltetési_ms (100); SPI_Write (0X15); __késleltetési_ms (100); } }
Figyeljük meg, hogy a programban használt véletlenszerű értékek 0A, 0F és 15, és ezek hexa értékek, ezért a szimuláció során ugyanezt kellene látnunk. Vagyis a kód elkészült, ez csak egy példa, de ugyanazt a módszertant használhatjuk más MCU-val vagy más, SPI protokollon működő érzékelő modulokkal való kommunikációhoz.
PIC szimulálása SPI hibakeresővel:
Most, hogy programunk készen áll, összeállíthatjuk, majd folytathatjuk a szimulációt. A Proteus rendelkezik egy nagyon praktikus funkcióval, az SPI debugger néven , amellyel az adatok SPI buszon keresztül figyelhetők meg. Tehát ugyanazt használjuk, és felépítünk egy áramkört, mint az alábbiakban látható.
Mivel csak egy SPI eszköz van a szimulációban , ezért nem használjuk az SS tűt, és ha nem használjuk, akkor azt a fentiek szerint földelni kell. Csak töltse be a hex fájlt a PIC16F877A mikrovezérlőbe, és kattintson a lejátszás gombra a program szimulálásához. A szimuláció megkezdése után megjelenik egy előugró ablak, amely az adatokat az SPI buszon jeleníti meg, az alábbiak szerint
Vizsgáljuk meg közelebbről a beérkező adatokat, és ellenőrizzük, hogy megegyeznek-e azzal, amelyet a programunkba írtunk.
Az adatokat ugyanabban a sorrendben kapjuk meg, amelyet a programunkba írtunk, és ugyanezt kiemelik az Ön számára. Megpróbálhatja szimulálni a programot két PIC mikrokontrollerrel való kommunikációhoz SPI protokoll használatával. Az egyik PIC-t masterként, a másikat pedig slave-ként kell programoznia. Az összes szükséges fejlécfájl már szerepel a fejlécfájlban.
Ez csak egy pillantás arra, hogy az SPI mit tehet, több eszközre is képes adatokat olvasni és írni. Az SPI-ről bővebben a leendő oktatóprogramjainkban foglalkozunk az SPI protokollal működő különböző modulok összekapcsolásával.
Remélem, megértette a projektet, és valami hasznosat tanult belőle. Ha kétségei vannak, tegye közzé az alábbi megjegyzés részben, vagy használja a fórumot technikai segítségért.
A teljes fő kódot alább adtuk meg; innen töltheti le az összes kóddal ellátott fejlécfájlokat