- Hvad er SPI-kommunikationsprotokol?
- Hvordan SPI-protokol fungerer?
- Forskel mellem I2C og SPI-kommunikation
- SPI med PIC16F877A ved hjælp af XC8 Compiler:
- SPI Header File Forklaring:
- Hovedprogram Forklaring:
- Simulering af PIC med SPI debugger:
PIC Microcontrollers er en kraftfuld platform leveret af mikrochip til indlejrede projekter; dens alsidige natur har gjort det muligt at finde veje til mange applikationer og er endnu ikke vokset meget. Hvis du har fulgt vores PIC-tutorials, ville du have bemærket, at vi allerede har dækket en bred vifte af tutorials om PIC-mikrocontroller startende fra det grundlæggende. I samme flow fortsætter vi med at lære de kommunikationsprotokoller, der er tilgængelige med PIC, og hvordan de bruges. Vi har allerede dækket I2C med PIC Microcontroller.
I det store system af integrerede applikationer kan ingen mikrokontroller udføre alle aktiviteterne alene. På et tidspunkt er det nødvendigt at kommunikere til andre enheder for at dele information, der er mange forskellige typer kommunikationsprotokoller til at dele disse oplysninger, men de mest anvendte er USART, IIC, SPI og CAN. Hver kommunikationsprotokol har sin egen fordel og ulempe. Lad os fokusere på SPI-protokollen for nu, da det er det, vi skal lære i denne vejledning.
Hvad er SPI-kommunikationsprotokol?
Udtrykket SPI står for " Serial Peripheral Interface ". Det er en fælles kommunikationsprotokol, der bruges til at sende data mellem to mikrocontrollere eller til at læse / skrive data fra en sensor til en mikrocontroller. Det bruges også til at kommunikere med SD-kort, skiftregistre, display-controllere og meget mere.
Hvordan SPI-protokol fungerer?
SPI-kommunikationen er synkron kommunikation, hvilket betyder, at den fungerer ved hjælp af et ursignal, der deles mellem de to enheder, der udveksler dataene. Det er også en full-duplex kommunikation, fordi den kan sende og modtage data ved hjælp af en separat bus. Den SPI kommunikation kræver 5 ledninger til at operere. Et simpelt SPI-kommunikationskredsløb mellem en master og slave er vist nedenfor
De fem ledninger, der kræves til kommunikationen, er SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) og SS (Slave Select). SPI-kommunikationen finder altid kun sted mellem en mester og slave. En mester kan have flere slaver tilsluttet sig. Skibsføreren er ansvarlig for at generere urimpulsen, og den deles med alle slaver. Også al kommunikation kan kun initieres af mesteren.
SCK-stiften (aka SCL-serielt ur) deler det ursignal, der genereres af mesteren, med slaverne. MOSI-stiften (aka SDA –Serial Data Out) bruges til at sende dataene fra masteren til salven. MISO-stiften (aka SDI - Serial Data In) bruges til at få dataene fra salven til mesteren. Du kan også følge pilemarkeringen i ovenstående figur for at forstå bevægelsen af data / signal. Endelig bruges SS-pin (også kaldet CS –Chip select), når der er mere end et slave-modul tilsluttet master. Denne kan bruges til at vælge den ønskede slave. Et prøvekredsløb, hvor mere end en slave er forbundet med masteren til SPI-kommunikation, er vist i nedenstående kredsløb.
Forskel mellem I2C og SPI-kommunikation
Vi har allerede lært I2C-kommunikation med PIC, og så vi skal være fortrolige med, hvordan I2C fungerer, og hvor vi kan bruge dem, ligesom I2C kan bruges til at interface RTC-modul. Men nu, hvorfor har vi brug for SPI-protokol, når vi allerede har I2C. Årsagen er, at både I2C- og SPI-kommunikation er fordele på sine egne måder og derfor applikationsspecifik.
I et omfang kan I2C-kommunikationen anses for at have nogle fordele i forhold til SPI-kommunikation, fordi I2C bruger mindre antal pin, og det bliver meget praktisk, når der er et stort antal slaver forbundet til bussen. Men ulempen ved I2C er, at den har den samme bus til afsendelse og modtagelse af data, og derfor er den forholdsvis langsom. Så det er udelukkende baseret på applikation til at vælge mellem SPI og I2C-protokollen til dit projekt.
SPI med PIC16F877A ved hjælp af XC8 Compiler:
Nok af det grundlæggende, lad os nu lære, hvordan vi kan bruge SPI-kommunikation på PIC16F877A mikrocontroller ved hjælp af MPLABX IDE- og XC8-kompilatoren. Før vi begynder at gøre det klart, at denne tutorial kun taler om SPI i PIC16F877a ved hjælp af XC8-kompilator, vil processen være den samme for andre mikrocontrollere, men der kan være behov for små ændringer. Husk også, at for avancerede mikrokontrollere som PIC18F-serien, kan compileren selv have noget bibliotek indbygget til at bruge SPI-funktionerne, men for PIC16F877A findes der ikke noget lignende, så lad os bygge et på vores egen. Biblioteket, der er forklaret her, vil blive givet som en headerfil til download i bunden, som kan bruges til PIC16F877A til at kommunikere med andre SPI-enheder.
I denne vejledning skriver vi et lille program, der bruger SPI-kommunikation til at skrive og læse data fra SPI-bussen. Vi bekræfter det samme ved hjælp af Proteus-simulering. Al den kode, der er relateret til SPI-registre, bliver lavet inde i headerfilen kaldet PIC16f877a_SPI.h. På denne måde kan vi bruge denne headerfil i alle vores kommende projekter, hvor SPI-kommunikation er påkrævet. Og inde i hovedprogrammet bruger vi bare funktionerne fra headerfilen. Den komplette kode sammen med headerfilen kan downloades herfra.
SPI Header File Forklaring:
Inde i headerfilen skal vi initialisere SPI-kommunikationen til PIC16F877a. Som altid er det bedste sted at starte PIC16F877A datablad. De registre, der styrer SPI-kommunikationen til PIC16F8777a, er SSPSTAT og SSPCON- registeret. Du kan få oplysninger om dem på side 74 og 75 i databladet.
Der er mange parametreindstillinger, der skal vælges, mens SPI-kommunikationen initialiseres. Den mest anvendte mulighed er, at urfrekvensen indstilles til Fosc / 4 og udføres i midten, og uret indstilles til lav i ideel tilstand. Så vi bruger også den samme konfiguration til vores header-fil, du kan nemt ændre dem ved at ændre de respektive bits.
SPI_Initialize_Master ()
SPI-initialiseringsfunktionen bruges til at starte SPI-kommunikationen som master. Inde i denne funktion indstiller vi de respektive stifter RC5 og RC3 som outputstifter. Derefter konfigurerer vi SSPTAT og SSPCON-registeret til at aktivere SPI-kommunikationen
ugyldig SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // s. 74/234 SSPCON = 0b00100000; // sg 75/234 TRISC3 = 0; // Sæt som udgang for slavemodus }
SPI_Initialize_Slave ()
Denne funktion bruges til at indstille mikrocontrolleren til at arbejde i slave-tilstand til SPI-kommunikation. Under slave-tilstand skal pin RC5 indstilles som output, og pin RC3 skal indstilles som input. SSPSTAT og SSPCON er indstillet på samme måde for både slave og master.
ugyldig SPI_Initialize_Slave () { TRISC5 = 0; // SDO-pin skal erklæres som output SSPSTAT = 0b00000000; // s. 74/234 SSPCON = 0b00100000; // s. 75/234 TRISC3 = 1; // Indstil som ude til mastertilstand }
SPI_Write (char indgående)
SPI Write-funktionen bruges til at skrive data ind i SPI-bussen. Det får oplysningerne fra brugeren gennem den indgående variabel og bruger den derefter til at videregive til bufferregistret. SSPBUF ryddes i den på hinanden følgende urimpuls, og dataene sendes til bussen bit for bit.
ugyldigt SPI_Write (char indkommende) { SSPBUF = indkommende; // Skriv de brugeropgivne data i buffer }
SPI_Ready2Read ()
SPI ready to Read-funktionen bruges til at kontrollere, om dataene i SPI-bussen modtages fuldstændigt, og om de kan læses. SSPSTAT-registret har en bit, der hedder BF, der indstilles, når dataene er modtaget fuldstændigt, så vi kontrollerer, om denne bit er indstillet, hvis den ikke er indstillet, så vi må vente, indtil den bliver indstillet til at læse noget fra SPI-bussen.
usigneret SPI_Ready2Read () { hvis (SSPSTAT & 0b00000001) returnerer 1; ellers returnere 0; }
SPI_Læs ()
SPI Read bruges til at læse dataene fra SPI-bussen ind i mikrocontrolleren. Dataene til stede i SPI-bussen gemmes i SSPBUF, vi må vente, indtil de komplette data er gemt i bufferen, og så kan vi læse dem i en variabel. Vi kontrollerer BF-biten i SSPSTAT-registeret, før vi læser bufferen for at sikre, at datamodtagelsen er komplet.
char SPI_Read () // Læs de modtagne data { while (! SSPSTATbits.BF); // Hold indtil BF bit er indstillet for at sikre, at de komplette data læses retur (SSPBUF); // returner de læste data }
Hovedprogram Forklaring:
Funktionerne, der er forklaret i ovenstående afsnit, findes i headerfilen, og de kan kaldes til c-hovedfilen. Så lad os skrive et lille program for at kontrollere, om SPI-kommunikationen fungerer. Vi vil bare skrive få data i SPI-bussen og bruge proteus-simuleringen til at kontrollere, om de samme data modtages i SPI-fejlfindingsprogrammet.
Start som altid programmet ved at indstille konfigurationsbits, og så er det meget vigtigt at tilføje headerfilen, som vi lige har forklaret i programmet som vist nedenfor
#omfatte
Hvis du har åbnet programmet fra den zip-fil, der er downloadet ovenfor, vil headerfilen som standard være til stede i headerfilmappen i din projektfil. Ellers skal du tilføje headerfilen manuelt inde i dit projekt, når dine projektfiler er tilføjet, vil de se sådan ud nedenfor
Inde i hovedfilen er vi nødt til at initialisere PIC som Master til SPI-kommunikation og derefter inde i en uendelig mens løkke skriver vi tilfældige tre hex-værdier i SPI-bussen for at kontrollere, om vi modtager det samme under simuleringen.
ugyldig hoved () { SPI_Initialize_Master (); mens (1) { SPI_Write (0X0A); __forsink_ms (100); SPI_Write (0X0F); __forsink_ms (100); SPI_Write (0X15); __forsink_ms (100); } }
Bemærk, at de tilfældige værdier, der bruges i programmet, er 0A, 0F og 15, og at de er hex-værdier, så vi skal se det samme under simuleringen. Det er det, koden er færdig, dette er bare en prøve, men vi kan bruge den samme metode til at kommunikere med anden MCU eller med andre sensormoduler, der fungerer på SPI-protokol.
Simulering af PIC med SPI debugger:
Nu hvor vores program er klar, kan vi kompilere det og derefter fortsætte med simulering. Proteus har en dejlig praktisk funktion kaldet SPI debugger , som kan bruges til at overvåge dataene via en SPI-bus. Så vi bruger det samme og bygger et kredsløb som vist nedenfor.
Da der kun er én SPI-enhed i simuleringen, bruger vi ikke SS-stiften, og når den ikke bruges, skal den være jordforbundet som vist ovenfor. Indlæs bare hex-filen i PIC16F877A-mikrocontroller, og klik på afspil-knappen for at simulere vores program. Når simuleringen starter, får du et pop op-vindue, der viser dataene i SPI-bussen som vist nedenfor
Lad os se nærmere på de data, der kommer ind, og kontrollere, om de er de samme som dem, vi skrev i vores program.
Dataene modtages i samme rækkefølge som vi skrev i vores program, og det samme fremhæves for dig. Du kan også prøve at simulere et program til at kommunikere med to PIC-mikrocontrollere ved hjælp af SPI- protokol. Du skal programmere en PIC som master og den anden som slave. Alle de nødvendige headerfiler til dette formål er allerede angivet i headerfilen.
Dette er bare et glimt af, hvad SPI kan gøre, det kan også læse og skrive data til flere enheder. Vi vil dække mere om SPI i vores kommende tutorials ved at interfacere forskellige moduler, der fungerer med SPI-protokol.
Håber du forstod projektet og lærte noget nyttigt af det. Hvis du er i tvivl, send dem i kommentarfeltet nedenfor eller brug foraerne til teknisk hjælp.
Komplet hovedkode er angivet nedenfor; Du kan downloade headerfiler med al koden herfra