- Kas yra SPI ryšio protokolas?
- Kaip veikia SPI protokolas?
- I2C ir SPI ryšio skirtumas
- SPI su PIC16F877A naudojant „XC8 Compiler“:
- SPI antraštės failo paaiškinimas:
- Pagrindinė programa Paaiškinimas:
- Imituojamas PIC su SPI derintuvu:
PIC mikrovaldikliai yra galinga platforma, kurią teikia mikroschema įterptiesiems projektams; universalus pobūdis leido rasti būdų daugeliui programų ir dar daug neišaugs. Jei stebėjote mūsų PIC mokymo programas, pastebėjote, kad mes jau apėmėme daugybę PIC mikrovaldiklio pamokų, pradedant nuo pačių pagrindų. Tame pačiame etape mes mokomės ryšių protokolų, galimų su PIC, ir kaip jais naudotis. Mes jau padengėme I2C su PIC mikrovaldikliu.
Didžiulėje įterptųjų programų sistemoje joks mikrovaldiklis negali pats atlikti visų veiksmų. Tam tikru metu ji turi bendrauti su kitais įrenginiais, kad galėtų dalytis informacija. Yra daug įvairių ryšio protokolų, kuriais galima dalytis šia informacija, tačiau dažniausiai naudojami yra USART, IIC, SPI ir CAN. Kiekvienas ryšio protokolas turi savo privalumų ir trūkumų. Dabar sutelkime dėmesį į SPI protokolą, nes tai, ko mes mokysimės šioje pamokoje.
Kas yra SPI ryšio protokolas?
Terminas SPI reiškia „ nuoseklioji periferinė sąsaja “. Tai yra įprastas ryšio protokolas, naudojamas duomenims siųsti tarp dviejų mikrovaldiklių arba duomenims skaityti / rašyti iš jutiklio į mikrovaldiklius. Jis taip pat naudojamas bendraujant su SD kortelėmis, poslinkių registrais, ekrano valdikliais ir daugeliu kitų.
Kaip veikia SPI protokolas?
SPI ryšys yra sinchroninis ryšys, o tai reiškia, kad jis veikia laikrodžio signalo pagalba, kuriuo dalijasi du prietaisai, kurie keičiasi duomenimis. Be to, tai yra dvipusis ryšys, nes jis gali siųsti ir gauti duomenis naudodamas atskirą magistralę. "SPI bendravimas reikalauja 5 laidus veikti. Toliau parodyta paprasta SPI ryšio grandinė tarp pagrindinio ir vergo
Penki ryšiui reikalingi laidai yra SCK (nuoseklusis laikrodis), MOSI („Master Out Slave In“), MISO („Master In Slave Out“) ir SS („Slave Select“). SPI ryšys visada vyksta tik tarp šeimininko ir vergo. Šeimininkas gali turėti kelis prijungtus vergus. Šeimininkas yra atsakingas už laikrodžio impulso generavimą ir tuo pačiu dalijamasi su visais vergais. Taip pat visus ryšius gali inicijuoti tik kapitonas.
SCK kaištis (dar žinomas kaip SCL serijinis laikrodis) dalijasi pagrindinio signalo sugeneruotu laikrodžio signalu su vergais. MOSI kaištis (dar žinomas kaip SDA –Serial Data Out) yra naudojamas duomenims siųsti iš pagrindinio į salve. MISO kaištis (dar žinomas kaip SDI - „Serial Data In“) naudojamas duomenims iš salve perduoti valdytojui. Norėdami suprasti duomenų / signalo judėjimą, taip pat galite vadovautis rodyklės ženklu aukščiau esančiame paveikslėlyje. Galiausiai SS kaištis (dar žinomas kaip CS-Chip select) naudojamas, kai prie pagrindinio kompiuterio yra prijungtas daugiau nei vienas vergo modulis. Tai galima naudoti norimam vergui pasirinkti. Žemiau pateiktoje grandinėje parodytas grandinės pavyzdys, kai SPI ryšiui su pagrindiniu kompiuteriu yra prijungtas daugiau nei vienas vergas.
I2C ir SPI ryšio skirtumas
Mes jau išmokome I2C ryšį su PIC, todėl turime būti gerai susipažinę su I2C veikimu ir kur mes galime juos naudoti, pavyzdžiui, I2C galima naudoti sąsajai su RTC moduliu. Bet dabar, kodėl mums reikia SPI protokolo, kai jau turime I2C. Priežastis yra ta, kad „I2C“ ir „SPI“ ryšiai yra savotiški pranašumai, todėl priklauso nuo programos.
Tam tikru mastu galima laikyti, kad I2C ryšys turi tam tikrų pranašumų, palyginti su SPI ryšiu, nes I2C naudoja mažiau kontaktų ir jis tampa labai naudingas, kai prie magistralės yra prijungtas didelis skaičius vergų. Tačiau „I2C“ trūkumas yra tas, kad jis turi tą pačią magistralę duomenims siųsti ir priimti, todėl jis yra palyginti lėtas. Taigi tai grynai pagrįsta programa, kad būtų galima nuspręsti tarp jūsų projekto SPI ir I2C protokolo.
SPI su PIC16F877A naudojant „XC8 Compiler“:
Pakanka pagrindų, dabar leiskite mums sužinoti, kaip mes galime naudoti SPI ryšį PIC16F877A mikrovaldiklyje, naudodami kompiliatorių MPLABX IDE ir XC8. Prieš pradėdami aiškiai nurodykite, kad šioje pamokoje kalbama tik apie SPI, esantį PIC16F877a naudojant XC8 kompiliatorių, procesas bus tas pats ir kitiems mikrovaldikliams, tačiau gali prireikti nedidelių pakeitimų. Taip pat nepamirškite, kad pažangiems mikrovaldikliams, tokiems kaip PIC18F serija, pats kompiliatorius gali turėti tam tikrą biblioteką, kad būtų galima naudoti SPI funkcijas, tačiau PIC16F877A nieko tokio nėra, todėl sukurkime patys. Čia paaiškinta biblioteka bus pateikta kaip antraštės failas atsisiuntimui apačioje, kurį bus galima naudoti PIC16F877A bendraujant su kitais SPI įrenginiais.
Šioje pamokoje parašysime nedidelę programą, kuri naudoja SPI ryšį, kad rašytų ir skaitytų duomenis iš SPI magistralės. Tada mes patikrinsime tą patį naudodami „Proteus“ modeliavimą. Visas kodas, susijęs su SPI registrais, bus padarytas antraštės faile PIC16f877a_SPI.h. Tokiu būdu mes galime naudoti šį antraštės failą visuose būsimuose projektuose, kuriuose reikalingas SPI ryšys. Pagrindinės programos viduje mes tiesiog naudosime antraštės failo funkcijas. Išsamų kodą ir antraštės failą galite atsisiųsti iš čia.
SPI antraštės failo paaiškinimas:
Antraštės failo viduje turime inicijuoti PIC16F877a SPI ryšį. Kaip visada geriausia pradėti nuo PIC16F877A duomenų lapo. Registrai, valdantys PIC16F8777a SPI ryšį, yra SSPSTAT ir SSPCON registras. Apie juos galite sužinoti 74 ir 75 duomenų lapo puslapiuose.
Inicijuojant SPI ryšį, reikia pasirinkti daug parametrų parinkčių. Dažniausiai naudojama parinktis yra tai, kad laikrodžio dažnis bus nustatytas į „Fosc / 4“ ir bus atliekamas viduryje, o laikrodis bus nustatytas kaip žemas esant idealiai būsenai. Taigi mes taip pat naudojame tą pačią konfigūraciją savo antraštės failui, juos galite lengvai pakeisti pakeisdami atitinkamus bitus.
SPI_Initialize_Master ()
SPI inicializavimo pagrindinė funkcija naudojama norint pradėti SPI ryšį kaip pagrindinį. Šios funkcijos viduje mes nustatome atitinkamus kaiščius RC5 ir RC3 kaip išvesties kaiščius. Tada sukonfigūruojame SSPTAT ir SSPCON registrą, kad įjungtumėte SPI ryšį
negaliojantis SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // p. 74/234 SSPCON = 0b00100000; // p. 75/234 TRISC3 = 0; // rinkinys kaip išėjimo signalą nuo antrinių režimu }
SPI_Initialize_Slave ()
Ši funkcija naudojama norint nustatyti, kad mikrovaldiklis veiktų vergo režimu SPI ryšiui. Veikiant vergui, kaištis RC5 turėtų būti nustatytas kaip išvestis, o kaištis RC3 - kaip įvestis. SSPSTAT ir SSPCON nustatomi vienodai tiek vergui, tiek pagrindiniam asmeniui.
negaliojantis SPI_Initialize_Slave () { TRISC5 = 0; // SDO kaištis turėtų būti deklaruojamas kaip išėjimas SSPSTAT = 0b00000000; // p. 74/234 SSPCON = 0b00100000; p. 75/234 TRISC3 = 1; // Nustatyti kaip išjungtą pagrindiniam režimui }
SPI_Write (gaunamas simbolis)
SPI rašymo funkcija naudojama duomenims įrašyti į SPI magistralę. Ji gauna informaciją iš vartotojo per kintamąjį įeinantį ir tada perduoda ją buferio registrui. SSPBUF bus išvalytas iš eilės laikrodžio pulsu ir duomenys bus siunčiami į magistralę po truputį.
void SPI_Write (char gaunamas) { SSPBUF = gaunamas; // Įrašykite vartotojo pateiktus duomenis į buferį }
SPI_Ready2Read ()
„SPI ready to read“ funkcija naudojama patikrinti, ar duomenys SPI magistralėje gaunami visiškai ir ar juos galima perskaityti. SSPSTAT registras turi bitą, vadinamą BF, kuris nustatomas, kai duomenys bus visiškai gauti, todėl mes patikriname, ar šis bitas yra nustatytas, jei jis nenustatytas, tada mes turime palaukti, kol jis bus nustatytas ką nors skaityti iš SPI magistralės.
nepasirašytas SPI_Ready2Read () { if (SSPSTAT & 0b00000001) grąžina 1; dar grįžti 0; }
SPI_Read ()
SPI skaitymas naudojamas duomenims iš SPI magistralės nuskaityti į mikrovaldiklį. SPI magistralėje esantys duomenys bus saugomi SSPBUF, mes turime palaukti, kol visi duomenys bus išsaugoti buferyje, tada galėsime juos perskaityti į kintamąjį. Prieš skaitydami buferį, patikriname SSPSTAT registro BF bitą, kad įsitikintume, jog duomenų priėmimas baigtas.
char SPI_Read () // Perskaitykite gautus duomenis { while (! SSPSTATbits.BF); // Laikykite, kol bus nustatytas BF bitas, kad įsitikintumėte, jog visi duomenys yra perskaityti (SSPBUF); // grąžinti perskaitytus duomenis }
Pagrindinė programa Paaiškinimas:
Ankstesniame skyriuje paaiškintos funkcijos bus antraštės faile ir jas galima iškviesti į pagrindinį c failą. Taigi parašykime nedidelę programą, kad patikrintume, ar SPI komunikacija veikia. Mes tiesiog parašysime keletą duomenų į SPI magistralę ir naudosime proteus modeliavimą, kad patikrintume, ar tie patys duomenys gaunami SPI derintuve.
Kaip visada, pradėkite programą nustatydami konfigūracijos bitus, tada labai svarbu pridėti antraštės failą, kurį ką tik paaiškinome, į programą, kaip parodyta žemiau
# įtraukti
Jei atidarėte programą iš aukščiau atsisiųsto ZIP failo, pagal numatytuosius nustatymus antraštės failas bus jūsų projekto failo antraštės failų kataloge. Priešingu atveju antraštės failą turite pridėti rankiniu būdu savo projekte, kai tik pridėsite, jūsų projekto failai atrodys taip toliau
Pagrindinio failo viduje turime inicijuoti PIC kaip pagrindinį SPI ryšiui, o tada begalinio ciklo viduje mes įrašysime atsitiktines tris šešioliktaines reikšmes į SPI magistralę, kad patikrintume, ar simuliacijos metu gauname tas pačias.
void main () { SPI_Initialize_Master (); o (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Atkreipkite dėmesį, kad programoje naudojamos atsitiktinės vertės yra 0A, 0F ir 15, o jos yra šešioliktainės reikšmės, todėl simuliacijos metu turėtume matyti tą patį. Tai reiškia, kad kodas yra atliktas, tai yra tik pavyzdys, tačiau mes galime naudoti tą pačią metodiką, kad galėtume bendrauti su kitais MCU arba su kitais jutiklių moduliais, veikiančiais pagal SPI protokolą.
Imituojamas PIC su SPI derintuvu:
Dabar, kai mūsų programa yra paruošta, galime ją sukompiliuoti ir tada tęsti modeliavimą. „Proteus“ turi puikią patogią funkciją, vadinamą SPI derintuvu , kuri gali būti naudojama duomenims stebėti naudojant SPI magistralę. Taigi mes naudojame tą patį ir sukuriame grandinę, kaip parodyta žemiau.
Kadangi modeliavime yra tik vienas SPI įrenginys, mes nenaudojame SS kaiščio, o kai jis nenaudojamas, jis turėtų būti įžemintas, kaip parodyta aukščiau. Tiesiog įkelkite „hex“ failą į PIC16F877A mikrovaldiklį ir spustelėkite mygtuką „Leisti“, kad imituotų mūsų programą. Pradėjus modeliavimą, gausite iššokantį langą, kuriame duomenys bus rodomi SPI magistralėje, kaip parodyta žemiau
Pažvelkime atidžiau į gaunamus duomenis ir patikrinkime, ar jie sutampa su tais, kuriuos parašėme savo programoje.
Duomenys gaunami ta pačia tvarka, kokia rašėme savo programoje, ir tas pats jums paryškinamas. Taip pat galite pabandyti imituoti programą, kad būtų galima bendrauti su dviem PIC mikrovaldikliais naudojant SPI protokolą. Vieną PIC turite užprogramuoti kaip pagrindinį, o kitą - kaip vergą. Visi šiam tikslui reikalingi antraštės failai jau yra pateikti antraštės faile.
Tai tik žvilgsnis į tai, ką gali padaryti SPI, ji taip pat gali skaityti ir rašyti duomenis į kelis įrenginius. Aptarsime daugiau apie SPI mūsų būsimose mokymo programose, susiesdami įvairius modulius, kurie veikia su SPI protokolu.
Tikiuosi, kad supratote projektą ir iš jo sužinojote ką nors naudingo. Jei turite kokių nors abejonių, paskelbkite juos žemiau esančiame komentarų skyriuje arba naudokite forumus techninei pagalbai.
Pilnas pagrindinis kodas pateiktas žemiau; iš čia galite atsisiųsti antraštės failus su visu kodu