Viteza de transfer de date Spi. Curs de formare AVR. Lucrul cu modulul SPI. Partea 1. Bibliotecă pentru lucrul cu interfața SPI

Interfața SPI este una dintre cele mai populare interfețe seriale de astăzi. A fost inventat de Motorola și a câștigat rapid popularitate datorită simplității sale excepționale și vitezei mari. În același timp, probabil că SPI nu poate fi numit pe deplin o interfață, mai degrabă, este pur și simplu un principiu de comunicare, deoarece tot ceea ce se înțelege prin SPI este logica transferului de dateîntre două dispozitive („Master” - „Sclav”), se acordă mult mai puţină atenţie fizicii, este implementat, s-ar putea spune, „în funcție de circumstanțe”, dar nu există deloc un protocol de nivel inferior, aici fiecare producător vine cu ceva propriu.

Ei bine, să începem cu principalul. Deci, care este logica aici? Logica este că datele sunt transmise secvenţial, bit cu bit, în timp ce citirea şi setarea datelor sunt separate în timp folosind un semnal special de ceas pe o magistrală specială. Această magistrală se numește magistrală de ceas (sau magistrală de sincronizare), iar esența separării este că datele sunt citite și setate pe margini opuse ale impulsurilor de ceas generate pe magistrală. Aceasta, clar separată în timp, alternarea setărilor și citirilor face posibilă utilizarea aceluiași registru atât pentru primirea, cât și pentru transmiterea datelor. Anterior (când memoria era mică și costisitoare, sistemele de operare erau stocate pe dischete, iar mamuții alergau prin câmpuri) acesta a fost un avantaj serios, în plus, pentru asta a fost proiectat inițial SPI, dar acum nu există probleme cu capacitatea de memorie și majoritatea dispozitivelor își permit cu ușurință să aibă registre de intrare și de ieșire separate.

Dispozitivul care controlează magistrala de ceas (adică generează impulsuri de ceas pe ea) este „Master” sau „Master”. De fapt, „Maestrul” controlează tot schimbul de date - el decide: când să înceapă schimbul, când să îl încheie, câți biți să transferi etc. Al doilea dispozitiv care participă la schimb este „Sclavul” sau „Sclavul”. În SPI, spre deosebire, de exemplu, de același I2C, „Slave” nu are absolut niciun drept, nu poate influența deloc magistrala de ceas și nu poate în niciun fel să informeze masterul că nu este la timp sau, dimpotrivă, că este deja gata de schimb. Adică, „Stăpânul” însuși trebuie să știe: când să întrebe „Sclavul”, ce și cu ce viteză, pentru a-i putea răspunde.

În total, pentru schimbul full-duplex (în ambele direcții simultan), interfața SPI folosește 4 linii (vezi figura): SCLK, MOSI, MISO și SS.

  1. SCLK— magistrală de ceas (pe această linie masterul generează impulsuri de ceas)
  2. MOSI (M aster O ut, S dragoste eu n) — ieșire master, intrare slave (prin această linie masterul transmite date către slave)
  3. MISO (M aster eu n, S dragoste O ut) - intrare master, ieșire slave (prin această linie masterul primește date de la slave)
  4. SS (S dragoste S elect) - selectarea unui slave (folosind această linie masterul controlează sesiunile de schimb)

„1” și „0” sunt codificate de nivelul de tensiune de pe magistralele de date (MOSI, MISO) în logica pozitivă obișnuită, adică un nivel de tensiune ridicat pe magistrală corespunde cu „unu”, iar un nivel scăzut corespunde cu „ zero". În același timp, modul în care este organizată instalarea acestor niveluri pe autobuze nu este specificat nicăieri, adică ieșirile transmițătorului pot fi fie „push-pull”, fie „open collector”. Un nivel ridicat corespunde de obicei tensiunii de alimentare a microcircuitului (adică dacă avem de-a face cu microcircuite de cinci volți, atunci un nivel ridicat este o tensiune apropiată de cinci volți, dacă vorbim despre microcircuite alimentate de 3,3V, atunci un nivel ridicat este o tensiune apropiată de 3,3V).

Semnalul SS marchează începutul și sfârșitul unei sesiuni de schimb. Acest semnal este de obicei invers, adică în timpul unei sesiuni de schimb de date, comandantul trebuie să seteze linia SS la un nivel scăzut, iar în absența schimbului, la un nivel înalt. Prezența semnalului SS permite maestrului să organizeze o conexiune la mai mulți slave folosind același semnal de ceas și aceleași magistrale de date, fără protocoale suplimentare (o variantă a unei astfel de conexiuni este prezentată în figura din stânga). Adevărat, există un dezavantaj: în acest caz, masterul va trebui să se conecteze la fiecare slave printr-o linie SS separată (pentru a gestiona sesiunile de schimb cu fiecare slave independent unul de celălalt), ceea ce crește numărul total de fire utilizate.

Numele liniilor, în general, nu sunt un standard și pot diferi în funcție de producător (de exemplu, în loc de MOSI, MISO și SCLK, liniile pot fi numite DI, DO și SC, sau SI, SO și CLK, linia SS poate fi numită CS sau RESET).

Mai mult, nu trebuie să existe patru linii - uneori pot fi doar trei, de exemplu, dacă datele sunt transferate într-o singură direcție sau se folosește o magistrală de date bidirecțională în loc de două magistrale de date unidirecționale. Evident, în acest ultim caz, este posibil doar schimbul semi-duplex, adică la un moment dat puteți transmite sau doar primi date (dar nu puteți transmite și primi în același timp).
Adică, este imposibil să se identifice în mod unic SPI fie după numele liniilor, fie după nivelurile de tensiune de pe ele, fie chiar după numărul lor, dar acest lucru se poate face perfect prin metoda de transfer de date în sine, prin modul în care acestea sunt instalate pe autobuz și citite.

După cum am menționat deja, datele sunt transmise bit cu bit, iar datele sunt instalate și citite pe marginile opuse ale semnalului de ceas. Se numește momentul citirii datelor în literatura engleză zăvor(fixare, snapping) și în momentul în care datele sunt instalate pe autobuz - schimb(schimb). Momentul de instalare se numește schimbare datorită caracteristicilor majorității interfețelor seriale. De obicei, nimeni nu transmite date câte un bit, de regulă, acestea sunt trimise în pachete de 8 sau mai mulți biți (dimensiunea pachetului este cel mai adesea un multiplu de opt). În acest sens, la ieșirea transmițătorului se realizează un registru de deplasare, unde întregul pachet de biți transmiși este încărcat deodată, iar valoarea bitului scăzut sau ridicat al acestui registru de deplasare este setată pe magistrala de date (în funcție de modul în care transmitem - înainte de biți scăzut sau ridicat) și pentru a-l seta la magistrala următorului bit transmis - doar „schimbați” acest registru. Așa sunt aranjate emițătoarele în SPI și în I2C și în RS232 obișnuit și în multe alte locuri (doar că este mai convenabil în hardware). Ei bine, bine, să revenim la SPI-ul nostru.

Nivelul logic al semnalului de pe magistrala de ceas în starea inactivă (când nu există transmisie de date) se numește polaritate și este desemnat CPOL (adică dacă în absența transmisiei magistrala SCLK este scăzută, atunci CPOL = 0, iar dacă în acest moment magistrala SCLK este ridicată, atunci CPOL=1). Ordinea citirilor și a deplasărilor alternative se numește fază și este desemnată CPHA (dacă o citire are loc pe prima margine pe SCLK, atunci CPHA = 0, iar dacă apare o schimbare pe prima margine pe SCLK, atunci CPHA = 1).

În funcție de combinația valorilor CPOL și CPHA, există 4 moduri de operare ale interfeței SPI, care sunt desemnate ca Mod 0, Modul 1, Modul 2Și Modul 3. Mai jos este o imagine care ilustrează modul în care sunt instalate și citite datele, în funcție de modul selectat.

Aș dori să subliniez că SS este tocmai linia de control al sesiunii de schimb, și nu doar linia de selecție a sclavilor. Diferența aici este că, dacă considerăm SS pur și simplu o linie de selecție a slave, atunci când un master este conectat la un singur slave, există tentația de a nu controla această linie, ci de a o scurtcircuita la firul comun (cum ar fi așa că sclavul este întotdeauna selectat). Cu toate acestea, logica slave este de obicei astfel încât începutul sesiunii este însoțit de diverse proceduri pregătitoare, cum ar fi încărcarea datelor în registrul de deplasare a ieșirii și resetarea contorului de impulsuri, iar slave începe să efectueze unele acțiuni (în conformitate cu comenzile primite prin SPI de la master) numai după finalizarea sesiunii de schimb. În plus, este posibil să aveți nevoie de mai multe sesiuni de comunicare (de exemplu, dacă în prima sesiune trimiteți comenzi, iar în următoarea doriți să primiți un raport privind rezultatul executării acestora). Cred că este clar că, dacă trageți strâns linia SS la firul comun, atunci nu poate fi vorba de nicio recunoaștere a începutului și a sfârșitului sesiunii de schimb (începutul este recunoscut de declinul pe linia SS, iar în consecință, întregul schimb de date va fi perturbat. Deci importanța semnalului SS nu trebuie subestimată.

Și, în sfârșit, voi spune că cele mai populare moduri sunt Mode0 și Mode3.

Mai multe detalii despre cum are loc schimbul, ce ar trebui să poată face un master SPI și cum să-l implementeze în software pe un microcontroler (folosind exemplul controlerelor PIC și AVR) pot fi citite în articol

SPI - Serial Peripheral Interface - serial

interfata periferica

SPI este un standard sincron serial pentru transferul de date î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 microcircuitelor. Numele său este o abreviere pentru „Serial Peripheral Interface” (SPI bus).

SPI bus), care reflectă scopul său - o magistrală pentru conectarea dispozitivelor externe. Autobuzul SPI este organizat pe bază de master-slave. Master-ul de magistrală este de obicei un microcontroler, dar poate fi și logic programabil, un controler DSP sau un ASIC. Dispozitivele externe conectate la magistrala magistrală formează slave de magistrală. 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.

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

1. Conexiune electrica

ÎN diferență față de un port serial standard port serial standard), SPI este o interfață 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 cipuri pot fi conectate la o interfață periferică serială a unui cip master. Masterul selectează slave pentru transmisie activând semnalul de selectare a cipului pe cipul slave. Perifericele care nu sunt selectate de procesor nu participă

în transmisia SPI.

SPI utilizează patru semnale digitale:

MOSI (English Master Out Slave In) - ieșire a dispozitivului master (desemnare alternativă DO, SDO, DOUT), intrare a dispozitivului slave pentru recepția datelor seriale (desemnare alternativă DI, SDI, DIN). Servește pentru a transfera date de la dispozitivul master la slave.

MISO (ing. 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 un dispozitiv slave la un dispozitiv principal.

SCLK (ing. Serial Clock) - 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

(ing. Chip Select, Slave Select).

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

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

Aici, masterul magistralei transmite date de-a lungul liniei MOSI sincron cu semnalul SCLK generat de acesta, iar slave captează biții de date transmise pe anumite margini ale semnalului de sincronizare recepționat. În același timp, slave își trimite pachetul de date. Circuitul prezentat poate fi simplificat prin eliminarea liniei MISO dacă IC-ul slave utilizat nu asigură transmiterea datelor de răspuns sau nu este nevoie de aceasta. Transferul de date unidirecțional poate fi găsit în cipuri precum DAC-uri, potențiometre digitale, amplificatoare programabile și drivere. Astfel, opțiunea avută în vedere pentru conectarea unui circuit integrat slave necesită 3 sau 4 linii de comunicație. Pentru ca circuitul integrat slave să primească și să transmită date, pe lângă faptul că are un semnal de ceas, linia SS trebuie de asemenea să fie condusă la nivel scăzut. În caz contrar, circuitul integrat slave va fi inactiv. Atunci când este utilizat doar un singur circuit integrat extern, poate fi tentant să eliminați linia SS prin scăderea intrării de selectare a circuitului integrat slave. Această soluție este extrem de nedorită și poate duce la defecțiuni 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. Conexiune în cascadă la magistrala SPI

Conexiunea independentă este mai frecventă, deoarece obținut atunci când se utilizează orice cipuri compatibile cu SPI. Aici, toate semnalele, cu excepția selecției microcircuitelor, sunt conectate în paralel, iar masterul magistralei, transferând unul sau altul semnal SS într-o stare scăzută, specifică cu ce IC slave va face schimb de date. Principalul dezavantaj al acestei conexiuni este necesitatea unor linii suplimentare pentru adresarea cipurilor slave (numărul total de linii de comunicație este 3+n, unde n este numărul cipurilor slave). Comutarea în cascadă nu are acest dezavantaj, deoarece aici de la

mai multe cipuri formează un registru mare de deplasare. Pentru a face acest lucru, ieșirea datelor de transmisie a unui circuit integrat este conectată la intrarea de recepție a datelor a celuilalt, așa cum se arată în Figura 3. Intrările de selectare a cipului sunt conectate aici în paralel și, astfel, numărul total de linii de comunicație este menținut egal. la 4. Cu toate acestea, utilizarea conexiunii în cascadă este posibilă numai dacă suportul acesteia este indicat î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 transmisie prin interfața 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 pe biți a datelor pe anumite margini ale semnalului de sincronizare. Setarea datelor în timpul transmisiei și eșantionarea în timpul recepției sunt întotdeauna efectuate pe margini opuse ale ceasului. Acest lucru este necesar pentru a se asigura că datele sunt eșantionate odată ce acestea au fost stabilite în mod fiabil. Dacă luăm în considerare că prima muchie din ciclul de transmisie poate fi o muchie ascendentă sau descendentă, 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 margine crește, iar ultima scade), în caz contrar , dacă CPOL=1, este înalt (adică primul front scade, iar ultimul se ridică));

CPHA - faza de sincronizare; acest parametru determină secvența în care se realizează setarea și eșantionarea datelor (dacă CPHA = 0, atunci pe marginea ascendentă în ciclul de sincronizare datele vor fi eșantionate, iar apoi, pe marginea descendentă, setarea

date; dacă CPHA=1, atunci instalarea datelor va fi efectuată pe marginea ascendentă în ciclul de sincronizare, iar eșantionarea se va efectua pe marginea descendentă).

Cipurile master și slave care funcționează în diferite moduri SPI sunt incompatibile, prin urmare, înainte de a alege cipurile slave, este important să clarificăm care moduri sunt acceptate de masterul magistralei. Modulele hardware SPI integrate în microcontrolere acceptă, în cele mai multe cazuri, posibilitatea de a selecta orice mod SPI și, prin urmare, este posibil să se conecteze la ele orice cip SPI slave (se aplică numai unei opțiuni de conectare independente). În plus, protocolul SPI în oricare dintre moduri este ușor de implementat în software.

Masa 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 conectarea microcircuitelor Mai jos puteți vedea avantajele pe care aceasta sau alta magistrală serială le oferă.

Avantajele magistralei SPI

Avantajele magistralei I2C

Simplitate extremă a protocolului

transmisii stratului fizic

oferă fiabilitate ridicată și

viteza de transmisie. Limită

Performanța magistralei SPI este măsurată

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

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

indiferent de cantitate

ideal pentru streaming

microcircuite conectate la acesta.

volume mari de date și pe scară largă

folosit la viteza mare

DAC/ADC, drivere LED

display-uri și cipuri de memorie

Toate liniile de autobuz SPI sunt

unidirecțional, ceea ce este esențial

Posibilitate de multi-master

simplifică rezolvarea problemei

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, prin urmare

Simplitatea implementării software-ului

utilizator de cipuri I2C mai mult decât

Protocolul SPI.

ferit de probleme

incompatibilitatea selectatelor

componente.

4. Protocoale derivate și compatibile

MICROFIR.

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

Interfață maximă cu 3 fire

Diferența dintre 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.

Transfer interfețe.

Multe interfețe de transfer de date au fost dezvoltate pentru a transfera date de la un dispozitiv la altul sau de la un cip la altul. Fiecare interfață are atât părți pozitive, cât și negative, așa că trebuie să știți ce interfețe există, avantajele și dezavantajele lor și să utilizați interfața potrivită pentru a transfera date într-o situație dată.

Interfețele vin cu transfer de date asincron și sincron. Cu transmisia de date sincronă, un semnal de ceas este transmis simultan cu datele, permițând receptorului și emițătorului să se sincronizeze. Un exemplu de astfel de protocol este interfața SPI.

În transmisia asincronă de date nu există semnal de ceas. În astfel de linii există pericolul de nepotrivire între receptor și transmițător, ca urmare a faptului că alte date nu vor fi primite corect. Pentru a preveni acest lucru, interfețele asincrone efectuează sincronizare periodică de-a lungul liniilor de date. Avantajul unor astfel de interfețe este numărul mai mic de conductori necesari pentru transmisie.

Să aruncăm o privire mai atentă la câteva dintre cele mai populare interfețe.

interfață USART.

Interfața USART este un transceiver serial universal sincron-asincron. Datele sunt transferate către USART la intervale regulate. Această perioadă de timp este determinată de viteza USART specificată și este specificată în baud (Pentru caracterele care pot lua doar valori egale cu zero sau unu, baud este echivalent cu biți pe secundă). Există o gamă general acceptată de viteze standard: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 9216.

În plus față de biții de date, USART inserează automat mărci de sincronizare în flux, așa-numiții biți de pornire și oprire. La recepție, acești biți suplimentari sunt îndepărtați. De obicei, biții de pornire și de oprire separă un octet de informații (8 biți), dar există implementări USART care permit transmiterea a 5, 6, 7, 8 sau 9 biți. Biții separați de semnalele de pornire și oprire sunt trimiterea minimă. USART vă permite să introduceți doi biți de oprire în timpul transmisiei pentru a reduce probabilitatea desincronizării receptorului și emițătorului în trafic intens. Receptorul ignoră al doilea bit de oprire, tratându-l ca pe o scurtă pauză pe linie.

Convenția este că starea pasivă (în absența datelor) a intrării și ieșirii USART este un „1” logic. Bitul de pornire este întotdeauna un „0” logic, astfel încât receptorul USART așteaptă o tranziție de la „1” la „0” și numără din el un interval de timp de jumătate din durata bitului (mijlocul transmisiei bitului de pornire) . Dacă în acest moment intrarea este încă „0”, atunci începe procesul de primire a coletului minim. Pentru a face acest lucru, receptorul numără duratele de 9 biți la rând (pentru date pe 8 biți) și înregistrează starea de intrare în fiecare moment. Primele 8 valori sunt date primite, ultima valoare este o valoare de test (bit de oprire). Valoarea bitului de oprire este întotdeauna „1” dacă valoarea reală primită este diferită, USART înregistrează o eroare.

Pentru a forma intervale de timp, USART-urile de transmisie și de recepție au o sursă de timp precisă (tac). Precizia acestei surse trebuie să fie astfel încât suma erorilor (receptor și emițător) în setarea intervalului de timp de la începutul impulsului de pornire până la mijlocul impulsului de oprire să nu depășească jumătate (sau mai bine, cel puțin o sfert) din intervalul de biți. Pentru un mesaj pe 8 biți 0,5/9,5 = 5% (în realitate nu mai mult de 3%). Deoarece aceasta este suma erorilor receptorului și emițătorului plus posibila distorsiune a semnalului pe linie, toleranța recomandată pentru precizia tacării USART nu este mai mare de 1,5%.

Deoarece biții de ceas ocupă o parte a fluxului de biți, debitul UART rezultat nu este egal cu viteza conexiunii. De exemplu, pentru pachetele 8-N-1 pe 8 biți, biții de ceas ocupă 20% din flux, ceea ce pentru o viteză fizică de 115.200 baud oferă o rată de biți de date de 92.160 bps sau 11.520 octeți/s.

Verificarea parității

Protocolul USART are capacitatea de a monitoriza automat integritatea datelor folosind metoda parității biților. Când această caracteristică este activată, ultimul bit de date („bitul de paritate”) este întotdeauna 1 sau 0, astfel încât numărul de unități dintr-un octet este întotdeauna par.

Controlul debitului

Pe vremuri, dispozitivele USART puteau fi atât de lente încât nu puteau ține pasul cu fluxul de date primit. Pentru a rezolva această problemă, modulele USART au fost prevăzute cu ieșiri și intrări separate de control al fluxului. Când tamponul de intrare a fost plin, logica USART de recepție a stabilit nivelul de inhibare la ieșirea corespunzătoare, iar USART de transmisie a suspendat transmisia. Ulterior, controlul fluxului a fost atribuit protocoalelor de comunicare, iar nevoia de linii separate de control al fluxului a dispărut treptat.

Implementare fizică.

USART este un protocol de schimb, de ex. determină metoda de formare a biților, parametrii de transmisie a octetilor, viteza de transmisie etc.

Dar implementarea fizică a USART poate fi diferită. De exemplu, pentru a transmite date într-o singură placă, semnalele sunt transmise la niveluri de +5V și 0V. Pentru a transfera date pe distanțe mari și între dispozitive, se folosesc alte niveluri și standarde fizice de tensiune, cum ar fi: bucla de curent (4-20 mA), RS-232 (port COM), RS-485 și altele asemenea.

Pentru a converti nivelurile „controller” de 0-5V în niveluri „standard”, există un număr mare de microcircuite specializate, de exemplu ADM202 pentru RS-232.

Interfață serială SPI

Numele SPI este o abreviere pentru "Serial Peripheral Bus", care reflectă scopul său - o magistrală pentru conectarea dispozitivelor externe. Autobuzul SPI este organizat după principiul master-slave. Master-ul de magistrală este de obicei un microcontroler, dar poate fi și logic programabil, un controler DSP sau un ASIC. Dispozitivele conectate la master sunt 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.

Blocul de construcție principal al interfeței SPI este un registru de deplasare convențional, a cărui sincronizare și semnalele de intrare/ieșire ale fluxului de biți formează semnalele de interfață. Astfel, este mai corect să numim protocolul SPI nu un protocol de transfer de date, ci un protocol de schimb de date între două registre de deplasare, fiecare dintre acestea îndeplinind simultan atât funcția de receptor, cât și de emițător. O condiție prealabilă pentru transmiterea datelor pe magistrala SPI este generarea unui semnal de sincronizare a magistralei. Numai liderul are dreptul de a genera acest semnal, iar munca sclavului depinde complet de el.

Conexiune.

Există trei tipuri de conexiune la magistrala SPI, fiecare dintre ele implicând patru semnale. Scopul semnalelor SPI este descris în Tabelul 7.1.

Cea mai simplă conexiune, care implică doar două microcircuite, este prezentată în Figura 7.2. Aici, masterul magistralei transmite date de-a lungul liniei MOSI sincron cu semnalul SCLK generat de acesta, iar slave captează biții de date transmise pe anumite margini ale semnalului de sincronizare recepționat. În același timp, slave își trimite pachetul de date. Circuitul prezentat poate fi simplificat prin eliminarea liniei MISO dacă IC-ul slave utilizat nu asigură transmiterea datelor de răspuns sau nu este nevoie de aceasta. Transferul de date unidirecțional poate fi găsit în cipuri precum DAC-uri, potențiometre digitale, amplificatoare programabile și drivere. Astfel, opțiunea avută în vedere pentru conectarea unui circuit integrat slave necesită 3 sau 4 linii de comunicație.

Pentru ca circuitul integrat slave să primească și să transmită date, pe lângă faptul că are un semnal de ceas, linia SS trebuie de asemenea să fie condusă la nivel scăzut. În caz contrar, circuitul integrat slave va fi inactiv. Atunci când este utilizat doar un singur circuit integrat extern, poate fi tentant să eliminați linia SS prin scăderea intrării de selectare a circuitului integrat slave. Această soluție este extrem de nedorită și poate duce la defecțiuni 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. 7.3), fie o conexiune în cascadă (serială) (Fig. 7.4). Conexiunea independentă este mai frecventă, deoarece obținut atunci când se utilizează orice cipuri compatibile cu SPI. Aici, toate semnalele, cu excepția selecției microcircuitelor, sunt conectate în paralel, iar masterul magistralei, transferând unul sau altul semnal SS într-o stare scăzută, specifică cu ce IC slave va face schimb de date. Principalul dezavantaj al acestei conexiuni este necesitatea unor linii suplimentare pentru adresarea cipurilor slave (numărul total de linii de comunicație este 3+n, unde n este numărul cipurilor slave).

Dacă nu există suficiente picioare de microcontroler, puteți utiliza un cip demultiplexor. Demultiplexorul conectează un singur semnal de intrare la unul dintre semnalele de ieșire, în funcție de codul de pe pinii de control. Figura 7.4 prezintă schema de conectare pentru demultiplexor. Semnalul SS este furnizat la intrarea sa, care ia o valoare egală cu 0 dacă este necesar să se selecteze unul dintre microcircuite. Numărul microcircuitului necesar în cod binar este furnizat picioarelor Am-A0. Acest lucru vă permite să reduceți numărul de picioare utilizate în microcontroler la m=log 2 n. Unde n este numărul de jetoane slave. Acestea. pentru a conecta 128 de dispozitive, sunt necesari 8 pini de microcontroler. Unul pentru setarea semnalului de activare și 7 pentru setarea numărului de cip care urmează să fie pornit. Trebuie remarcat faptul că trebuie să existe unul logic pe picioarele neconectate ale demultiplexorului. În caz contrar, se folosește un invertor de semnal, care convertește un zero logic într-unul logic.

Comutarea în cascadă nu are acest dezavantaj, deoarece aici, mai multe cipuri formează un registru de deplasare mare. Pentru a face acest lucru, ieșirea datelor de transmisie a unui circuit integrat este conectată la intrarea de recepție a datelor a celuilalt, așa cum se arată în Figura 3. Intrările de selectare a cipului sunt conectate aici în paralel și, astfel, numărul total de linii de comunicație este menținut egal. la 4. Cu toate acestea, utilizarea conexiunii în cascadă este posibilă numai dacă suportul acesteia este indicat î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ă.

Protocol de transfer

Protocolul de transmisie prin interfața SPI este în esență identic cu logica registrului de deplasare (Figura 7.6), care constă în efectuarea unei operații de deplasare și, în consecință, intrarea și ieșirea pe biți a datelor pe anumite margini ale semnalului de sincronizare. Setarea datelor în timpul transmisiei și eșantionarea în timpul recepției sunt întotdeauna efectuate pe margini opuse ale ceasului. Acest lucru este necesar pentru a se asigura că datele sunt eșantionate odată ce acestea au fost stabilite în mod fiabil. Dacă luăm în considerare că prima muchie din ciclul de transmisie poate fi o muchie ascendentă sau descendentă, 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ă terminarea acestuia are un nivel scăzut (adică prima margine este în creștere, iar ultima este în scădere); în caz contrar, dacă CPOL=1, - mare (adică primul front scade, iar ultimul se ridică));

· CPHA - faza de sincronizare; Acest parametru determină ordinea în care datele sunt instalate și preluate. Dacă CPHA=0, atunci pe marginea ascendentă a ciclului de ceas datele vor fi eșantionate, iar apoi pe frontul descendent datele vor fi setate. Dacă CPHA=1, atunci instalarea datelor va fi efectuată pe marginea ascendentă în ciclul de sincronizare, iar eșantionarea se va efectua pe marginea descendentă.

Informațiile despre modurile SPI sunt prezentate în figurile 7.7 și 7.8.

Cipurile master și slave care funcționează în diferite moduri SPI sunt incompatibile, prin urmare, înainte de a alege cipurile slave, este important să clarificăm care moduri sunt acceptate de masterul magistralei. Modulele hardware SPI integrate în microcontrolere, în cele mai multe cazuri, acceptă posibilitatea de a selecta orice mod și, prin urmare, este posibil să se conecteze la ele orice cip SPI slave (se aplică doar unei opțiuni de conectare independente). În plus, protocolul SPI în oricare dintre moduri este ușor de implementat în software.

Interfață RS-485

Interfața RS-485 (un alt nume este EIA/TIA-485) este unul dintre cele mai comune standarde de nivel de comunicare fizică. Stratul fizic este un canal de comunicare și o metodă de transmitere a semnalului (nivelul 1 al modelului de interconectare a sistemelor deschise OSI).

O rețea construită pe interfața RS-485 constă din transceiver conectate folosind o pereche răsucită - două fire răsucite. Interfața RS-485 se bazează pe principiul transmisiei diferențiale (echilibrate) de date. Esența sa este de a transmite un semnal pe două fire. Mai mult, un fir (condițional A) poartă semnalul original, iar celălalt (condițional B) poartă copia sa inversă. Cu alte cuvinte, dacă există un „1” pe un fir, atunci un „0” pe celălalt și invers. Astfel, există întotdeauna o diferență de potențial între cele două fire ale unei perechi răsucite: la „1” este pozitiv, la „0” este negativ (Figura 7.9).

Această diferență de potențial este cea care transmite semnalul. Această metodă de transmisie oferă o imunitate ridicată la interferența în modul comun. Interferența în modul comun este o interferență care afectează în mod egal ambele fire ale liniei. De exemplu, o undă electromagnetică care trece printr-o secțiune a unei linii de comunicație induce potențial în ambele fire. Dacă semnalul este transmis prin potențial într-un fir în raport cu comunul, ca în RS-232, atunci interferența pe acest fir poate distorsiona semnalul în raport cu comunul (masă) care absoarbe bine interferența. În plus, diferența de potențial de masă va scădea pe rezistența unui fir comun lung - o sursă suplimentară de distorsiune. Și cu transmisia diferențială, distorsiunea nu are loc. De fapt, dacă două fire se află aproape unul de celălalt și sunt chiar împletite, atunci ridicarea ambelor fire este aceeași. Potențialul în ambele fire încărcate egal se modifică în mod egal, în timp ce diferența de potențial informativ rămâne neschimbată.

Implementarea hardware a interfeței RS485.

Implementarea hardware a interfeței - cipuri transceiver cu intrări/ieșiri diferențiale (la linie) și porturi digitale (la porturile UART ale controlerului). Există două opțiuni pentru această interfață: RS-422 și RS-485.

RS-422 este o interfață full duplex. Recepția și transmisia au loc prin două perechi separate de fire. Nu poate exista decât un transmițător pe fiecare pereche de fire.

RS-485 este o interfață semi-duplex. Recepția și transmisia au loc pe o pereche de fire cu o separare de timp. Pot exista multe transmițătoare într-o rețea, deoarece acestea pot fi oprite în modul de recepție (Figura 7.10).

Explicația simbolurilor din Fig. 7.10

D (sofer) - emitator;
R (receptor) - receptor;
DI (driver input) - intrare digitală a transmițătorului;
RO (receiver output) - ieșire digitală a receptorului;
DE (activare șofer) - permisiunea de a opera transmițătorul;
RE (receiver enable) - permisiunea de a opera receptorul;
A - intrare/ieșire diferențială directă;
B - intrare/ieșire diferențială inversă;
Y - ieșire diferențială directă (RS-422);
Z - ieșire diferențială inversă (RS-422).

Să aruncăm o privire mai atentă la transceiver-ul RS-485. Ieșirea digitală a receptorului (RO) este conectată la portul UART al receptorului (RX). Intrarea digitală a transmițătorului (DI) către portul transmițătorului UART (TX). Deoarece receptorul și transmițătorul sunt conectate pe partea diferențială, emițătorul trebuie oprit în timpul recepției, iar receptorul trebuie oprit în timpul transmisiei. În acest scop, sunt utilizate intrările de control - permisiunea receptorului (RE) și permisiunea transmițătorului (DE). Deoarece intrarea RE este inversă, aceasta poate fi conectată la DE și poate comuta receptorul și transmițătorul cu un singur semnal de la orice port al controlerului. La nivelul "0" - lucrați pentru recepție, la "1" - pentru transmisie (Fig. 7.11).

Receptorul, care primește diferența de potențial (UAB) la intrările diferențiale (AB), le transformă într-un semnal digital la ieșirea RO. Sensibilitatea receptorului poate fi diferită, dar producătorii de cipuri transceiver scriu în documentație intervalul de prag garantat pentru recunoașterea semnalului. De obicei, aceste praguri sunt ±200 mV. Adică, când UAB > +200 mV - receptorul detectează „1” când UAB< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

Toate dispozitivele sunt conectate la un cablu torsadat în același mod: ieșiri directe (A) la un fir, ieșiri inverse (B) la celălalt.

Impedanța de intrare a receptorului pe partea de linie (RAB) este de obicei de 12KΩ. Deoarece puterea emițătorului nu este nelimitată, acest lucru creează o limită a numărului de receptoare conectate la linie. Conform specificației RS-485, ținând cont de rezistențele de terminare, transmițătorul poate conduce până la 32 de receptoare. Cu toate acestea, există o serie de microcircuite cu impedanță de intrare crescută, ceea ce vă permite să conectați semnificativ mai mult de 32 de dispozitive la linie.

Viteza maximă de comunicare conform specificației RS-485 poate atinge 10 Mbaud/sec. Distanța maximă este de 1200 de metri. Dacă este necesar să se organizeze comunicarea la o distanță mai mare de 1200 de metri sau să se conecteze mai multe dispozitive decât permite capacitatea de încărcare a emițătorului, se folosesc repetoare speciale.

Interfață I2C.

Această interfață a fost propusă de Philips, care a folosit-o pentru a organiza comunicarea între cipurile din televizoarele sale. I 2 C (abreviere pentru Inter-Integrated Circuit) este o magistrală serială asincronă bidirecțională. Din punct de vedere fizic, magistrala I 2 C constă din două linii de semnal, dintre care una (SCL) este destinată transmiterii unui semnal de ceas, iar a doua (SDA) pentru schimbul de date. Pentru controlul liniilor se folosesc trepte de ieșire cu colector deschis, astfel încât liniile de magistrală trebuie conectate la o sursă de alimentare de +5 V prin rezistențe cu rezistență de 1...10 kOhm, în funcție de lungimea fizică a liniilor și rata de transfer de date. Lungimea liniilor de conectare în modul standard poate ajunge la 2 metri, rata de transfer de date este de 100 kbit/s.

Toți abonații autobuzului sunt împărțiți în două clase - „Lider” și „Sclav”. Dispozitivul principal generează un semnal de ceas (SCL). Poate accesa independent magistrala și se adresează oricărui dispozitiv slave în scopul transmiterii sau primirii de informații. Toate dispozitivele slave „ascultă” magistrala pentru a-și detecta propria adresă și, după ce au recunoscut-o, efectuează operația prescrisă. În plus, așa-numitul mod „MultiMaster” este posibil, atunci când pe magistrală sunt instalate mai multe dispozitive master, care fie împărtășesc în comun dispozitive slave comune, fie acționează alternativ ca master atunci când ei înșiși inițiază schimbul de informații, fie ca sclavi atunci când așteaptă accesul de la un alt dispozitiv principal. Modul „MultiMaster” necesită monitorizarea constantă și recunoașterea conflictelor. În acest sens, acest mod este mai greu de implementat (adică implementare software) și, ca urmare, este mai rar folosit în produsele reale.

La momentul inițial de timp - în modul de așteptare - ambele linii SCL și SDA sunt într-o stare logică (tranzistorul etajului de ieșire cu colector deschis este închis). În modul de transmisie (Figura 7.12), bitul de date SDA este tactat de marginea ascendentă a SCL. Informațiile de pe linia SDA sunt modificate atunci când linia SCL este în starea zero. Dispozitivul slave poate „ține” linia SCL în starea zero, de exemplu, în timp ce procesează următorul octet recepționat, în timp ce dispozitivul master trebuie să aștepte până când linia SCL este eliberată înainte de a continua să transmită informații.

Pentru a sincroniza pachetele de magistrală I 2 C, se disting două condiții - „START” și „STOP”, limitând începutul și sfârșitul pachetului de informații (Figura 7.13). Pentru a codifica aceste condiții, se folosește o modificare a stării liniei SDA cu o singură stare a liniei SCL, ceea ce este inacceptabil la transmiterea datelor. Condiția „START” se formează atunci când apare o margine descendentă pe linia SDA, când linia SCL este într-o singură stare și invers, condiția „STOP” se formează atunci când apare o margine ascendentă pe linia SDA când SCL linia este într-o singură stare.

Transmisia de date începe pe prima margine ascendentă de pe linia SCL, care tacizează bitul cel mai semnificativ din primul octet de informații. Fiecare octet de informare (8 biți) conține 9 perioade de ceas ale liniei SCL. În cel de-al nouălea ciclu, dispozitivul de recepție emite o confirmare (ACK) - o margine descendentă care indică recepția datelor. Trebuie remarcat faptul că orice abonat de magistrală, atât master cât și slave, poate fi în momente diferite atât un transmițător, cât și un receptor și, în conformitate cu modul, trebuie fie să primească, fie să emită un semnal ACK, a cărui absență este interpretată. ca o eroare.

Pentru a începe o operațiune de schimb de date, dispozitivul master emite o condiție „START” pe magistrală. Condiția „START” este urmată de un octet cu adresa dispozitivului slave (Figura 7.14), constând dintr-o adresă de dispozitiv pe șapte biți (biții 1...7) și un flag de operație de citire-scriere de un bit - „ R/W” (bit 0). Bitul R/W determină direcția de schimb, cu 0 însemnând transfer de date de la master la slave (Figura 7.14a) și 1 însemnând citirea de la slave (Figura 7.14b). Toți biții de pe magistrala I 2 C sunt transmiși în ordine de la mare la scăzut, adică al 7-lea bit este transmis primul, al 0-lea ultimul. Adresa poate fi urmată de unul sau mai mulți octeți de informații (în direcția specificată de steag-ul R/W), ai căror biți sunt tactați de către master pe magistrala SCL.

Când efectuează o operație de citire, gazda trebuie să ACK pentru octetul citit dacă dorește să citească următorul octet și să nu emită un ACK dacă este pe cale să termine citirea pachetului (vezi Figura 7.14b).

Este permisă reluarea adresei dispozitivului slave de mai multe ori într-un singur ciclu de transmisie, adică transmiterea unei stări repetate „START” fără o condiție anterioară „STOP” (Figura 7.14c).

Este necesar să rețineți câteva caracteristici ale cipurilor de memorie care funcționează prin interfața I 2 C și procedurile de schimb de date cu acestea. În primul rând, memoria de date nevolatilă a acestor microcircuite este împărțită în pagini de memorie, astfel încât atunci când este scris un octet, întreaga pagină este mai întâi copiată în memoria RAM internă a microcircuitului, unde se schimbă celula dorită. După aceasta, pagina veche este ștearsă și în locul ei se scrie una nouă. O altă caracteristică este că cei mai semnificativi patru biți ai adresei slave trebuie să fie întotdeauna egali cu 1010. Această cerință este reglementată chiar de Philips.

Autobuzul cu 1 fir folosește un singur conductor pentru comunicare și alimentare. Modul de comunicare este asincron și semi-duplex, care urmează cu strictețe modelul master-slave. Unul sau mai multe dispozitive slave pot fi conectate la aceeași magistrală în același timp. Doar un dispozitiv master poate fi conectat la o magistrală.

Starea inactiv a magistralei corespunde unui nivel ridicat, care este generat de un rezistor pull-up. Valoarea rezistenței de pull-up este dată în documentația pentru circuitul integrat slave. Toate cipurile conectate la magistrală trebuie să poată produce un nivel scăzut. Dacă ieșirea microcontrolerului nu acceptă trei stări, atunci este necesar să furnizați un driver care are un colector deschis sau o ieșire de scurgere deschisă

Transmisia semnalului prin magistrala 1-Wire este împărțită în intervale de timp cu o durată de 60 µs. Doar un bit de date este transmis pe interval de timp. Dispozitivele slave pot avea diferențe semnificative față de întârzierile nominale. Cu toate acestea, acest lucru necesită o sincronizare mai precisă din partea liderului pentru a asigura o comunicare corectă cu subordonații care au baze de timp diferite.

Semnale de bază ale magistralei.

Maestrul inițiază fiecare comunicare la nivel de biți. Aceasta înseamnă că transmisia fiecărui bit, indiferent de direcție, trebuie să fie inițiată de master. Acest lucru se realizează prin setarea magistralei la un nivel scăzut, care sincronizează logica tuturor celorlalte dispozitive. Există 5 comenzi principale pentru comunicarea prin magistrala 1-Wire: „Scrieți jurnalul. 1”, „Scrieți jurnalul. 0”, „Citește”, „Resetare” și „Prezență”.

Semnal „Scrieți jurnalul. 1"

Semnal „Scrieți jurnalul. 1” este prezentat în Fig. 7.15. Masterul setează nivelul scăzut pentru 1...15 µs. După aceasta, eliberează autobuzul pentru restul intervalului de timp.

Orez. 7.15 – Semnal „Write log. 1"

Semnal „Scrieți jurnalul. 0"

Semnal „Scrieți jurnalul. 0” este prezentat în Figura 7.16. Masterul generează un nivel scăzut pentru cel puțin 60 μs, dar nu mai mult de 120 μs.

Fig 7.16 – Semnal „Write log. 0"

Semnal de citire

Semnalul „Citește” este prezentat în Fig. 7.17. Masterul setează nivelul scăzut pentru 1...15 µs. Sclavul ține apoi magistrala la nivel scăzut dacă dorește să transmită un jurnal. 0. Dacă este necesar să transferați jurnalul. 1, apoi pur și simplu eliberează linia. Scanarea magistralei trebuie efectuată în termen de 15 µs de la scaderea magistralei. Când este privit din partea masterului, semnalul „Citește” este, în esență, un semnal „Jurnal de scriere”. 1". Starea internă reală a slave va fi determinată de semnalul „Înregistrare jurnal”. 1" sau "Lectură".

Figura 7.17 – Semnal „Citire”.

Resetare/semnal de prezență

Semnalele „Resetare” și „Prezență” sunt prezentate în Figura 7.18. Vă rugăm să rețineți că intervalele de timp ale pulsului sunt diferite. Master-ul trage jos pentru 8 intervale de timp (480 µs) și apoi eliberează magistrala. Această perioadă lungă de stare scăzută se numește semnal „Resetare”.

Dacă un slave este prezent pe magistrală, acesta trebuie să seteze un nivel scăzut pentru cel puțin 60 µs după ce masterul eliberează magistrala. Acest răspuns se numește „Prezență”. Dacă un astfel de semnal nu este detectat, atunci comandantul trebuie să presupună că nu există dispozitive conectate la magistrală și că nu este posibilă nicio comunicare ulterioară.

USB (Universal serial bus) a fost dezvoltat pentru conectarea rapidă a dispozitivelor externe la un computer personal și apoi găsirea și instalarea software-ului necesar. Dispozitivele cu putere redusă sunt alimentate direct prin interfață.

Standardul USB implică prezența unui singur dispozitiv Master (gazdă) în rețea. Mai mult, standardul acceptă până la 127 de dispozitive slave în rețea. Pentru a face distincția între dispozitivele master și slave, au fost dezvoltate diferite tipuri de conectori (Figura 7.19): Tip A pentru master și Tip B pentru slave. Se accepta ca tensiunea de 5V este prezenta doar la conectorul de tip A, care este conectorul master. Restul dispozitivelor sunt alimentate direct de la acesta.

Standardul USB utilizează 4 fire ecranate, dintre care două transmit putere (+5v și GND) (Figura 7.19 și Tabelul 7.2). Celelalte două reprezintă semnale de date diferențiale cu perechi răsucite. Schema de codificare utilizată NRZI(Non Return to Zero Invert) pentru transmisia de date cu un câmp de sincronizare pentru sincronizarea ceasurilor master și slave.

Standardul USB 2.0 a introdus standardul On-The-Go (OTG), care a introdus Protocolul de negociere gazdă, care permite două dispozitive USB să convină asupra cine va acționa ca master. Acest lucru este destinat și limitat la conexiuni punct-la-punct unice, cum ar fi un telefon mobil la un computer personal.

USB acceptă conexiune „fierbinte” (plug’n’play) cu drivere încărcate și descărcate dinamic. Utilizatorul pur și simplu conectează dispozitivul, conectându-l astfel la magistrală. Gazda detectează conexiunea, interogează dispozitivul nou introdus și încarcă driverul corespunzător, indicând momentul încărcării cu o clepsidră pe ecran (dacă driverul pentru dispozitivul USB este deja instalat în sistem). Utilizatorului final nu îi pasă de reziliere sau IRQ(întreruperi) și adresele portului, nici despre repornirea computerului (nu este necesară repornirea). Când utilizatorul a terminat cu dispozitivul USB, pur și simplu îl scoate (sau deconectează cablul), gazda va detecta absența dispozitivului și va descărca automat driverul.

Versiunea SB 1.1 acceptă două viteze - modul de viteză maximă cu o viteză de 12 Mbiți/s și modul de viteză redusă cu o viteză de 1,5 Mbiți/s. Modul de 1,5 Mbits/s este mai lent și mai puțin sensibil la EMI (interferență), ceea ce reduce costul granulelor de ferită și reduce cerințele pentru calitatea componentelor.

Cablul de magistrală de viteză maximă este un cablu cu pereche răsucită, protejat de un ecran și poate fi folosit și pentru funcționarea la viteză mică. Un cablu pentru funcționare numai la viteză minimă (de exemplu, pentru a conecta un mouse) poate fi orice și neecranat.

Standardul USB 2.0 introduce un mod High Speed ​​cu o rată de transfer de date de 480Mbits/s.

Transfer de date.

Toate transferurile de date prin interfață sunt inițiate de gazdă. Datele sunt transmise sub formă de pachete. Interfața USB utilizează mai multe tipuri de pachete:

A) semnează pachetul (pachet de jetoane) descrie tipul și direcția transferului de date, adresa dispozitivului și numărul de serie al punctului final (CT este partea adresabilă a dispozitivului USB); Există mai multe tipuri de pachete de caracteristici: ÎN, OUT, SOF, ÎNFIINȚAT;

B) pachet de date (pachet de date) conține datele transmise;

B) pachet de aprobare (pachet de strângere de mână) are scopul de a raporta rezultatele transferului de date; Există mai multe tipuri de pachete de coordonare: ACK, N.A.K., STAND.

Transferul de date prin USB se realizează după cum urmează:

Primul pachet, așa-numitul token, este generat de dispozitivul principal pentru a descrie tipul de date care sunt transferate, operația de transfer (citire sau scriere), adresa dispozitivului și punctul final. Următorul transmis de obicei este un pachet de date care transportă informații utile, urmat de un pachet de handshaking care indică faptul că datele sau jetonul au fost primite cu succes, sau punctul final este blocat sau indisponibil pentru a accepta date.

Punctele finale din standardul USB sunt sursele și absorbantele de date. Toate dispozitivele trebuie să accepte punctul final 0. Acesta este punctul final care acceptă toate solicitările de control și stare în timpul enumerarii (o cerere de gestionare pentru a determina tipul de dispozitiv atașat) și atâta timp cât dispozitivul rămâne operațional pe magistrală.

Punctele finale numerotate de la 1 sunt folosite pentru a transmite informații despre utilizator. Să ne uităm la câteva exemple.

Driverul dispozitivului transmite către punctul final al dispozitivului principal EP1. Deoarece Acest dispozitiv este master, apoi datele intră în tamponul OUT EP1. În acest caz, este trimis un token OUT, care indică faptul că datele sunt gata pentru a fi trimise. După ce a primit acest token, dispozitivul slave poate citi date din buffer-ul OUT.

Dacă dispozitivul slave trebuie să transfere date către master, le plasează în buffer-ul IN. Acest buffer va reține date până când dispozitivul master trimite un token IN care solicită date de la punctul final. Toate bufferele punctelor finale sunt denumite relativ la master, adică. Bufferul de ieșire al dispozitivului slave se numește IN deoarece este tamponul de intrare pentru dispozitivul master.

Transferul de date de la un punct final la altul se face prin fluxuri. Flux – O conexiune logică între o gazdă și un punct final.

Fluxurile au, de asemenea, un set de parametri precum tipul de transmisie (Control, Bulk, Iso sau Interrupt), direcția fluxului de date și dimensiunea maximă a pachetelor/bufferului.

De exemplu, fluxul implicit este un flux bidirecțional compus din punctul final IN 0 și punctul final OUT 0 cu control tip transfer.

USB definește două tipuri de conducte

A) Conducte de curgere nu au un format USB predefinit, astfel încât puteți trimite orice tip de date prin conducta de flux și puteți recupera datele de la celălalt capăt. Fluxurile de date sunt secvențiale și au o direcție predeterminată - IN sau OUT. Conductele de flux acceptă tipuri de transfer în vrac, izocron și întrerupt. Conductele de flux pot fi controlate fie de la gazdă, fie de la dispozitiv.

B) Conducte de mesaje au un format USB predefinit. Sunt controlate de gazdă, inițiate printr-o solicitare trimisă de la gazdă. Datele sunt trimise în direcția dorită specificată în cerere. Astfel, conductele de mesaje permit transferul datelor în ambele direcții, dar suportă doar transferuri de control.

Standardul USB descrie patru tipuri de transfer de date:

A) Redirecționarea controlului (transferul de control) este utilizat pentru configurarea dispozitivului, precum și în alte scopuri specifice dispozitivului.

B) Streaming (transfer în vrac) este folosit pentru a transmite o cantitate relativ mare de informații.

B) Întreruperea redirecționării (întreruperea transferului) este folosit pentru a transmite o cantitate relativ mică de informații, pentru care transmiterea acesteia la timp este importantă. Are o durată limitată și o prioritate mai mare în comparație cu alte tipuri de transferuri.

D) Redirecționare izocronă (transfer izocron) se mai numește și streaming în timp real. Informațiile transmise într-un astfel de transfer necesită o scară în timp real în timpul creării, transmiterii și recepției sale.

Transferuri în flux caracterizat prin transferul de date garantat fără erori între gazdă și funcție prin detectarea erorilor în timpul transmiterii și re-solicitarea de informații. Când gazda devine gata să primească date de la o funcție, trimite un pachet de semnalizare către funcție ÎN-punga de plastic. Ca răspuns la aceasta, funcția din faza de transfer de date transmite un pachet de date către gazdă sau, dacă acesta

În acest articol, vreau să ofer o scurtă prezentare a magistralei SPI (o interfață utilizată pe scară largă în tehnologia încorporată, folosită pentru a conecta diverse dispozitive) și să încerc să descriu procesul de creare a unui driver la nivel de protocol de dispozitiv SPI pentru Linux. Acest document nu se dorește a fi un ghid complet, ci mai degrabă își propune să îndrepte direcția corectă. Deoarece articolul nu se încadra într-un singur subiect, a trebuit să-l împart în două părți.

0. În loc de introducere

Ce fel de articol este acesta?
Acest articol este o compilație de informații din diverse surse, o traducere gratuită a unor părți ale documentației, precum și propriile mele comentarii, completări și descrieri ale problemelor apărute.

Pentru cine este acest articol?
În primul rând, pentru începători, ceea ce sunt. Pe forumurile Linux încorporate puteți întâlni adesea întrebarea: „Cum pot lucra cu SPI pe această placă?” Exact asta voi încerca să răspund. Ca exemplu, voi da codul scris pentru a funcționa cu dispozitivul meu SPI de testare.

Structura articolului
Datorită faptului că au existat destul de multe informații, articolul este împărțit în mai multe subsecțiuni:

  1. Ce este SPI?
  2. Prezentare generală a subsistemului SPI în Linux
  3. Dezvoltarea unui driver SPI pentru protocolul userspace folosind spidev
  4. Dezvoltarea unui driver de protocol SPI la nivel de kernel
  5. Documentație
Primele două puncte vor fi incluse în prima parte a articolului, restul vor fi incluse în a doua.

Prima subsecțiune descrie funcționarea magistralei SPI, această parte a articolului nu este legată în mod specific de Linux, așa că poate fi citită de cei care nu sunt interesați de Linux, dar trebuie doar să obțină informații despre această interfață.

A doua subsecțiune descrie structurile și mecanismele care stau la baza lucrului cu SPI în Linux, trebuie citit pentru a înțelege ceea ce va fi discutat în partea a treia și a patra.

Dacă nu sunteți interesat de traducerile și completările mele, puteți sări în siguranță direct la partea a cincea, unde puteți găsi informații despre unde să obțineți toate informațiile necesare despre această problemă.

Erori
Nu sunt magician, doar învăț. Dacă găsiți erori sau inexactități, vă rugăm să-mi spuneți.

1. Ce este SPI?

Abrevierea SPI înseamnă „Interfață periferică serială” sau în versiunea rusă „interfață periferică serială”. Numele vorbește de la sine; această interfață este folosită pentru a lucra cu diverse dispozitive periferice. De exemplu, acestea ar putea fi diferite DAC/ADC-uri, potențiometre, senzori, expansoare de porturi de intrare/ieșire (GPIO), diverse memorii și chiar periferice mai complexe, cum ar fi codecuri audio și controlere Ethernet.

Din punct de vedere tehnic, SPI este o magistrală sincronă cu patru fire. Este o conexiune a două registre de deplasare sincrone, care este elementul central al oricărui dispozitiv SPI. Conexiunea folosește o configurație master/slave. Numai masterul poate genera impulsuri de sincronizare. Există întotdeauna un singur master în circuit (spre deosebire de aceeași magistrală I2C, unde este posibilă o opțiune cu mai mult de un master), numărul de slave poate fi diferit. În general, ieșirea master este conectată la intrarea slave și invers, ieșirea slave este conectată la intrarea master. Când impulsurile de ceas sunt aplicate la ieșirea SCK, datele sunt împinse de către master de la ieșirea MOSI și capturate de către slave la intrarea MISO. Astfel, dacă aplicați numărul de impulsuri de sincronizare corespunzător lățimii de biți a registrului de deplasare, atunci datele din registre vor schimba locuri. Rezultă că SPI funcționează întotdeauna în modul full duplex. Dar dacă avem nevoie de datele primite de la dispozitiv atunci când înregistrăm vreun parametru este o altă întrebare. Se întâmplă adesea ca datele primite de la dispozitiv la scrierea datelor pe acesta să fie gunoi, caz în care pur și simplu sunt ignorate, dar le vom primi indiferent de dorința noastră.

Controlerul SPI este implementat de obicei ca o unitate periferică într-un MCU sau eMPU. În majoritatea cipurilor poate funcționa fie în modul master, fie în modul slave. Dar în acest moment, Linux acceptă doar modul Master.

Există mai multe moduri de a activa dispozitivele SPI.

Cele mai simple dintre ele le puteți vedea în imaginea de mai sus (mulțumim Wikipedia pentru imagini sub licența gratuită GFDL). În acest caz, toate slavele sunt conectate la master în paralel, cu excepția semnalului de selectare a slave (~CS). Fiecare slave necesită un semnal separat de selectare a slave (etichetat SSx în figură). Pentru semnalele de selecție slave, pot fi utilizate fie ieșiri dedicate controlerului SPI, fie porturi de intrare/ieșire de uz general (GPIO) de pe microcontroler.

Pentru transmisia datelor sunt utilizate două fire, unul pentru furnizarea de impulsuri de ceas și un semnal de selectare a slave pentru fiecare dintre slave.
Descrierea semnalelor utilizate:

  • MOSI - Ieșire master, intrare slave (ieșire master, intrare slave). Acest semnal este destinat transmiterii de date în serie de la master la slave. Poate fi numit și SDO, DO etc.
  • MISO - Intrare Master, Ieșire Slave (intrare master, ieșire slave). Acest semnal este destinat transmiterii de date în serie de la slave la master. Poate fi numit SDI, DI etc.
  • SCK - Serial Clock (semnal de sincronizare). Folosit pentru sincronizare în timpul transferului de date. Poate fi numit și SCLK, CLK etc.
  • ~CS - Selectare cip (selectare cip). Acest semnal activează dispozitivul slave. De obicei este invers, adică un nivel scăzut este considerat activ. Uneori se numește ~SS (Slave Select, rusă „alegerea sclavului”).

Un caz special de conexiune independentă este opțiunea cu un singur slave. În acest caz, este posibil să doriți să trageți semnalul ~CS la masă, astfel încât dispozitivul să fie întotdeauna în starea activă. Dar acest lucru nu este recomandat, deoarece dispozitivul slave poate folosi semnalul CS pentru inițializare sau pentru alte scopuri de service.

Principalul dezavantaj al conectării slave în mod independent este că fiecare slave necesită un semnal ~CS separat. Schema de conectare în cascadă, numită „daisy-chain” în literatura străină (poate fi tradusă ca „ghirlandă”), nu are un astfel de dezavantaj.

După cum puteți vedea din figura de mai sus, acesta folosește un semnal comun de selectare a slave pentru toate slave. Ieșirea fiecărui slave este conectată la intrarea următorului. Ieșirea ultimului slave este conectată la intrarea masterului, formând astfel un circuit închis. Cu această conexiune, putem considera că dispozitivele conectate în serie formează un registru mare de deplasare. În consecință, datele pot fi scrise pe toate dispozitivele „într-o singură ședință”, având colectat în prealabil pachetul necesar care combină datele pentru fiecare dispozitiv în ordinea corespunzătoare ordinii fizice a conexiunii. Dar există un punct subtil aici. În primul rând, toate cipurile trebuie să suporte acest tip de conexiune; în al doilea rând, kernel-ul Linux nu acceptă acest tip de conexiune, așa că dacă tot vrei să-l folosești, va trebui să modifici driverele existente sau să le scrii pe ale tale.

Există patru moduri de operare pentru dispozitivele SPI. De regulă, ei sunt cei care provoacă cea mai mare confuzie în rândul începătorilor. Aceste patru moduri sunt o combinație de doi biți:

  • CPOL (Clock Polarity) - determină nivelul inițial (polaritatea) semnalului de ceas.
    CPOL=0 indică faptul că semnalul de ceas începe la nivel scăzut, astfel încât marginea anterioară se ridică și marginea posterior coboară.
    CPOL=1, semnalul ceasului începe la un nivel ridicat, astfel încât marginea anterioară scade și marginea posterior crește.
  • CPHA (Clock Phase) - faza de sincronizare, determină din care dintre marginile semnalului de ceas să eșantioneze datele.
    CPHA=0 indică faptul că este necesară eșantionarea pe marginea anterioară și
    CPHA=1 indică faptul că datele trebuie eșantionate pe o margine descendentă.
Acești doi biți formează numărul modului. CPOL este bitul cel mai semnificativ și CPHA este bitul cel mai puțin semnificativ. Uneori, documentația dispozitivului nu indică în mod explicit numărul modului, dar acesta poate fi întotdeauna determinat cu ușurință din diagramele de timp. De asemenea, este important să înțelegeți că eșantionarea și setarea datelor au loc întotdeauna pe margini opuse ale semnalului de ceas. De exemplu, lăsați dispozitivul nostru să funcționeze în modul 0 (cea mai comună opțiune), în acest caz, dispozitivul slave va citi un bit de date de la intrarea MOSI pe frontul ascendent al semnalului de ceas, iar dispozitivul master va citi date de la slave la intrarea MISO tot pe marginea ascendentă înainte . Pentru o mai mare claritate, voi furniza oscilograme pentru toate cele patru moduri de funcționare:

Această figură arată semnalele MOSI (linia albastră) și SCK (linia galbenă). În toate cazurile, se transmite numărul 0x64. Liniile verticale ușoare indică momentul în care datele au fost eșantionate. Să luăm în considerare modul 2, pentru care, după cum ne amintim, CPOL=1 și CPHA=0. Astfel, vedem că semnalul de sincronizare are inițial un nivel ridicat, iar eșantionarea se realizează de-a lungul muchiei de atac (în acest caz, muchiei de cădere). Deoarece osciloscopul meu are doar două canale, semnalele ~CS și MISO nu sunt afișate. Dar în acest caz nu sunt atât de interesante, de exemplu, semnalul ~CS este pur și simplu un „eșec” pe toată durata transmisiei de date.

2. Prezentare generală a subsistemului SPI în Linux

Driverele SPI din Linux sunt împărțite în două părți. Primul este driverele de controler SPI, care funcționează direct cu hardware-ul unui anumit controler. Astfel de drivere determină modul de configurare a controlerului, ce acțiuni trebuie întreprinse când intră în modul de consum redus (suspend) și ieși din acesta (reluare), selectând următorul transfer (spi_transfer) din coada de transfer într-un mesaj (spi_message, despre cozile de mai jos) și trimiterea directă către un port, este definită și ca activarea/dezactivarea unui anumit dispozitiv prin CS (funcții cs_activate/cs_deactivate). În acest articol nu voi descrie acest tip de șofer. De regulă, acestea sunt deja implementate pentru acele MCU/eMPU-uri pentru care există un port Linux și trebuie să intrați în ele doar dacă aveți nevoie de o funcție specifică, cum ar fi Chip Select Decoding, pentru a putea activa dispozitivul slave dorit. printr-o logică externă. Uneori, acest lucru este util, de exemplu în cazul deficienței GPIO.

A doua parte este driverele de protocol utilizate pentru a lucra cu diferite dispozitive slave care sunt conectate la magistrala SPI. Aceste drivere sunt numite drivere „protocol”, deoarece trimit și primesc doar diverse date de la dispozitivele slave, fără a lucra direct cu niciun hardware. Acest tip de driver este cel mai interesant pentru noi, deoarece ne permite să adăugăm suport pentru dispozitivul slave de interes pentru sistem, ceea ce vom lua în considerare.

Majoritatea driverelor de protocol sunt module kernel. De exemplu, dacă dispozitivul este un codec audio conectat prin SPI, atunci driverul va folosi și funcțiile oferite de ALSA, iar programele (de exemplu, madplay) vor putea lucra cu acesta prin intermediul dispozitivului de caractere /dev/audio, fără a avea nici cea mai mică idee despre cum este construit în hardware și la ce magistrală este conectat.

Nucleul oferă, de asemenea, un driver de protocol de uz general numit spidev, cu o interfață de dispozitiv cu caractere. Vă permite să efectuați apeluri semi-duplex către dispozitivul slave SPI utilizând apeluri de sistem standard read() și write(), setați modul de operare și, de asemenea, efectuați schimb de date full-duplex folosind apeluri ioctl().

Astfel, driverele de protocol pentru dispozitivele SPI pot fi împărțite în două tipuri:

  • drivere pentru spațiul utilizatorului care funcționează în spațiul utilizatorului și sunt programe obișnuite în orice limbă care funcționează cu un dispozitiv SPI prin citirea/scrierea dispozitivului de caractere spidev corespunzător.
  • Drivere care rulează în spațiul kernel și oferă o interfață cu spațiul utilizatorului prin fișierele dispozitivului din directorul /dev sau prin atribute din directorul dispozitivului din sysfs.
Linux pune în coadă toate apelurile către dispozitivele SPI. Driverele de protocol SPI operează explicit sau implicit cu mesaje reprezentate de structura struct spi_message, care este o tranzacție SPI cu mai multe segmente.
struct spi_message ( struct list_head transfers; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; unsigned actual_length; int status; struct list_head queue; void *state; );
transferuri - lista legată de segmente transferate într-o tranzacție (transferuri);
spi - pointer către dispozitivul spi în a cărui coadă se află acest mesaj;
is_dma_maped - dacă acest flag este adevărat, atunci ambele adrese virtuale dma și cpu sunt furnizate pentru fiecare buffer de transmisie;
complete - un apel invers apelat pentru a indica sfârșitul unei tranzacții;
context - argument pentru apelul complet();
real_length - numărul total de octeți care au fost transmisi în toate transferurile reușite;
status - 0 în caz de succes, sau o valoare negativă cu errno în caz de eroare;

Etichete:

  • linux
  • spi
  • spidev
  • încorporat
  • modulul nucleului
Adaugă etichete

Cu valori de la 10 Ohm la 1 MOhm);

  • fire de conectare (de exemplu, acesta este un set bun);
  • computer personal cu mediu de dezvoltare Arduino IDE.
  • 1 Descrierea serialului Interfață SPI

    SPI - Serial Peripheral Interface sau „Serial Peripheral Interface” este un protocol de transfer de date sincron pentru împerechere dispozitiv principal Cu dispozitive periferice (slave). Dispozitivul principal este adesea un microcontroler. Comunicarea între dispozitive are loc pe patru fire, motiv pentru care SPI este uneori numită „interfață cu patru fire”. Acestea sunt anvelopele:

    Există patru moduri de transfer de date ( SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), cauzată de combinarea polarității impulsurilor de ceas (lucrăm la nivelul ÎNALT sau JOS), Polaritatea ceasului, CPOL, și faza impulsurilor de ceas (sincronizare pe marginea ascendentă sau descendentă a pulsului de ceas), Faza ceasului, CPHA.

    Figura explică acest tabel.

    Interfața SPI oferă mai multe opțiuni pentru conectarea dispozitivelor slave: independentȘi cascadă. Când este conectat independent la magistrala SPI, dispozitivul master accesează fiecare dispozitiv slave individual. Cu o conexiune în cascadă, dispozitivele slave funcționează unul câte unul, ca în cascadă.


    Tipuri de conectare a dispozitivului pentru funcționare prin interfața SPI: independentă și în cascadă

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

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

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


    3 Biblioteca pentru munca cu interfata SPI

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

    Pentru a începe să utilizați 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ă instrucțiune: SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0))

    Aceasta înseamnă că inițializam protocolul SPI la o frecvență de 14 MHz, transmisia datelor are loc începând de la MSB (bitul cel mai semnificativ), în modul SPI_MODE0.

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

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

    După transfer ne întoarcem SS la stat ÎNALT.


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

    Este recomandabil să minimizați timpul de transfer între instrucțiunile SPI.beginTransaction() și SPI.endTransaction() pentru a evita problemele dacă alt dispozitiv încearcă să inițieze un transfer de date utilizând setări diferite.

    4 Conectarea unui registru de deplasare la Arduino

    Să luăm în considerare aplicarea practică a interfeței SPI. Vom aprinde LED-urile controlând un registru de deplasare de 8 biți prin magistrala SPI. Să ne conectăm la Arduino registru de deplasare 74HC595. Vom conecta un LED cu o valoare nominală de 220 Ohmi la fiecare dintre cele 8 ieșiri ale registrului printr-un rezistor limitator. Diagrama este prezentată în figură.


    5 Schiță pentru controlul unui registru de deplasare prin interfața SPI

    Să scriem o schiță ca aceasta.

    #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ă dispozitivele 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 )

    Mai întâi, să conectăm biblioteca SPI și să inițializam interfața SPI. Să definim pinul 8 ca pin de selecție a slave SS. Să ștergem 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 ca primul LED să se aprindă, furnizăm numărul binar 00000001, pentru al doilea - 00000010, pentru al treilea - 00000100 etc. Aceste numere binare, când sunt convertite în sistemul numeric zecimal, formează următoarea secvență: 1, 2, 4, 8, 16, 32, 64, 128 și sunt puteri a două de la 0 la 7.

    În consecință, în ciclu buclă() Pe baza numărului de LED-uri, recalculăm de la 0 la 7. Funcție pow (bază, grad) Ridica 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, valorile obținute în timpul acestei operațiuni sunt afișate pe monitorul portului serial: 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 unul câte unul și observăm un „val” de lumini. 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ă am conecta LED-urile direct la porturile digitale ale Arduino, ar trebui să folosim un port separat pentru fiecare LED.

    Am studiat cel mai simplu exemplu de lucru Arduino cu magistrala SPI. Vom analiza mai detaliat funcționarea mai multor registre de deplasare cu conexiuni independente și în cascadă într-un articol separat.