Semnale bliț Spi în timpul funcționării normale. Ce este interfața SPI

SPI (Serial Peripheral Interface) este un standard de transfer de date serial, sincron, full-duplex, dezvoltat de Motorola pentru a oferi interfața ușoară și ieftină a microcontrolerelor și perifericelor. SPI este uneori denumit și interfață cu patru fire.SPI este un protocol sincron în care orice transmisie este sincronizată cu un semnal de ceas comun generat de gazdă (procesor). Perifericul de recepție (slave) sincronizează recepția secvenței de biți cu semnalul de ceas. Mai multe circuite integrate pot fi conectate la o singură interfață periferică serială a unui circuit integrat principal. Maestrul selectează slave pentru a transmite activând semnalul de selectare a cipului pe cipul slave. Perifericele care nu sunt selectate de procesor nu participă la transferul SPI.
SPI utilizează patru semnale digitale:

  • MOSI sau SI - ieșire master, intrare slave (în engleză Master Out Slave In). Servește pentru a transfera date de la master la slave;
  • MISO sau SO - intrare master, ieșire slave (în engleză Master In Slave Out). Servește pentru a transfera date de la slave la master.
  • SCK sau SCLK - semnal serial de ceas (ing. Serial CLocK). Servește la transmiterea unui semnal de ceas pentru dispozitivele slave.
  • CS sau SS - selecție cip, selecție slave (Selectare cip în engleză, Selectare slave) De regulă, alegerea unui cip se face printr-un nivel logic scăzut.

În funcție de combinațiile de polaritate și faza de ceas, există patru moduri de funcționare SPI.

Modul SPI diagrama de timp
Modul SPI0

Modul SPI1
Nivelul pulsului activ este ridicat.

Modul SPI2

Mai întâi faceți clic, apoi schimbați.

Modul SPI3
Nivelul pulsului activ este scăzut.
Mai întâi schimbă, apoi snap.

Tabelul acceptă:

  • MSB - cel mai semnificativ bit;
  • LSB este bitul cel mai puțin semnificativ.

Masterul trebuie să se adapteze la modul folosit de slave.
La schimbul de date prin interfața SPI, microcontrolerul poate funcționa ca master (modul Master) sau ca slave (modul Slave). În acest caz, utilizatorul poate seta următorii parametri:

  • modul de funcționare conform tabelului;
  • viteza de transmisie;
  • format de transmisie (de la bitul cel mai puțin semnificativ la cel mai semnificativ sau invers).

Conectarea a două microcontrolere conform structurii master - slave prin interfața SPI se realizează conform următoarei scheme.

Pinii SCK, CS pentru microcontrolerul principal sunt ieșiri, iar microcontrolerul slave sunt intrări.

Transferul datelor se realizează după cum urmează. Când scrieți în registrul de date SPI al microcontrolerului principal, generatorul de semnal de ceas al modulului SPI este pornit, iar datele încep să fie transmise bit cu bit către pinul MOSI și, în consecință, către pinul MOSI al slave. microcontroler. După emiterea ultimului bit al octetului curent, generatorul de semnal de ceas se oprește cu setarea simultană a steagului „Sfârșitul transmisiei” la „1”. Dacă întreruperile din modulul SPI sunt acceptate și activate, este generată o solicitare de întrerupere. După aceea, microcontrolerul master poate începe să transmită următorul octet sau, aplicând o tensiune de nivel logic „1” la intrarea SS a slave, îl poate pune în starea de așteptare.

Concomitent cu transferul datelor de la master la slave, are loc un transfer în sens opus, cu condiția ca la intrarea SS a slave să fie prezentă o tensiune de nivel scăzut. Astfel, în fiecare ciclu de schimb, se fac schimb de date între dispozitive. La sfârșitul fiecărui ciclu, indicatorul de întrerupere este setat la „1” atât în ​​microcontrolerul principal, cât și în slave. Octeții recepționați sunt stocați în buffer-uri de primire pentru utilizare ulterioară.

La primirea datelor, octetul primit trebuie citit din registrul de date SPI înainte ca ultimul bit al următorului octet să intre în registrul de deplasare. În caz contrar, primul octet se va pierde.

Pinul SS este pentru selectarea slavei active și este întotdeauna o intrare în modul Slave. De fiecare dată când pinul SS este alimentat la logica 1, modulul SPI este resetat. Dacă schimbarea stării acestui pin are loc în timpul transferului de date, atât recepția, cât și transmisia se vor opri imediat, iar octeții transmisi și primiți se vor pierde.

Dacă microcontrolerul este în modul Master, direcția transferului de date prin pinul SS este definită de utilizator. Când un pin este configurat ca ieșire, acesta acționează ca un pin de uz general și nu afectează funcționarea modulului SPI. De regulă, în acest caz este folosit pentru a controla pinul SS al microcontrolerului care funcționează în modul Slave.

Dacă pinul este configurat ca intrare, acesta trebuie să fie condus în sus pentru ca modulul SPI să funcționeze corect. Aplicarea unei tensiuni de nivel scăzut la această intrare de la orice circuit extern va fi percepută de modulul SPI ca alegerea microcontrolerului ca slave (în acest caz, datele vor fi transferate către acesta).

Un exemplu de utilizare a interfeței SPI pentru microcontrolere STM32 este bine descris în

Cu valori nominale de la 10 Ohm la 1 MΩ);

  • fire de conectare (de exemplu, aici este un set atât de bun);
  • computer personal cu mediul de dezvoltare Arduino IDE.
  • 1 Descrierea serialului Interfață SPI

    SPI - Serial Peripheral Interface sau „Serial Peripheral Interface” este un protocol de comunicare sincron pentru împerechere dispozitiv principal Cu dispozitive periferice (slave). Dispozitivul principal este adesea un microcontroler. Dispozitivele comunică prin patru fire, motiv pentru care SPI este uneori denumit „interfață cu patru fire”. Iata cauciucurile:

    Există patru moduri de transmisie ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), datorită combinației de polaritate a impulsurilor de ceas (lucrăm la nivelul ÎNALT sau JOS), Polaritatea ceasului, CPOL, și faza impulsurilor de ceas (sincronizare pe marginea anterioară sau în urmă a impulsului de ceas), Faza ceasului, CPHA.

    Figura explică acest tabel.

    Interfața SPI oferă mai multe opțiuni pentru conectarea dispozitivelor slave: independentși în cascadă. Cu o conexiune independentă la magistrala SPI, dispozitivul master accesează fiecare dispozitiv slave individual. Cu o conexiune în cascadă, dispozitivele slave funcționează pe rând, ca în cascadă.


    Tipuri de dispozitive de conectare care să funcționeze prin interfața SPI: independente și în cascadă

    2 Implementarea interfeței SPI pe plăcile familiei Arduino

    În Arduino, magistralele de interfață SPI sunt pe porturi specifice. Fiecare placă are propria sa atribuire de pin. Pentru comoditate, concluziile sunt duplicate și, de asemenea, plasate pe o pagină separată. conector ICSP(În Circuit Serial Programming, programarea unui dispozitiv inclus într-un circuit folosind un protocol serial). Vă rugăm să rețineți că nu există un pin de selectare slave - SS pe conectorul ICSP. se presupune că Arduino va fi folosit ca dispozitiv principal în rețea. Dar, dacă este necesar, puteți aloca orice pin digital Arduino ca SS.

    Figura arată corespondența standard a pinilor cu magistralele SPI pentru Arduino UNO și Nano.


    3 Bibliotecă pentru muncă cu interfata SPI

    A fost scrisă o bibliotecă specială pentru Arduino care implementează protocolul SPI. Se conectează astfel: la începutul programului, adăugați #include SPI.h.

    Pentru a începe să lucrați la protocolul SPI, trebuie să setați setările și apoi să inițializați protocolul utilizând procedura SPI.beginTransaction(). Puteți face acest lucru cu o singură declarație: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Aceasta înseamnă că inițializam protocolul SPI la o frecvență de 14 MHz, transferul de date începe de la MSB (cel mai semnificativ bit), în modul SPI_MODE0.

    După inițializare, selectați dispozitivul slave setând pinul SS corespunzător la starea SCĂZUT.

    Apoi transferăm datele pe dispozitivul slave cu comanda SPI.transfer().

    După transfer, returnăm SS la stat ÎNALT.


    Lucrul cu protocolul este finalizat cu comanda SPI.endTransaction().

    Este de dorit să se minimizeze timpul de execuție a transferului între instrucțiunile SPI.beginTransaction() și SPI.endTransaction(), astfel încât să nu existe suprapunere dacă alt dispozitiv încearcă să inițialeze transferul de date folosind setări diferite.

    4 Conectarea unui registru de deplasare la Arduino

    Luați în considerare aplicarea practică a interfeței SPI. Vom aprinde LED-urile prin conducerea unui registru de deplasare de 8 biți prin magistrala SPI. Conectați-vă la Arduino registru de deplasare 74HC595. La fiecare dintre cele 8 iesiri ale registrului, printr-un rezistor limitator, vom conecta un LED cu o valoare nominala de 220 Ohmi. Schema este prezentată în figură.


    5 Schiță de control al registrului de schimbare prin interfața SPI

    Să scriem o schiță.

    #include const int pinSelect = 8; // se înregistrează selectați pin void setup()( SPI.begin(); // inițializarea interfeței SPI pinMode(pinSelect, OUTPUT); // digitalWrite(pinSelect, LOW); // selectează slave (înregistrare) SPI.transfer(0); // șterge conținutul registrului digitalWrite(pinSelect, HIGH); // sfârșitul transmisiei Serial.begin(9600); } void loop() ( pentru (int i=0; i )

    În primul rând, vom conecta biblioteca SPI și vom inițializa interfața SPI. Să definim pinul 8 ca pin de selectare a slave SS. Ștergeți registrul de deplasare trimițându-i valoarea „0”. Inițializați portul serial.

    Pentru a aprinde un anumit LED folosind un registru de deplasare, trebuie să aplicați un număr de 8 biți la intrarea acestuia. De exemplu, pentru a aprinde primul LED, furnizăm numărul binar 00000001, pentru al doilea - 00000010, pentru al treilea - 00000100 etc. Aceste numere binare, atunci când sunt traduse în sistemul numeric zecimal, formează următoarea succesiune: 1, 2, 4, 8, 16, 32, 64, 128 și sunt puteri a două de la 0 la 7.

    În consecință, în ciclu buclă() după numărul de LED-uri, recalculăm de la 0 la 7. Funcție pow(bază, exponent) ridică 2 la puterea contorului de bucle. Microcontrolerele nu funcționează foarte precis cu numere de tip „dublu”, așa că folosim funcția de rotunjire pentru a converti rezultatul într-un număr întreg. rundă(). Și transferăm numărul rezultat în registrul de deplasare. Pentru claritate, monitorul portului serial afișează valorile care sunt obținute în timpul acestei operațiuni: unitatea „curge” prin descărcări – LED-urile se aprind într-un val.

    6 „Val alergător” de la LED-uri

    LED-urile se aprind pe rând și observăm un „val” de lumini care rulează. LED-urile sunt controlate folosind un registru de deplasare, la care ne-am conectat prin interfața SPI. Ca rezultat, doar 3 pini Arduino sunt folosiți pentru a controla 8 LED-uri. Dacă ar fi să conectăm LED-urile direct la porturile digitale Arduino, ar trebui să folosim un port separat pentru fiecare LED.

    Am studiat cel mai simplu exemplu de lucru cu Arduino cu magistrala SPI. Să aruncăm o privire mai atentă asupra funcționării mai multor registre de deplasare cu conexiuni independente și în cascadă într-un articol separat.

    SPI - Serial Peripheral Interface - serial

    interfata periferica

    SPI este un standard de transfer de date sincron serial între microcircuite în modul full duplex.

    Această interfață a fost dezvoltată inițial de Motorola pentru a oferi interfațare simplă și ieftină a microcontrolerelor și perifericelor și este utilizată în prezent în produsele de la mulți producători.

    Interfața SPI, împreună cu I2C, este una dintre cele mai utilizate interfețe pentru conectarea cipurilor. Numele său este o abreviere pentru „Serial Peripheral Interface” (engleză, magistrală SPI -

    SPI bus), care reflectă scopul său - o magistrală pentru conectarea dispozitivelor externe. Autobuzul SPI este organizat pe bază de master-slave. Master-ul magistralei este de obicei un microcontroler, dar poate fi și o logică programabilă, un controler DSP sau un ASIC. Dispozitivele externe conectate la magistrala master formează magistrala slave. Rolul lor este jucat de diferite tipuri de microcircuite, inclusiv. dispozitive de stocare (EEPROM, memorie flash, SRAM), ceas în timp real (RTC), ADC/DAC, potențiometre digitale, controlere specializate etc.

    Componenta principală a interfeței SPI este un registru de deplasare convențional, ale cărui semnale de intrare/ieșire de sincronizare și flux de biți formează semnalele de interfață. Astfel, protocolul SPI este denumit mai corect nu un protocol de transfer de date, ci un protocol de schimb de date între două registre de deplasare, fiecare dintre acestea îndeplinește simultan atât funcția de receptor, cât și funcția de transmițător.

    1. Conexiune electrica

    LA diferit de portul serial standard (ing. port serial standard), SPI este o interfață sincronă în care orice transmisie este sincronizată cu un semnal de ceas comun generat de master (procesor). Perifericul de recepție (slave) sincronizează recepția secvenței de biți cu semnalul de ceas. Mai multe circuite integrate pot fi conectate la o singură interfață periferică serială a unui circuit integrat principal. Maestrul selectează slave pentru transmisie activând semnalul de selectare a cipului pe cipul slave. Perifericele care nu sunt selectate de procesor nu iau parte

    în transmisia SPI.

    SPI utilizează patru semnale digitale:

    MOSI (Eng. Master Out Slave In) - ieșire master (denumire alternativă DO, SDO, DOUT), intrare a unui dispozitiv slave pentru recepția de date seriale (denumire alternativă DI, SDI, DIN). Folosit pentru a transfera date de la master la slave.

    MISO (Eng. Master In Slave Out) - intrarea dispozitivului master pentru recepția datelor seriale (denumirea alternativă DI, SDI, DIN), ieșirea dispozitivului slave pentru transmiterea datelor seriale (denumirea alternativă DO, SDO, DOUT). Servește pentru a transfera date de la slave la master.

    SCLK (ing. Ceas serial) - semnal de ceas serial (denumire alternativă DCLOCK, CLK, SCK). Servește la transmiterea unui semnal de ceas pentru dispozitivele slave.

    CS sau SS - selecție cip, selecție slave

    (Selectare cip engleză, Selectare slave).

    Există trei tipuri de conexiune la magistrala SPI, fiecare dintre ele implicând patru semnale. Cea mai simplă conexiune, în care sunt implicate doar două microcircuite, este prezentată în Figura 1.

    Orez. 1. Cea mai simplă conexiune la magistrala SPI

    Aici, magistrala magistrală transmite date pe linia MOSI în sincronism cu propriul semnal SCLK generat, iar slave captează biții de date transmise pe anumite margini ale semnalului de ceas recepționat. În același timp, slave își trimite pachetul de date. Schema prezentată poate fi simplificată prin omiterea liniei MISO dacă IC-ul slave utilizat nu prevede sau nu este necesar să trimită date înapoi. Transferul de date unidirecțional poate fi găsit în microcircuite precum DAC-uri, potențiometre digitale, amplificatoare programabile și drivere. Astfel, opțiunea avută în vedere de a conecta un circuit integrat slave necesită 3 sau 4 linii de comunicație. Pentru ca IC-ul slave să primească și să transmită date, pe lângă prezența unui semnal de ceas, este, de asemenea, necesar ca linia SS să fie condusă la nivel scăzut. În caz contrar, circuitul integrat slave va fi inactiv. Când este utilizat doar un singur circuit integrat extern, poate fi tentant să excludeți și linia SS, setând greu intrarea de selectare a circuitului integrat slave la un nivel scăzut. O astfel de soluție este extrem de nedorită și poate duce la eșecuri sau chiar la imposibilitatea transferului de date, deoarece. intrarea de selectare a cipului servește la resetarea IC-ului la starea sa inițială și uneori inițiază ieșirea primului bit de date.

    Dacă este necesară conectarea mai multor microcircuite la magistrala SPI, se utilizează fie o conexiune independentă (paralelă) (Fig. 2), fie o conexiune în cascadă (serial) (Fig. 3).

    Orez. 2. Conexiune independentă la magistrala SPI

    Orez. 3. Cascadă la magistrala SPI

    Conexiunea independentă este mai frecventă, deoarece. realizat folosind orice cipuri compatibile SPI. Aici, toate semnalele, cu excepția alegerii cipurilor, sunt conectate în paralel, iar masterul magistralei, transferând unul sau altul semnal SS într-o stare scăzută, stabilește cu ce circuit integrat slave va face schimb de date. Principalul dezavantaj al unei astfel de conexiuni este nevoia de linii suplimentare pentru adresarea microcircuitelor slave (numărul total de linii de comunicație este 3 + n, unde n este numărul de microcircuite slave). Cascada este liberă de acest neajuns, deoarece aici de la

    mai multe microcircuite formează un registru mare de deplasare. Pentru a face acest lucru, ieșirea datelor de transmisie a unui IC este conectată la intrarea de date de recepție a celuilalt, așa cum se arată în Figura 3. Intrările de selectare a cipului sunt conectate în paralel aici și, astfel, numărul total de linii de comunicație este menținut la 4 Cu toate acestea, cascada este posibilă numai dacă suportul său este specificat în documentația pentru cipurile utilizate. Pentru a afla, este important de știut că o astfel de conexiune se numește „daisy-chaining” în engleză.

    2. Protocol de transfer

    Protocolul de transfer SPI este extrem de simplu și, de fapt, este identic cu logica registrului de deplasare, care constă în efectuarea unei operații de deplasare și, în consecință, intrarea și ieșirea bit cu bit a datelor pe anumite margini ale semnalului de sincronizare. . Setul de date la transmisie și preluarea la recepție sunt întotdeauna efectuate pe margini opuse ale ceasului. Acest lucru este necesar pentru a se asigura că datele sunt preluate după ce au fost stabilite în mod fiabil. Dacă luăm în considerare că muchia ascendentă sau descendentă poate acționa ca prima muchie în ciclul de transmisie, atunci există patru opțiuni posibile pentru logica interfeței SPI. Aceste opțiuni sunt numite moduri SPI și sunt descrise de doi parametri:

    CPOL - nivelul inițial al semnalului de sincronizare (dacă CPOL=0, atunci linia de sincronizare înainte de începerea ciclului de transmisie și după încheierea acestuia are un nivel scăzut (adică prima muchie crește, iar ultima muchie scade), în caz contrar, dacă CPOL=1, - mare (adică primul front scade, iar ultimul se ridică));

    CPHA - faza de sincronizare; acest parametru determină secvența în care datele sunt setate și eșantionate (dacă CPHA=0, atunci datele vor fi eșantionate pe muchia ascendentă în ciclul de sincronizare, iar apoi, pe muchia descendentă, datele vor fi setate

    date; dacă CPHA=1, atunci datele vor fi setate pe marginea ascendentă a ciclului de ceas și preluate pe marginea descendentă).

    Cipurile master și slave care funcționează în diferite moduri SPI nu sunt compatibile, așa că este important să clarificați care moduri sunt acceptate de magistrala magistrală înainte de a selecta cipurile slave. Modulele hardware SPI integrate în microcontrolere acceptă în cele mai multe cazuri posibilitatea de a selecta orice mod SPI și, prin urmare, orice microcircuite slave SPI pot fi conectate la acestea (se aplică doar unei opțiuni de conectare independente). În plus, protocolul SPI în oricare dintre moduri este ușor de implementat în software.

    Tab. 1. Moduri SPI

    Temporar

    diagramă

    sincronizare

    3. Comparație cu magistrala I2 C

    După cum am menționat deja, magistrala serială I2 C cu 2 fire nu este mai puțin populară pentru cipurile de andocare. Mai jos puteți vedea avantajele pe care le oferă una sau alta magistrală serială.

    Beneficiile autobuzului SPI

    Avantajele magistralei I2C

    Simplitate extremă a protocolului

    transmisie la nivelul stratului fizic

    asigură o fiabilitate ridicată şi

    viteza de transmisie. limitare

    Viteza magistralei SPI este măsurată

    Autobuzul I2 C rămâne cu două fire,

    zeci de megaherți și, prin urmare, acesta

    indiferent de număr

    ideal pentru streaming

    microcircuit conectat la acesta.

    cantități mari de date și pe scară largă

    folosit la viteză mare

    DAC/ADC, drivere LED

    display-uri și cipuri de memorie

    Toate liniile de autobuz SPI sunt

    unidirecțional, ceea ce este esențial

    Capacitate multi-master

    simplifică rezolvarea problemelor

    funcționare atunci când este conectat la magistrală

    conversii de nivel și

    mai multe microcircuite conducătoare.

    izolarea galvanică a microcircuitelor

    Protocolul I2C este mai mult

    standardizat, deci

    Ușurința implementării software-ului

    Utilizator de cip I2C mai mult

    Protocolul SPI.

    protejat de probleme

    incompatibilitatea selectatelor

    componente.

    4. Protocoale derivate și compatibile

    MICROFIR.

    Protocolul MICRWIRE de la National Semiconductor este identic cu protocolul SPI în modul 0 (CPOL = 0, CPHA = 0).

    Interfață maximă cu 3 fire

    Diferența cu această interfață este că, în loc de transmisie full-duplex pe două linii unidirecționale, efectuează transmisie semi-duplex pe o linie DQ bidirecțională.

    QSPI

    Un protocol de nivel mai înalt decât SPI care permite transferul automat de date fără implicarea CPU.

    În plus, interfața SPI este baza pentru construirea unui număr de interfețe specializate, inclusiv. Interfață de depanare JTAG și interfețe pentru carduri de memorie Flash, incl. SD și MMC.

    Instruire

    SPI- Interfață periferică serială sau „Interfață periferică serială” este un protocol de transmisie sincronă pentru interfața unui dispozitiv master (Master) cu dispozitive periferice (Slave). Dispozitivul principal este adesea . Dispozitivele comunică prin patru fire, motiv pentru care SPI este uneori denumit „interfață cu patru fire”. Iata cauciucurile:
    MOSI (Master Out Slave In)- linie de transmisie a datelor de la dispozitivele master la slave;
    MISO (Master In Slave Out)- linie de transmisie de la slave la master;
    SCLK (ceas serial)- ceas de sincronizare generat de master;
    SS (Selectare slave)- linia de selectare a dispozitivului slave; când linia este „0”, dispozitivul slave „înțelege” că acum este accesat.
    Există patru moduri de transfer de date (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3) datorită combinației de polaritate a ceasului (lucrăm la nivelul HIGH sau LOW), Polaritatea ceasului, CPOL, și faza impulsurilor de ceas (sincronizare pe marginea anterioară sau în urmă a impulsului de ceas), Faza ceasului, CPHA.
    Figura prezintă două opțiuni pentru conectarea dispozitivelor folosind protocolul SPI: independent și în cascadă. Cu o conexiune independentă la magistrala SPI, dispozitivul master accesează fiecare dispozitiv slave individual. Cu cascadă - dispozitivele funcționează pe rând, în cascadă.

    În Arduino, magistralele de interfață SPI sunt pe porturi specifice. Fiecare placă are propria sa atribuire de pin. Pentru comoditate, concluziile sunt duplicate și, de asemenea, plasate pe un conector ICSP separat (In Circuit Serial Programming, un dispozitiv inclus în circuit, folosind un protocol serial). Vă rugăm să rețineți că nu există un pin de selectare slave - SS pe conectorul ICSP. se presupune că Arduino va fi folosit ca dispozitiv principal în rețea. Dar, dacă este necesar, puteți aloca orice pin Arduino ca SS.
    Figura arată corespondența standard a pinilor cu magistralele SPI pentru Arduino UNO și Nano.

    A fost scris unul special pentru Arduino care implementează protocolul SPI. Se conectează astfel: la începutul programului, adăugați #include SPI.h
    Pentru a începe să lucrați cu protocolul SPI, trebuie să setați setările și apoi să inițializați protocolul utilizând procedura SPI.beginTransaction(). Puteți face acest lucru cu o singură declarație: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)).
    Asta înseamnă că inițializam protocolul SPI la 14 MHz, datele sunt transmise începând de la MSB (bitul cel mai semnificativ), în modul „0”.
    După inițializare, selectăm dispozitivul slave transferând pinul SS corespunzător în starea LOW.
    Apoi transferăm datele pe dispozitivul slave cu comanda SPI.transfer ().
    După transmitere, revenim SS la starea HIGH.
    Lucrarea cu protocolul este finalizată cu comanda SPI.endTransaction(). Este de dorit să se minimizeze timpul de execuție a transferului între instrucțiunile SPI.beginTransaction() și SPI.endTransaction(), astfel încât să nu existe suprapunere dacă alt dispozitiv încearcă să inițialeze transferul de date folosind setări diferite.

    Luați în considerare aplicarea practică a interfeței SPI. Vom aprinde LED-urile prin conducerea unui registru de deplasare de 8 biți prin magistrala SPI. Conectați registrul 74HC595 la Arduino. Vom conecta câte un LED la fiecare dintre cele 8 ieșiri (prin intermediul unui rezistor limitator). Schema este prezentată în figură.

    Să scriem o schiță.
    În primul rând, vom conecta biblioteca SPI și vom inițializa interfața SPI. Să definim pinul 8 ca pin de selectare slave. Ștergeți registrul de deplasare trimițându-i valoarea „0”. Inițializați portul serial.
    Pentru a aprinde un anumit LED folosind un registru de deplasare, trebuie să aplicați un număr de 8 biți la intrarea acestuia. De exemplu, pentru a aprinde primul LED, furnizăm numărul binar 00000001, pentru al doilea - 00000010, pentru al treilea - 00000100 etc. Aceste numere binare traduse în sistemul numeric zecimal formează următoarea succesiune: 1, 2, 4, 8, 16, 32, 64, 128 și sunt puteri de la 0 la 7.
    În consecință, în bucla loop(), recalculăm de la 0 la 7 după numărul de LED-uri. pow(bază, exponent) ridică 2 la puterea contorului de bucle. Microcontrolerele nu funcționează foarte precis cu numere de tip „dublu”, așa că folosim funcția round() pentru a converti rezultatul într-un număr întreg. Și transferăm numărul rezultat în registrul de deplasare. Pentru claritate, monitorul portului serial afișează valorile care sunt obținute în timpul acestei operațiuni: unitatea trece prin cifre - LED-urile se aprind într-un val.

    Introducere

    SPI (3 fire) este o interfață populară pentru schimbul de date seriale între microcircuite. Interfața SPI, împreună cu I 2 C, este una dintre cele mai utilizate interfețe pentru conectarea microcircuitelor. A fost inventat inițial de Motorola și este utilizat în prezent în produsele multor producători. Numele său este o abreviere pentru "Serial Peripheral Bus", care reflectă scopul său - o magistrală pentru conectarea dispozitivelor externe. Autobuzul SPI este organizat pe bază de master-slave. Master-ul magistralei este de obicei un microcontroler, dar poate fi și o logică programabilă, un controler DSP sau un ASIC. Dispozitivele externe conectate la magistrala master formează magistrala slave. Rolul lor este jucat de diferite tipuri de microcircuite, inclusiv. dispozitive de stocare (EEPROM, memorie flash, SRAM), ceas în timp real (RTC), ADC/DAC, potențiometre digitale, controlere specializate etc.

    Componenta principală a interfeței SPI este un registru de deplasare convențional, ale cărui semnale de intrare/ieșire de sincronizare și flux de biți formează semnalele de interfață. Astfel, protocolul SPI este denumit mai corect nu un protocol de transfer de date, ci un protocol de schimb de date între două registre de deplasare, fiecare dintre acestea îndeplinește simultan atât funcția de receptor, cât și funcția de transmițător. O condiție indispensabilă pentru transferul de date pe magistrala SPI este generarea unui semnal de ceas al magistralei. Acest semnal are dreptul de a genera numai magistrala master iar funcționarea magistralei slave depinde complet de acest semnal.

    Conexiune electrica

    Există trei tipuri de conexiune la magistrala SPI, fiecare dintre acestea implicând patru semnale (a se vedea tabelul 1 pentru denumirile lor principale și alternative). Cea mai simplă conexiune, care implică doar două cipuri, este prezentată în Figura 1. Aici, masterul magistralei transmite date pe linia MOSI în sincronism cu semnalul SCLK generat de aceasta, iar slave captează biții de date transmisi pe anumite margini ale conexiunii. semnal de ceas primit. În același timp, slave își trimite pachetul de date. Schema prezentată poate fi simplificată prin omiterea liniei MISO dacă IC-ul slave utilizat nu prevede sau nu este necesar să trimită date înapoi. Transferul de date unidirecțional poate fi găsit în microcircuite precum DAC-uri, potențiometre digitale, amplificatoare programabile și drivere. Astfel, opțiunea avută în vedere de a conecta un circuit integrat slave necesită 3 sau 4 linii de comunicație. Pentru ca IC-ul slave să primească și să transmită date, pe lângă prezența unui semnal de ceas, este, de asemenea, necesar ca linia SS să fie condusă la nivel scăzut. În caz contrar, circuitul integrat slave va fi inactiv. Când este utilizat doar un singur circuit integrat extern, poate fi tentant să excludeți și linia SS, setând greu intrarea de selectare a circuitului integrat slave la un nivel scăzut. O astfel de soluție este extrem de nedorită și poate duce la eșecuri sau chiar la imposibilitatea transferului de date, deoarece. intrarea de selectare a cipului servește la resetarea IC-ului la starea sa inițială și uneori inițiază ieșirea primului bit de date.


    Orez. 1. Cea mai simplă conexiune la magistrala SPI

    Dacă este necesară conectarea mai multor microcircuite la magistrala SPI, se utilizează fie o conexiune independentă (paralelă) (Fig. 2), fie o conexiune în cascadă (serial) (Fig. 3). Conexiunea independentă este mai frecventă, deoarece. realizat folosind orice cipuri compatibile SPI. Aici, toate semnalele, cu excepția alegerii cipurilor, sunt conectate în paralel, iar masterul magistralei, transferând unul sau altul semnal SS într-o stare scăzută, stabilește cu ce circuit integrat slave va face schimb de date. Principalul dezavantaj al unei astfel de conexiuni este nevoia de linii suplimentare pentru adresarea microcircuitelor slave (numărul total de linii de comunicație este 3 + n, unde n este numărul de microcircuite slave). Cascada este liberă de acest neajuns, deoarece aici, un registru de deplasare mare este format din mai multe microcircuite. Pentru a face acest lucru, ieșirea datelor de transmisie a unui IC este conectată la intrarea de date de recepție a celuilalt, așa cum se arată în Figura 3. Intrările de selectare a cipului sunt conectate în paralel aici și, astfel, numărul total de linii de comunicație este menținut la 4 Cu toate acestea, cascada este posibilă numai dacă suportul său este specificat în documentația pentru cipurile utilizate. Pentru a afla, este important de știut că o astfel de conexiune se numește „daisy-chaining” în engleză.


    Orez. 2. Conexiune independentă la magistrala SPI


    Orez. 3. Cascadă la magistrala SPI

    Protocolul de transfer

    Protocolul de transfer SPI este extrem de simplu și, de fapt, este identic cu logica registrului de deplasare, care constă în efectuarea unei operații de deplasare și, în consecință, intrarea și ieșirea bit cu bit a datelor pe anumite margini ale semnalului de sincronizare. . Setul de date la transmisie și preluarea la recepție sunt întotdeauna efectuate pe margini opuse ale ceasului. Acest lucru este necesar pentru a se asigura că datele sunt preluate după ce au fost stabilite în mod fiabil. Dacă luăm în considerare că muchia ascendentă sau descendentă poate acționa ca prima muchie în ciclul de transmisie, atunci există patru opțiuni posibile pentru logica interfeței SPI. Aceste opțiuni sunt numite moduri SPI și sunt descrise de doi parametri:

    • CPOL - nivelul inițial al semnalului de sincronizare (dacă CPOL=0, atunci linia de sincronizare înainte de începerea ciclului de transmisie și după încheierea acestuia are un nivel scăzut (adică prima muchie crește, iar ultima muchie scade), în caz contrar, dacă CPOL=1, - mare (adică primul front scade, iar ultimul se ridică));
    • CPHA - faza de sincronizare; acest parametru determină secvența în care datele sunt setate și recuperate (dacă CPHA=0, atunci datele vor fi eșantionate pe marginea ascendentă în ciclul de sincronizare, iar apoi, pe frontul descendent, datele vor fi setate; dacă CPHA= 1, atunci datele de setare vor fi luate pe marginea ascendentă în ciclul de ceas și eșantionate pe marginea descendentă). Informațiile despre modurile SPI sunt rezumate în Tabelul 2.

    Cipurile master și slave care funcționează în diferite moduri SPI nu sunt compatibile, așa că este important să clarificați care moduri sunt acceptate de magistrala magistrală înainte de a selecta cipurile slave. Modulele hardware SPI integrate în microcontrolere acceptă în cele mai multe cazuri posibilitatea de a selecta orice mod SPI și, prin urmare, orice microcircuite slave SPI pot fi conectate la acestea (se aplică doar unei opțiuni de conectare independente). În plus, protocolul SPI în oricare dintre moduri este ușor de implementat în software.

    Comparație cu bara I 2 C

    După cum am menționat deja, magistrala serială cu 2 fire I 2 C nu este mai puțin populară pentru microcircuite de andocare. Mai jos puteți vedea beneficiile pe care le oferă cutare sau cutare magistrală serial.

    Beneficiile autobuzului SPI Avantajele magistralei I2C
    Simplitatea extremă a protocolului de transmisie la nivelul fizic determină fiabilitatea ridicată și viteza de transmisie. Limita de viteză a magistralei SPI este măsurată în zeci de megaherți și, prin urmare, este ideală pentru fluxul de date mari și este utilizată pe scară largă în DAC/ADC de mare viteză, drivere de afișare LED și cipuri de memorie Busul I 2 C rămâne cu două fire, indiferent de numărul de cipuri conectate la ea.
    Toate liniile de magistrală SPI sunt unidirecționale, ceea ce simplifică foarte mult sarcina de conversie a nivelului și izolarea galvanică a microcircuitelor Posibilitatea de funcționare multi-master atunci când mai multe microcircuite master sunt conectate la magistrală.
    Ușurința implementării software a protocolului SPI. Protocolul I2C este mai standardizat, prin urmare, utilizatorul cipurilor I2C este mai protejat de problemele de incompatibilitate ale componentelor selectate.

    Protocoale derivate și compatibile

    • MICROFIR.

      Protocolul MICRWIRE de la National Semiconductor este identic cu protocolul SPI în modul 0 (CPOL = 0, CPHA = 0).

    • Interfață maximă cu 3 fire

      Diferența cu această interfață este că, în loc de transmisie full-duplex pe două linii unidirecționale, efectuează transmisie semi-duplex pe o linie DQ bidirecțională.

    • QSPI

      Un protocol de nivel mai înalt decât SPI care permite transferul automat de date fără implicarea CPU.

    În plus, interfața SPI este baza pentru construirea unui număr de interfețe specializate, inclusiv. Interfață de depanare JTAG și interfețe pentru carduri de memorie Flash, incl. SD și MMC.

    Tab. 1. Semnale electrice magistrala SPI

    Anvelope de top autobuzul sclavilor
    Denumirea de bază Notație alternativă Descriere Denumirea de bază Notație alternativă Descriere
    MOSI DO, SDO, DOUT MOSI DI, SDI, DIN
    MISO DI, SDI, DIN Intrare de recepție în serie MISO DO, SDO, DOUT Ieșire serială
    SCLK DCLOCK, CLK, SCK Ieșire de sincronizare a transferului de date SCLK DCLOCK, CLK, SCK Primiți intrare de sincronizare
    SS CS Ieșire selectare slave (selectare cip) SS CS Intrare selectare slave (selectare cip)


    Se încarcă...
    Top