- Co je komunikační protokol SPI?
- Jak funguje protokol SPI?
- Rozdíl mezi komunikací I2C a SPI
- SPI s PIC16F877A pomocí kompilátoru XC8:
- Vysvětlení souboru záhlaví SPI:
- Hlavní program Vysvětlení:
- Simulace PIC s debuggerem SPI:
Mikrokontroléry PIC jsou výkonnou platformou poskytovanou mikročipem pro vložené projekty; jeho univerzální povaha mu umožnila najít cesty k mnoha aplikacím a ještě hodně poroste. Pokud jste sledovali naše výukové programy PIC, pak byste si všimli, že jsme již pokryli širokou škálu výukových programů pro mikrokontrolér PIC, počínaje samotnými základy. Ve stejném toku se učíme komunikační protokoly dostupné s PIC a jak je používat. Již jsme pokryli I2C mikrokontrolérem PIC.
V rozsáhlém systému integrovaných aplikací nemůže žádný mikrokontrolér provádět všechny činnosti sám. V určité době musí komunikovat s jinými zařízeními za účelem sdílení informací, existuje mnoho různých typů komunikačních protokolů pro sdílení těchto informací, ale nejpoužívanější jsou USART, IIC, SPI a CAN. Každý komunikační protokol má své vlastní výhody a nevýhody. Pojďme se nyní zaměřit na protokol SPI, protože to se v tomto tutoriálu naučíme.
Co je komunikační protokol SPI?
Termín SPI znamená „ sériové periferní rozhraní “. Jedná se o běžný komunikační protokol, který se používá k odesílání dat mezi dvěma mikrokontroléry nebo ke čtení / zápisu dat ze senzoru do mikrokontroléru. Používá se také ke komunikaci s SD kartami, posuvnými registry, řadiči displeje a mnoha dalšími.
Jak funguje protokol SPI?
Komunikace SPI je synchronní komunikace, což znamená, že funguje pomocí hodinového signálu, který je sdílen mezi dvěma zařízeními, která si vyměňují data. Také jde o plně duplexní komunikaci, protože může odesílat a přijímat data pomocí samostatné sběrnice. Komunikace SPI vyžaduje k provozu 5 vodičů. Níže je uveden jednoduchý komunikační obvod SPI mezi hlavní a podřízenou jednotkou
Pět vodičů potřebných pro komunikaci je SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) a SS (Slave Select). Komunikace SPI probíhá vždy pouze mezi masterem a slave. Master může mít připojeno více podřízených. Master je zodpovědný za generování hodinového impulzu a stejný je sdílen se všemi podřízenými. Také veškerou komunikaci může zahájit pouze nadřízený.
Pin SCK (aka SCL-sériové hodiny) sdílí hodinový signál generovaný masterem se slave. Pin MOSI (aka SDA –Serial Data Out) se používá k odesílání dat z hlavní jednotky do mastku. Pin MISO (aka SDI - Serial Data In) se používá k získání dat z mast do masteru. Můžete také sledovat značku šipky na výše uvedeném obrázku, abyste pochopili pohyb dat / signálu. Nakonec se pin SS (aka CS –Chip select) použije, pokud je k hlavnímu modulu připojeno více než jeden podřízený modul. To lze použít k výběru požadovaného podřízeného. Ukázkový obvod, kde je více než jeden slave připojen k hlavní jednotce pro komunikaci SPI, je uveden v obvodu níže.
Rozdíl mezi komunikací I2C a SPI
Komunikaci I2C s PIC jsme se již naučili, a proto musíme být obeznámeni s tím, jak I2C funguje a kde je můžeme použít, jako I2C lze použít k propojení modulu RTC. Ale teď, proč potřebujeme protokol SPI, když už máme I2C. Důvodem je, že komunikace I2C i SPI jsou svým způsobem výhody, a proto jsou specifické pro konkrétní aplikaci.
Do jisté míry lze považovat komunikaci I2C za některé výhody oproti komunikaci SPI, protože I2C používá menší počet pinů a je velmi užitečný, když je na sběrnici připojeno velké množství podřízených. Ale nevýhodou I2C je to, že má stejný autobus pro odesílání a přijímání dat a proto je poměrně pomalý. Je tedy čistě založeno na aplikaci pro rozhodování mezi protokolem SPI a I2C pro váš projekt.
SPI s PIC16F877A pomocí kompilátoru XC8:
Dostatek základů, teď se naučme, jak můžeme použít komunikaci SPI na mikrokontroléru PIC16F877A pomocí kompilátoru MPLABX IDE a XC8. Než začneme, ujasněte si, že tento výukový program hovoří pouze o SPI v PIC16F877a pomocí kompilátoru XC8, proces bude stejný pro ostatní mikrokontroléry, ale mohou být vyžadovány drobné změny. Pamatujte také, že pro pokročilé mikrokontroléry, jako je řada PIC18F, může mít kompilátor sám zabudovanou knihovnu pro použití funkcí SPI, ale pro PIC16F877A nic podobného neexistuje, takže si ji vytvořme sami. Zde vysvětlená knihovna bude uvedena jako soubor záhlaví ke stažení ve spodní části, který lze použít pro PIC16F877A ke komunikaci s jinými zařízeními SPI.
V tomto tutoriálu napíšeme malý program, který používá komunikaci SPI k zápisu a čtení dat ze sběrnice SPI. To samé pak ověříme pomocí simulace Proteus. Veškerý kód související s registry SPI bude vytvořen uvnitř souboru záhlaví s názvem PIC16f877a_SPI.h. Tímto způsobem můžeme tento hlavičkový soubor použít ve všech našich připravovaných projektech, ve kterých je vyžadována komunikace SPI. A uvnitř hlavního programu budeme používat pouze funkce ze souboru záhlaví. Celý kód spolu se souborem záhlaví lze stáhnout zde.
Vysvětlení souboru záhlaví SPI:
Uvnitř souboru záhlaví musíme inicializovat komunikaci SPI pro PIC16F877a. Nejlepším místem pro začátek je vždy datový list PIC16F877A. Registry, které řídí komunikaci SPI pro PIC16F8777a, jsou SSPSTAT a SSPCON registr. Můžete o nich na stranách 74 a 75 datového listu.
Při inicializaci komunikace SPI je třeba zvolit mnoho možností parametrů. Nejčastěji používanou možností je, že frekvence hodin bude nastavena na Fosc / 4 a bude provedena uprostřed a hodiny budou nastaveny jako nízké v ideálním stavu. Stejnou konfiguraci tedy používáme i pro náš soubor záhlaví, můžete je snadno změnit změnou příslušných bitů.
SPI_Initialize_Master ()
Funkce SPI initialize Master se používá ke spuštění komunikace SPI jako Master. Uvnitř této funkce nastavíme příslušné piny RC5 a RC3 jako výstupní piny. Potom nakonfigurujeme SSPTAT a registr SSPCON pro zapnutí komunikace SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // str. 74/234 SSPCON = 0b00100000; // str. 75/234 TRISC3 = 0; // Nastavit jako výstup pro režimu slave }
SPI_Initialize_Slave ()
Tato funkce se používá k nastavení mikrokontroléru tak, aby pracoval v režimu slave pro komunikaci SPI. V režimu slave by měl být pin RC5 nastaven jako výstup a pin RC3 jako vstup. SSPSTAT a SSPCON jsou nastaveny stejným způsobem pro slave i master.
void SPI_Initialize_Slave () { TRISC5 = 0; // PIN SDO by měl být deklarován jako výstup SSPSTAT = 0b00000000; // str. 74/234 SSPCON = 0b00100000; // str. 75/234 TRISC3 = 1; // Nastavit jako odchozí pro hlavní režim }
SPI_Write (příchozí znak)
Funkce zápisu SPI se používá k zápisu dat na sběrnici SPI. Získává informace od uživatele prostřednictvím proměnné příchozí a poté je používá k předání do registru vyrovnávací paměti. SSPBUF bude vymazán v po sobě jdoucích taktovacích impulzech a data budou odeslána do sběrnice bit po bitu.
void SPI_Write (char incoming) { SSPBUF = incoming; // Zápis dat zadaných uživatelem do vyrovnávací paměti }
SPI_Ready2Read ()
Funkce SPI připravena ke čtení slouží ke kontrole, zda jsou data na sběrnici SPI přijímána úplně a zda je lze číst. Registr SSPSTAT má bit nazvaný BF, který se nastaví, jakmile budou data úplně přijata, takže zkontrolujeme, zda je tento bit nastaven, pokud není nastaven, a pak musíme počkat, až se nastaví na čtení čehokoli ze sběrnice SPI.
bez znaménka SPI_Ready2Read () { if (SSPSTAT & 0b00000001) vrátit 1; jinak vrátit 0; }
SPI_Read ()
Čtení SPI se používá ke čtení dat ze sběrnice SPI do mikrokontroléru. Data přítomná na sběrnici SPI budou uložena v SSPBUF, musíme počkat, dokud nebudou do Bufferu uložena kompletní data, a poté je můžeme načíst do proměnné. Před čtením vyrovnávací paměti zkontrolujeme BF bit registru SSPSTAT, abychom se ujistili, že je příjem dat kompletní.
char SPI_Read () // Číst přijatá data { while (! SSPSTATbits.BF); // Držte, dokud není nastaven bit BF, abyste se ujistili, že jsou načítána kompletní data, návrat (SSPBUF); // vrátit přečtená data }
Hlavní program Vysvětlení:
Funkce vysvětlené ve výše uvedené části budou v souboru záhlaví a lze je vyvolat do hlavního souboru c. Pojďme tedy napsat malý program, abychom zkontrolovali, zda komunikace SPI funguje. Napíšeme jen pár dat na sběrnici SPI a pomocí simulace proteus zkontrolujeme, zda jsou stejná data přijímána v debuggeru SPI.
Jako vždy začněte program nastavením konfiguračních bitů a pak je velmi důležité přidat do souboru záhlaví, které jsme právě vysvětlili, jak je znázorněno níže
#zahrnout
Pokud jste program otevřeli ze souboru zip staženého výše, bude ve výchozím nastavení soubor záhlaví přítomen v adresáři souboru záhlaví souboru projektu. Jinak musíte do projektu ručně přidat soubor záhlaví, jakmile přidáte soubory projektu, bude vypadat takto níže
Uvnitř hlavního souboru musíme inicializovat PIC jako Master pro komunikaci SPI a pak do nekonečné smyčky while zapíšeme na sběrnici SPI náhodné tři hexadecimální hodnoty, abychom zkontrolovali, zda během simulace dostáváme to samé.
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šimněte si, že náhodné hodnoty použité v programu jsou 0A, 0F a 15 a jsou to hexadecimální hodnoty, takže bychom měli během simulace vidět totéž. To znamená, že kód je hotový, je to jen ukázka, ale můžeme použít stejnou metodiku pro komunikaci s jinými MCU nebo s jinými moduly senzorů pracujících na protokolu SPI.
Simulace PIC s debuggerem SPI:
Nyní, když je náš program připraven, můžeme jej zkompilovat a poté pokračovat v simulaci. Proteus má příjemnou užitečnou funkci nazvanou SPI debugger , kterou lze použít ke sledování dat po sběrnici SPI. Použijeme tedy totéž a vytvoříme obvod, jak je znázorněno níže.
Vzhledem k tomu, že v simulaci je pouze jedno zařízení SPI, nepoužíváme pin SS a pokud se nepoužívá, mělo by být uzemněno, jak je uvedeno výše. Stačí načíst hexadecimální soubor do mikrokontroléru PIC16F877A a kliknutím na tlačítko přehrávání simulovat náš program. Po spuštění simulace se zobrazí vyskakovací okno, které zobrazuje data na sběrnici SPI, jak je uvedeno níže
Pojďme se blíže podívat na přicházející data a zkontrolovat, zda jsou stejná jako ta, která jsme napsali v našem programu.
Data jsou přijímána ve stejném pořadí, jaké jsme napsali v našem programu, a to samé je pro vás zvýrazněno. Můžete také zkusit simulovat program pro komunikaci se dvěma mikrokontroléry PIC pomocí protokolu SPI. Musíte naprogramovat jeden PIC jako master a druhý jako slave. Všechny požadované soubory záhlaví pro tento účel jsou již uvedeny v souboru záhlaví.
Toto je jen letmý pohled na to, co SPI dokáže, dokáže také číst a zapisovat data na více zařízení. Více o SPI se budeme zabývat v našich připravovaných tutoriálech propojením různých modulů, které pracují s protokolem SPI.
Doufám, že jste projektu porozuměli a naučili se z něj něco užitečného. Máte-li jakékoli pochybnosti, pošlete je do sekce komentářů níže nebo použijte technickou podporu ve fórech.
Níže je uveden kompletní hlavní kód; odtud si můžete stáhnout hlavičkové soubory se všemi kódy