- Kas ir SPI komunikācijas protokols?
- Kā darbojas SPI protokols?
- Atšķirība starp I2C un SPI komunikāciju
- SPI ar PIC16F877A, izmantojot XC8 kompilatoru:
- SPI galvenes faila skaidrojums:
- Galvenā programma Paskaidrojums:
- PIC simulēšana ar SPI atkļūdotāju:
PIC mikrokontrolleri ir spēcīga platforma, ko iegūtajiem projektiem nodrošina mikroshēma; tā daudzveidīgais raksturs ir ļāvis atrast veidus daudzās lietojumprogrammās, un tas vēl daudz pieaugs. Ja jūs esat sekojis mūsu PIC apmācībām, tad jūs pamanījāt, ka mēs jau esam apskatījuši plašu PIC mikrokontrolleru apmācību klāstu, sākot no pašiem pamatiem. Tajā pašā plūsmā mēs mācāmies saziņas protokolus, kas pieejami ar PIC, un to izmantošanu. Mēs jau esam aptvēruši I2C ar PIC mikrokontrolleru.
Plašajā iegulto lietojumprogrammu sistēmā neviens mikrokontrolleris nevar pats veikt visas darbības. Kādā laika posmā tai ir jāsazinās ar citām ierīcēm, lai koplietotu informāciju, šīs informācijas kopīgošanai ir daudz dažādu veidu sakaru protokolu, taču visbiežāk izmantotie ir USART, IIC, SPI un CAN. Katram sakaru protokolam ir savas priekšrocības un trūkumi. Tagad pievērsīsimies SPI protokolam, jo tieši to mēs mācīsimies šajā apmācībā.
Kas ir SPI komunikācijas protokols?
Termins SPI nozīmē “ Serial Peripheral Interface ”. Tas ir izplatīts sakaru protokols, kas tiek izmantots datu nosūtīšanai starp diviem mikrokontrolleriem vai datu lasīšanai / rakstīšanai no sensora mikrokontrollerim. To izmanto arī saziņai ar SD kartēm, maiņu reģistriem, displeja kontrolleriem un daudz ko citu.
Kā darbojas SPI protokols?
SPI komunikācija ir sinhrona komunikācija, kas nozīmē, ka tā darbojas ar pulksteņa signāla palīdzību, kas tiek koplietots starp divām ierīcēm, kuras apmainās ar datiem. Arī tā ir pilna dupleksa komunikācija, jo tā var nosūtīt un saņemt datus, izmantojot atsevišķu kopni. SPI komunikācija prasa 5 vadi darboties. Turpmāk parādīta vienkārša SPI sakaru shēma starp galveno un vergu
Pieci sakariem nepieciešamie vadi ir SCK (sērijveida pulkstenis), MOSI (galvenā izejošā slave ieeja), MISO (galvenā ieeja verga izejā) un SS (vergu izvēle). SPI komunikācija vienmēr notiek tikai starp kapteini un vergu. Kapteinim var būt pievienoti vairāki vergi. Kapteinis ir atbildīgs par pulksteņa impulsa ģenerēšanu, un tas pats tiek dalīts ar visiem vergiem. Arī visas komunikācijas var sākt tikai kapteinis.
SCK tapa (jeb SCL sērijas pulkstenis) maģistra ģenerēto pulksteņa signālu dala ar vergiem. MOSI tapa (aka SDA –Serial Data Out) tiek izmantota, lai datus no kapteiņa nosūtītu uz salve. MISO tapa (aka SDI - Serial Data In) tiek izmantota, lai datus no salve iegūtu galvenajam. Varat arī sekot bultiņas atzīmei augšējā attēlā, lai saprastu datu / signāla kustību. Visbeidzot, SS tapa (aka CS – Chip select) tiek izmantota, ja galvenajam ir pievienots vairāk nekā viens vergu modulis. To var izmantot, lai izvēlētos nepieciešamo vergu. Ķēdes paraugs, kurā SPI komunikācijai ar galveno ierīci ir pievienots vairāk nekā viens vergs, ir parādīta zemāk esošajā ķēdē.
Atšķirība starp I2C un SPI komunikāciju
Mēs jau esam iemācījušies I2C komunikāciju ar PIC, tāpēc mums ir jāzina, kā I2C darbojas un kur mēs tos varam izmantot, piemēram, I2C var izmantot RTC moduļa saskarnei. Bet tagad, kāpēc mums vajadzīgs SPI protokols, kad mums jau ir I2C. Iemesls ir tas, ka gan I2C, gan SPI komunikācija ir sava veida priekšrocība, un tāpēc tā ir specifiska lietojumam.
Zināmā mērā var uzskatīt, ka I2C komunikācijai ir dažas priekšrocības salīdzinājumā ar SPI komunikāciju, jo I2C izmanto mazāku kontaktu skaitu, un tas ir ļoti ērti, ja kopnei ir pievienots liels skaits vergu. Bet I2C trūkums ir tāds, ka tam ir tāda pati kopija datu sūtīšanai un saņemšanai, tāpēc tā ir salīdzinoši lēna. Tātad tas ir pilnībā balstīts uz lietojumprogrammu, lai izlemtu starp SPI un I2C protokolu jūsu projektam.
SPI ar PIC16F877A, izmantojot XC8 kompilatoru:
Pietiekami daudz pamatu, tagad ļaujiet mums uzzināt, kā mēs varam izmantot SPI komunikāciju PIC16F877A mikrokontrollerī, izmantojot MPLABX IDE un XC8 kompilatoru. Pirms mēs sākam skaidri norādīt, ka šajā apmācībā tiek runāts tikai par SPI PIC16F877a, izmantojot XC8 kompilatoru, process būs tāds pats kā citiem mikrokontrolleriem, taču var būt nepieciešamas nelielas izmaiņas. Atcerieties arī, ka uzlabotiem mikrokontrolleriem, piemēram, PIC18F sērijai, kompilatorā, iespējams, ir iebūvēta bibliotēka, lai izmantotu SPI funkcijas, taču PIC16F877A nekas tāds nepastāv, tāpēc izveidosim to paši. Šeit izskaidrotā bibliotēka tiks dota kā galvenes fails lejupielādei apakšā, ko var izmantot PIC16F877A, lai sazinātos ar citām SPI ierīcēm.
Šajā apmācībā mēs uzrakstīsim nelielu programmu, kas izmanto SPI komunikāciju, lai rakstītu un lasītu datus no SPI kopnes. Pēc tam mēs pārbaudīsim to pašu, izmantojot Proteus simulāciju. Viss kods, kas saistīts ar SPI reģistriem, tiks izveidots galvenes failā PIC16f877a_SPI.h. Tādā veidā mēs varam izmantot šo galvenes failu visos gaidāmajos projektos, kuros nepieciešama SPI komunikācija. Un galvenās programmas iekšpusē mēs vienkārši izmantosim galvenes faila funkcijas. Pilnu kodu kopā ar galvenes failu var lejupielādēt šeit.
SPI galvenes faila skaidrojums:
Galvenes faila iekšpusē mums ir jāinicializē PIC16F877a SPI komunikācija. Kā vienmēr vislabākā vieta, kur sākt, ir PIC16F877A datu lapa. Reģistri, kas kontrolē PIC16F8777a SPI komunikāciju, ir SSPSTAT un SSPCON reģistrs. Par tiem varat uzzināt datu lapas 74. un 75. lpp.
Inicializējot SPI komunikāciju, ir jāizvēlas daudzas parametru opcijas. Visbiežāk izmantotā opcija ir tā, ka pulksteņa frekvence tiks iestatīta uz Fosc / 4 un tiks veikta pa vidu, un pulkstenis tiks iestatīts kā zems ideālā stāvoklī. Tāpēc mēs arī izmantojam to pašu konfigurāciju mūsu galvenes failam, jūs varat tos viegli mainīt, mainot attiecīgos bitus.
SPI_Initialize_Master ()
SPI inicializēšanas galvenā funkcija tiek izmantota, lai sāktu SPI komunikāciju kā galvenais. Šīs funkcijas iekšpusē mēs par izejas tapām iestatām attiecīgās tapas RC5 un RC3. Pēc tam mēs konfigurējam SSPTAT un SSPCON reģistru, lai ieslēgtu SPI sakarus
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pp 74/234 SSPCON = 0b00100000; // pp 75/234 TRISC3 = 0; // Uzstādīt kā izeja vergu režīmā }
SPI_Initialize_Slave ()
Šī funkcija tiek izmantota, lai iestatītu mikrokontrolleru darbam vergu režīmā SPI saziņai. Vergu režīmā tapa RC5 ir jāiestata kā izeja un tapa RC3 kā ievade. SSPSTAT un SSPCON tiek iestatīti vienādi gan vergam, gan galvenajam.
void SPI_Initialize_Slave () { TRISC5 = 0; // SDO tapa jānorāda kā izeja SSPSTAT = 0b00000000; // pp 74/234 SSPCON = 0b00100000; 75. lpp. / 234 TRISC3 = 1; // Iestatīt kā režīmā galvenais režīms }
SPI_Write (ienākošās char)
Funkcija SPI Write tiek izmantota, lai ierakstītu datus SPI kopnē. Tas iegūst informāciju no lietotāja, izmantojot mainīgo ienākošo, un pēc tam to izmanto, lai pārsūtītu uz bufera reģistru. SSPBUF tiks notīrīts secīgajā pulksteņa impulsā un dati pa kopai tiks nosūtīti kopnei.
void SPI_Write (char ienākošā) { SSPBUF = ienākošā; // Ievadiet lietotāja norādītos datus buferī }
SPI_Ready2Read ()
Funkcija SPI ready to read tiek izmantota, lai pārbaudītu, vai dati SPI kopnē ir saņemti pilnībā un vai tos var nolasīt. SSPSTAT reģistrā ir mazliet nosaukums BF, kas tiks iestatīts, kad dati būs pilnībā saņemti, tāpēc mēs pārbaudām, vai šis bits ir iestatīts, ja tas nav iestatīts, tad mums jāgaida, līdz tas tiek iestatīts, lai kaut ko nolasītu no SPI kopnes.
neparakstīts SPI_Ready2Read () { if (SSPSTAT & 0b00000001) atgriež 1; cits atgriež 0; }
SPI_Read ()
SPI lasīšana tiek izmantota datu nolasīšanai no SPI kopnes mikrokontrollerī. SPI kopnē esošie dati tiks saglabāti SSPBUF, mums jāgaida, līdz visi dati tiek saglabāti buferī, un tad mēs tos varam nolasīt mainīgajā. Pirms bufera lasīšanas mēs pārbaudām SSPSTAT reģistra BF bitu, lai pārliecinātos, ka datu saņemšana ir pabeigta.
char SPI_Read () // Lasiet saņemtos datus { while (! SSPSTATbits.BF); // Turiet, līdz ir iestatīts BF bits, lai pārliecinātos, ka visi dati ir nolasīti (SSPBUF); // atgriezt lasītos datus }
Galvenā programma Paskaidrojums:
Iepriekšējā sadaļā izskaidrotās funkcijas būs galvenes failā, un tās var izsaukt galvenajā c failā. Tāpēc uzrakstīsim nelielu programmu, lai pārbaudītu, vai SPI komunikācija darbojas. Mēs tikai ierakstīsim dažus datus SPI kopnē un izmantosim proteus simulāciju, lai pārbaudītu, vai tie paši dati tiek saņemti SPI atkļūdotājā.
Kā vienmēr sāciet programmu, iestatot konfigurācijas bitus, un pēc tam ir ļoti svarīgi pievienot galvenes failu, kuru mēs tikko izskaidrojām, kā parādīts zemāk
# iekļaut
Ja esat atvēris programmu no iepriekš lejupielādētā zip faila, pēc noklusējuma galvenes fails būs jūsu projekta faila galvenes failu direktorijā. Pārējā gadījumā galvenes fails ir jāpievieno manuāli projektā, pēc tam, kad būsit pievienojis, projekta faili izskatās šādi
Galvenā faila iekšpusē mums ir jāinicializē PIC kā Master SPI komunikācijai un pēc tam bezgalīgā cilpa iekšpusē mēs SPI kopnē ierakstīsim nejaušas trīs sešstūra vērtības, lai pārbaudītu, vai simulācijas laikā mēs saņemam to pašu.
void main () { SPI_Initialize_Master (); kamēr (1) { SPI_Write (0X0A); __kavēšanās_ms (100); SPI_Write (0X0F); __kavēšanās_ms (100); SPI_Write (0X15); __kavēšanās_ms (100); } }
Ievērojiet, ka programmā izmantotās izlases vērtības ir 0A, 0F un 15, un tās ir sešstūra vērtības, tāpēc simulācijas laikā mums vajadzētu redzēt to pašu. Tas ir tas, ka kods ir izdarīts, tas ir tikai paraugs, bet mēs varam izmantot to pašu metodiku, lai sazinātos ar citiem MCU vai ar citiem sensoru moduļiem, kas darbojas pēc SPI protokola.
PIC simulēšana ar SPI atkļūdotāju:
Tagad, kad mūsu programma ir gatava, mēs varam to apkopot un pēc tam turpināt simulāciju. Proteus ir jauka ērta funkcija ar nosaukumu SPI atkļūdotājs , kuru var izmantot, lai uzraudzītu datus, izmantojot SPI kopni. Tāpēc mēs izmantojam to pašu un izveidojam ķēdi, kā parādīts zemāk.
Tā kā simulācijā ir tikai viena SPI ierīce, mēs neizmantojam SS tapu, un, ja tā netiek lietota, tā ir jābalstās, kā parādīts iepriekš. Vienkārši ielādējiet hex failu PIC16F877A mikrokontrollerī un noklikšķiniet uz atskaņošanas pogas, lai simulētu mūsu programmu. Pēc simulācijas sākšanas jūs saņemsiet uznirstošo logu, kurā dati tiek parādīti SPI kopnē, kā parādīts zemāk
Apskatīsim tuvāk ienākošos datus un pārbaudīsim, vai tie ir vienādi ar tiem, kurus mēs ierakstījām mūsu programmā.
Dati tiek saņemti tādā pašā secībā, kādu mēs ierakstījām mūsu programmā, un tas pats tiek izcelts arī jums. Varat arī mēģināt simulēt programmu, lai sazinātos ar diviem PIC mikrokontrolleriem, izmantojot SPI protokolu. Jums jāprogrammē viens PIC kā galvenais un otrs kā vergs. Visi šim nolūkam nepieciešamie galvenes faili jau ir norādīti galvenes failā.
Tas ir tikai ieskats, ko SPI var darīt, tā var arī lasīt un rakstīt datus vairākās ierīcēs. Mēs vairāk aplūkosim SPI mūsu gaidāmajās apmācībās, sasaistot dažādus moduļus, kas darbojas ar SPI protokolu.
Ceru, ka sapratāt projektu un uzzinājāt no tā kaut ko noderīgu. Ja jums ir kādas šaubas, ievietojiet tos komentāru sadaļā zemāk vai izmantojiet forumus tehniskai palīdzībai.
Pilns galvenais kods ir norādīts zemāk; šeit varat lejupielādēt galvenes failus ar visu kodu