Tutorial: Arduino și magistrala SPI

acesta este primul din cele două capitole în care vom începe să investigăm magistrala de date SPI și cum putem controla dispozitivele care o folosesc cu sistemele noastre Arduino.

autobuzul SPI poate părea a fi o interfață complexă de stăpânit, cu toate acestea, cu un scurt studiu al acestei explicații și exemple practice, veți deveni în curând un maestru de autobuz! Pentru a face acest lucru, vom învăța teoria necesară și apoi o vom aplica controlând o varietate de dispozitive. În acest tutorial lucrurile vor fi păstrate cât mai simplu posibil.

dar în primul rând, ce este? SPI este un acronim pentru „Serial Peripheral Interface”. Este o magistrală de date seriale sincrone – datele pot călători în ambele direcții în același timp, spre deosebire de (de exemplu) magistrala I2C care nu poate face acest lucru. Pentru a permite transmiterea sincronă a datelor, magistrala SPI utilizează patru fire. Ele sunt numite:

  • MOSI – Master-out, Slave-in. Această linie transportă date de la Arduino la dispozitivul(dispozitivele) controlat (e) SPI;
  • MISO-Master – in, Slave out. Această linie transportă date de la dispozitivul(dispozitivele) controlat (e) SPI înapoi la Arduino;
  • SS – Slave-selectați. Această linie spune dispozitivul pe autobuz dorim să comunice cu ea. Fiecare dispozitiv SPI are nevoie de o linie SS unică înapoi la Arduino;
  • SCK – ceas Serial.

în cadrul acestor tutoriale considerăm că placa Arduino este stăpânul, iar dispozitivele SPI sunt sclavi. Pe plăcile noastre Arduino Uno și compatibile, pinii utilizați sunt:

  • SS – digital 10. Puteți utiliza alte pini digitale, dar 10 este, în general, implicit, deoarece este alături de alte pini SPI;
  • MOSI-digital 11;
  • MISO-digital 12;
  • SCK-digital 13;

Arduino Mega users-MISO este 50, MOSI este 51, SCK este 52 și SS este de obicei 53. Dacă utilizați un Arduino Leonardo, pinii SPI sunt pe pinii antetului ICSP. Vezi AICI pentru mai multe informații. Puteți controla unul sau mai multe dispozitive cu magistrala SPI. De exemplu, pentru un dispozitiv cablajul ar fi:

sspiss1

datele se deplasează înainte și înapoi de-a lungul liniilor MOSI și MISO dintre Arduino și dispozitivul SPI. Acest lucru se poate întâmpla numai atunci când linia SS este setată la scăzut. Cu alte cuvinte, pentru a comunica cu un anumit dispozitiv SPI din autobuz, setăm linia SS la acel dispozitiv la scăzut, apoi comunicăm cu acesta, apoi setăm linia înapoi la mare. Dacă avem două sau mai multe dispozitive SPI pe magistrală, cablajul ar semăna cu următoarele:

sspiss2

observați cum există două linii SS – avem nevoie de una pentru fiecare dispozitiv SPI din magistrală. Puteți utiliza orice pin de ieșire digitală gratuit pe Arduino ca linie SS. Nu uitați să aveți toate liniile SS ridicate, cu excepția liniei conectate la dispozitivul SPI pe care doriți să îl utilizați în acel moment.

datele sunt trimise la dispozitivul SPI sub formă de octeți. Ar trebui să știți până acum că opt biți fac un octet, reprezentând astfel un număr binar cu o valoare cuprinsă între zero și 255.

când comunicăm cu dispozitivele noastre SPI, trebuie să știm în ce mod dispozitivul se ocupă mai întâi de date – MSB sau LSB. MSB (cel mai semnificativ bit) este partea stângă a numărului binar, iar LSB (cel mai puțin semnificativ bit) este partea dreaptă a numărului. Aceasta este:

binnum

în afară de trimiterea valorilor numerice de-a lungul magistralei SPI, numerele binare pot reprezenta și comenzi. Puteți reprezenta opt setări on / off folosind un octet de date, astfel încât parametrii unui dispozitiv poate fi setat prin trimiterea unui octet de date. Acești parametri vor varia în funcție de fiecare dispozitiv și ar trebui să fie ilustrați în fișa tehnică a dispozitivului respectiv. De exemplu, un potențiometru digital IC cu șase poturi:

sdata1

Acest dispozitiv necesită doi octeți de date. Octetul ADDR indică dispozitivului care dintre cele șase potențiometre trebuie controlate (numerotate de la 0 la 5), iar octetul de date este valoarea potențiometrului (0~255). Putem folosi numere întregi pentru a reprezenta aceste două valori. De exemplu, pentru a seta potențiometrul numărul doi la 125, am trimite 2 apoi 125 dispozitivului.

cum trimitem date către dispozitivele SPI în schițele noastre?

În primul rând, trebuie să folosim biblioteca SPI. Este inclus în instalarea implicită Arduino IDE, așa că puneți următoarele la începutul schiței dvs.:

#include "SPI.h"

în continuare, în void.setup () declarați ce pin (e) vor fi utilizate pentru SS și setați-le ca ieșire. De exemplu,

pinMode(ss, OUTPUT);

unde ss a fost declarat anterior ca un număr întreg de valoare zece. Acum, pentru a activa magistrala SPI:

SPI.begin();

și în final trebuie să spunem schiței în ce mod să trimitem date, MSB sau LSB mai întâi folosind

SPI.setBitOrder(MSBFIRST);

sau

SPI.setBitOrder(LSBFIRST);

când este timpul să trimitem date în jos autobuzul SPI la dispozitivul nostru, trei lucruri trebuie să se întâmple. Mai întâi, setați pinul digital cu SS la scăzut:

digitalWrite(SS, LOW);

apoi trimiteți datele în octeți, câte un octet pe rând folosind:

SPI.transfer(value);

valoarea poate fi un număr întreg/octet între zero și 255. În cele din urmă, când ați terminat trimiterea datelor pe dispozitivul dvs., încheiați transmisia setând SS high:

digitalWrite(ss, HIGH);

trimiterea datelor este destul de simplă. În general, cea mai dificilă parte pentru oameni este interpretarea Fișei Tehnice a dispozitivului pentru a înțelege modul în care comenzile și datele trebuie structurate pentru transmisie. Dar, cu unele practici, aceste mici obstacole pot fi depășite.

acum pentru câteva exemple practice!

timp pentru a ajunge pe autobuz SPI și de a controla unele dispozitive. Urmând exemplele de mai jos, ar trebui să obțineți o înțelegere practică a modului în care magistrala și dispozitivele SPI pot fi utilizate cu plăcile noastre Arduino.

exemplu MCP4162

primul nostru exemplu va folosi o parte simplă, dar interesantă – un potențiometru digital (am folosit și unul în tutorialul I2C). De data aceasta avem un microcip MCP4162-seria 10K reostat:

digipotss

aici este fișa de date pentru examinare atentă. Pentru a – l controla, trebuie să trimitem doi octeți de date-primul octet este octetul de control și, din fericire, pentru acest exemplu este întotdeauna zero (deoarece adresa pentru valoarea ștergătorului este 00h ). Al doilea octet este valoarea pentru a seta ștergătorul, care controlează rezistența. Deci, pentru a seta ștergătorul trebuie să facem trei lucruri în schița noastră…

Mai întâi, setați linia SS (slave select) la low:

digitalWrite(10, LOW);

apoi trimiteți cele două bye-uri de date:

SPI.transfer(0); // command byteSPI.transfer(value); // wiper value

setați în cele din urmă linia SS la high:

digitalWrite(10, HIGH);

ușor de făcut. Conexiunea la placa noastră Arduino este foarte simplă – luați în considerare pinout-ul MCP4162:

mcp4162pinout

Vdd se conectează la 5V, VSS la GND, CS la digital 10, SCK la digital 13, SDI la digital 11 și SDO la Digital 12. Acum să trecem prin valorile disponibile ale MCP4162 în următoarea schiță:

/* SPI bus demo using a Microchip MCP4162 digital potentiometer */#include "SPI.h" // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=200; // used for various delaysvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our MCP4162 requires data to be sent MSB (most significant byte) first}void setValue(int value){ digitalWrite(ss, LOW); SPI.transfer(0); // send command byte SPI.transfer(value); // send value (0~255) digitalWrite(ss, HIGH);}void loop(){ for (int a=0; a<256; a++) { setValue(a); delay(del); } for (int a=255; a>=0; --a) { setValue(a); delay(del); }}

acum pentru a vedea rezultatele schiței. În următorul videoclip, a alergăm prin intervalul de rezistență și măsurăm valoarea reostatului cu un multimetru:

înainte de a merge mai departe, dacă potențiometrele digitale sunt noi pentru dvs., luați în considerare citirea acestui scurt ghid scris de Microchip despre diferențele dintre potențiometrele mecanice și digitale.

Un alt exemplu:

în acest exemplu, vom folosi dispozitivele analogice ad5204 potențiometru digital cu patru canale (fișa tehnică.pdf). Conține patru potențiometre liniare de 10K ohm și fiecare potențiometru este reglabil la una din cele 256 de poziții.

setările sunt volatile, ceea ce înseamnă că nu sunt memorate atunci când alimentarea este oprită. Prin urmare, atunci când puterea este aplicată potențiometre sunt toate pre setat la mijlocul scalei. Exemplul nostru este exemplul de montare pe suprafață SOIC-24, însă este fabricat și în format DIP.

ad5204ss

pentru a face viața mai ușoară, poate fi sudat pe o placă SOIC breakout care o convertește într-un pachet de găuri:

ad5204boardss1

În acest exemplu, vom controla luminozitatea a patru LED-uri. Cablarea este foarte simplă. Pinouts sunt în fișa de date.

ex34p2schematic1

și schița:

#include <SPI.h> // necessary libraryint ss=10; // using digital pin 10 for SPI slave selectint del=5; // used for fading delayvoid setup(){ pinMode(ss, OUTPUT); // we use this for SS pin SPI.begin(); // wake up the SPI bus. SPI.setBitOrder(MSBFIRST); // our AD5204 requires data to be sent MSB (most significant byte) first. See data sheet page 5 allOff(); // we do this as pot memories are volatile}void allOff()// sets all potentiometers to minimum value{ for (int z=0; z<4; z++) { setPot(z,0); }}void allOn()// sets all potentiometers to maximum value{ for (int z=0; z<4; z++) { setPot(z,255); }}void setPot(int pot, int level)// sets potentiometer 'pot' to level 'level'{ digitalWrite(ss, LOW); SPI.transfer(pot); SPI.transfer(level); digitalWrite(ss, HIGH);}void blinkAll(int count){ for (int z=0; zvoid indFade(){ for (int a=0; a<4; a++) { for (int l=0; l<255; l++) { setPot(a,l); delay(del); } for (int l=255; l>=0; --l) { setPot(a,l); delay(del); } }}void allFade(int count){ for (int a=0; a<count; a++)="" {="" for="" (int="" l="0;" l<255;="" l++)="" setpot(0,l);="" setpot(1,l);="" setpot(2,l);="" setpot(3,l);="" delay(del);="" }="">=0; --l) { setPot(0,l); setPot(1,l); setPot(2,l); setPot(3,l); delay(del); } }}void loop(){ blinkAll(3); delay(1000); indFade(); allFade(3);}

funcțiile allOff() și allOn() sunt folosite pentru a seta potențiometrele la minim și respectiv maxim. Folosim allOff () la începutul schiței pentru a opri LED-urile. Acest lucru este necesar, deoarece la pornire ștergătoarele sunt în general setate la jumătatea drumului.

în plus, le folosim în funcția blinkAll() pentru a … clipi LED-urile. Funcția setPot () acceptă un număr de ștergător (0~3) și o valoare pentru a seta acel ștergător (0~255). În cele din urmă funcția indFade() face o treabă bună de decolorare a fiecărui LED pornit și oprit în ordine – provocând un efect foarte similar cu modularea lățimii pulsului.

în cele din urmă, aici este în acțiune:

deci, nu – l ai-sperăm că o introducere ușor de înțeles în lumea de autobuz SPI și modul de a controla dispozitivele în cadrul. Ca întotdeauna, acum depinde de tine și de imaginația ta să găsești ceva de controlat sau să te ridici la alte shenanigane. În următorul articol SPI ne vom uita la citirea și scrierea datelor prin magistrala SPI.

acest post adus la tine de pmdway.com-totul pentru factorii de decizie și entuziaști electronice, cu livrare gratuită în întreaga lume.

pentru a fi la curent cu mesajele noi la tronixstuff.com, vă rugăm să vă abonați la lista de corespondență din caseta din dreapta sau să ne urmați pe twitter @tronixstuff.

vă rugăm să împărtășiți cu alții:

Print

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *