3.21. Noțiuni de bază despre SPI¶
SPI (Serial Peripheral Interface) este o magistrală serială sincronă proiectată pentru legături de scurtă distanță și viteză ridicată între un controler și unul sau mai multe periferice de pe aceeași placă. Este interfața standard pentru carduri SD, afișaje, memorie flash, ADC-uri și DAC-uri, precum și pentru o gamă largă de senzori.
Acolo unde UART nu avea un ceas comun și recupera sincronizarea chiar din linia de date, SPI rulează un fir de ceas alături de firele de date. Controlerul antrenează ceasul la orice rată dorește, iar fiecare alt dispozitiv de pe magistrală eșantionează datele în sincronizare cu acel ceas. Nu există presupuneri privind rata baud și nici suprasarcină de încadrare – doar muchii de ceas și biți.
3.21.1. Cele patru fire¶
O magistrală SPI full-duplex are patru fire:
SCK (ceas serial). Antrenat de controler. Fiecare bit este transferat la intrare sau la ieșire pe o muchie a acestui semnal.
MOSI (ieșire controler, intrare periferic). Linia de ieșire a controlerului; perifericul eșantionează biții de pe ea.
MISO (intrare controler, ieșire periferic). Linia de ieșire a perifericului; controlerul eșantionează biții de pe ea.
CS (chip select), uneori numită SS (peripheral select). O linie separată pentru fiecare periferic. Controlerul aduce CS la nivel jos pentru a începe o tranzacție și din nou la nivel înalt pentru a o încheia; orice periferic cu CS-ul său dezactivat ignoră complet magistrala și încetează să-și antreneze ieșirea MISO.
Un octet SPI: CS coboară la nivel jos pentru a selecta perifericul, SCK transferă opt biți, iar MOSI și MISO transferă fiecare câte un octet în direcții opuse.¶
Fiecare muchie de ceas mută câte un bit în fiecare direcție în același timp. Un singur impuls SCK trimite simultan un bit pe MOSI și primește un bit pe MISO – SPI este full-duplex la nivelul firelor. Software-ul nu trebuie să folosească ambele direcții: tranzacțiile doar de scriere și doar de citire sunt frecvente, linia neutilizată fiind fie ignorată, fie menținută la nivel înalt.
3.21.2. Polaritatea și faza ceasului¶
Doi biți de configurare decid exact ce muchie de ceas mută datele:
Polaritatea ceasului (
polarity, uneoriCPOL) – starea inactivă a SCK.0înseamnă că ceasul este inactiv la nivel jos și pulsează la nivel înalt;1înseamnă că ceasul este inactiv la nivel înalt și pulsează la nivel jos.Faza ceasului (
phase, uneoriCPHA) – pe ce muchie se eșantionează datele.0eșantionează pe prima muchie a fiecărui impuls de ceas (muchia anterioară);1eșantionează pe a doua muchie (muchia posterioară).
Împreună acestea oferă patru moduri, numite în mod convențional Modul 0 până la Modul 3. Modul 0 (polarity=0, phase=0) este cel mai frecvent și o valoare implicită sigură pentru dispozitive necunoscute.
Regula esențială este că ambele capete trebuie să fie de acord asupra modului. Modurile nepotrivite produc date corupte chiar dacă liniile de ceas și de date sunt cablate corect; dacă un dispozitiv returnează date fără sens la prima tranzacție, modul este primul lucru de verificat.
3.21.3. Periferice multiple¶
Mai multe periferice pot partaja aceleași linii SCK, MOSI și MISO atât timp cât fiecare are propria linie CS antrenată de controler:
Toate perifericele văd același ceas și aceleași date, dar fiecare urmărește propriul CS. Cu CS dezactivat (la nivel înalt), un periferic ignoră complet SCK și MOSI și lasă MISO într-o stare de înaltă impedanță, astfel încât să nu concureze cu alte dispozitive pentru linie.
Controlerul activează exact un singur CS la un moment dat, execută tranzacția și dezactivează CS pentru a elibera magistrala.
Un microcontroler cu un singur bloc SPI hardware poate comunica cu atâtea periferice câte pini GPIO liberi are disponibili pentru liniile CS – nu există adresare pe magistrala propriu-zisă.
3.21.4. Puncte forte și puncte slabe¶
Punctele forte și punctele slabe ale SPI decurg amândouă din designul său:
Rapid. Zeci de megahertzi sunt realizabili pe trasee scurte cu o conversie simplă de nivel. Cititoarele de carduri SD și afișajele SPI folosesc acest lucru.
Simplu la nivelul firelor. Fără adresare, fără confirmări, fără condiții speciale de start/stop – doar biți pe fire sincronizați cu un ceas.
Avid de pini. Trei linii partajate plus câte un CS pentru fiecare periferic. O placă cu cinci dispozitive SPI folosește opt pini (trei + cinci).
Scurtă distanță. SPI presupune muchii curate și rapide, ceea ce înseamnă trasee scurte pe aceeași placă. Pentru legături mai lungi, I2C sau una dintre magistralele cu încadrare este o alegere mai potrivită.